commit 970fb1152aaff6d740c9eee4ca5fbeba48ab0926 Author: pengsz Date: Thu Dec 4 10:48:35 2025 +0800 feat: correct initial code diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d03d06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +.idea +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### log ### +yzt_log + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/fightwine-admin/pom.xml b/fightwine-admin/pom.xml new file mode 100644 index 0000000..d5e0a27 --- /dev/null +++ b/fightwine-admin/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + com.yzt.fightwine + yzt-fightwine + 1.0-SNAPSHOT + + + fightwine-admin + jar + + + 21 + 21 + UTF-8 + + + + + com.yzt.fightwine + fightwine-service + 1.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-quartz + + + + + com.github.oshi + oshi-core + 5.8.6 + + + net.java.dev.jna + jna + 5.13.0 + + + net.java.dev.jna + jna-platform + 5.13.0 + + + + + org.projectlombok + lombok + + + + + + fightwine-admin + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.13 + + + + repackage + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + true + + woff + woff2 + eot + ttf + svg + + + + + + + + + + + + + + + + + + + + src/main/resources + true + + + + + + + + + src/main/java + + **/*.xml + + + + + true + src/main/resources + + **/*.woff + **/*.ttf + **/*.eot + **/*.svg + + + + + \ No newline at end of file diff --git a/fightwine-admin/src/main/java/com/yzt/admin/YztAdminApplication.java b/fightwine-admin/src/main/java/com/yzt/admin/YztAdminApplication.java new file mode 100644 index 0000000..dedca10 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/YztAdminApplication.java @@ -0,0 +1,30 @@ +package com.yzt.admin; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * 程序主入口 + * + */ +@EnableAsync //开启异步调用 +@EnableSwagger2 +@Configuration +@EnableTransactionManagement +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //去掉数据源 +@ComponentScan(basePackages = {"com.yzt"}) +@MapperScan(basePackages = {"com.yzt.**.mapper"}) +public class YztAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(YztAdminApplication.class, args); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/CorsConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/CorsConfig.java new file mode 100644 index 0000000..2bdc6b3 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/CorsConfig.java @@ -0,0 +1,28 @@ +package com.yzt.admin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** 跨域配置 + * fw_ + */ +@Configuration +public class CorsConfig{ + private CorsConfiguration buildConfig() { + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); //允许任何域名 + corsConfiguration.addAllowedHeader("*"); //允许任何头 + corsConfiguration.addAllowedMethod("*"); //允许任何方法 + return corsConfiguration; + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", buildConfig()); //注册 + return new CorsFilter(source); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/DruidConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/DruidConfig.java new file mode 100644 index 0000000..69a5da7 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/DruidConfig.java @@ -0,0 +1,49 @@ +package com.yzt.admin.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * Druid数据源配置 + */ +@Configuration +public class DruidConfig { + + @Bean + public ServletRegistrationBean druidServlet() { // 主要实现WEB监控的配置处理 + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); // 进行druid监控的配置处理操作 +// servletRegistrationBean.addInitParameter("allow", +// "127.0.0.1,192.168.1.159"); // 白名单 +// servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名单 + servletRegistrationBean.addInitParameter("loginUsername", "kf"); // 用户名 + servletRegistrationBean.addInitParameter("loginPassword", "654321"); // 密码 + servletRegistrationBean.addInitParameter("resetEnable", "true"); // 是否可以重置数据源 + return servletRegistrationBean; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + + filterRegistrationBean.addUrlPatterns("/*"); // 所有请求进行监控处理 + //不必监控的请求 + filterRegistrationBean.addInitParameter("exclusions", "*.html,*.png,*.ico,*.js,*.gif,*.jpg,*.css,/druid/*"); + return filterRegistrationBean; + } + + @Bean("dataSource") + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource druidDataSource() { + return new DruidDataSource(); + } +} + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/JacksonConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/JacksonConfig.java new file mode 100644 index 0000000..f884ad4 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/JacksonConfig.java @@ -0,0 +1,28 @@ +package com.yzt.admin.config; + +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.math.BigDecimal; + +/** + * Jackjson配置组件 + * + */ +@Configuration +public class JacksonConfig { + + /** + * Jackson全局转化BigDecimal类型为String,解决jackson序列化时BigDecimal类型缺失精度问题 + * + * @return Jackson2ObjectMapperBuilderCustomizer 注入的对象 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(BigDecimal.class, ToStringSerializer.instance); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/RestTemplateConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/RestTemplateConfig.java new file mode 100644 index 0000000..7b0b759 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/RestTemplateConfig.java @@ -0,0 +1,47 @@ +package com.yzt.admin.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * RestTemplate配置组件 + * + */ +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + RestTemplate restTemplate = new RestTemplate(factory); + restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter()); + return restTemplate; + } + + @Bean + public ClientHttpRequestFactory httpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(10000);//ms + factory.setConnectTimeout(15000);//ms + return factory; + } + + //解决微信返回json Content-Type 值却是 text/plain 的问题 + public class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { + public WxMappingJackson2HttpMessageConverter(){ + List mediaTypes = new ArrayList<>(); + mediaTypes.add(MediaType.TEXT_PLAIN); + mediaTypes.add(MediaType.TEXT_HTML); + setSupportedMediaTypes(mediaTypes); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/SchedulerConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/SchedulerConfig.java new file mode 100644 index 0000000..e45c4f8 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/SchedulerConfig.java @@ -0,0 +1,28 @@ +package com.yzt.admin.config; + +import lombok.Data; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +/** + * Spring 定时任务配置 + * fw_ + */ +@Data +@Configuration +public class SchedulerConfig implements SchedulingConfigurer { + private final int poolSize = 30; + + @Override + public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + + threadPoolTaskScheduler.setPoolSize(getPoolSize()); + threadPoolTaskScheduler.setThreadNamePrefix("yzt-scheduled-task-pool-"); + threadPoolTaskScheduler.initialize(); + + scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/SwaggerConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/SwaggerConfig.java new file mode 100644 index 0000000..22a42e3 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/SwaggerConfig.java @@ -0,0 +1,124 @@ +package com.yzt.admin.config; + +import com.google.common.base.Predicate; +import com.yzt.common.constants.Constants; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +import static com.google.common.collect.Lists.newArrayList; + +/** + * Swagger配置组件 + * + */ +@Configuration +@EnableSwagger2 +@ConfigurationProperties(prefix = "api.doc") +public class SwaggerConfig{ + + //是否开启swagger,正式环境一般是需要关闭的,可根据springboot的多环境配置进行设置 + Boolean swaggerEnabled = true; + + @Value("${server.port}") + private String port; + + @Value("${yzt.domain}") + private String domain; + + @Bean("admin") + public Docket createRestApis() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("admin") + .host(domain) + .apiInfo(apiInfo()) + // 是否开启 + .enable(swaggerEnabled) + .select() + // 扫描的路径包 + .apis(RequestHandlerSelectors.basePackage("com.yzt.admin")) + // 指定路径处理PathSelectors.any()代表所有的路径 + .paths(adminPathsAnt()) + .build() + .securitySchemes(security()) + .securityContexts(securityContexts()) +// .globalOperationParameters(pars) // 针对单个url的验证 如果需要的话 + .pathMapping("/"); + } + + @Bean("public") + public Docket create2RestApis() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("public") + .host(domain) + .apiInfo(apiInfo()) + // 是否开启 + .enable(swaggerEnabled) + .select() + // 扫描的路径包 + .apis(RequestHandlerSelectors.basePackage("com.yzt.admin")) + // 指定路径处理PathSelectors.any()代表所有的路径 + .paths(publicPathsAnt()) //只监听 + .build() + .securitySchemes(security()) + .securityContexts(securityContexts()) +// .globalOperationParameters(pars) // 针对单个url的验证 如果需要的话 + .pathMapping("/"); + } + + private Predicate adminPathsAnt() { + return PathSelectors.ant("/api/admin/**"); + } + + private Predicate publicPathsAnt() { + return PathSelectors.ant("/api/public/**"); + } + + private List security() { + return newArrayList( + new ApiKey(Constants.HEADER_AUTHORIZATION_KEY, Constants.HEADER_AUTHORIZATION_KEY, "header") + ); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Yzt Java") + .description("Yzt") + .termsOfServiceUrl("http://host:port") + .version("1.0.0").build(); + } + + + private List securityContexts() { + List res = new ArrayList<>(); + res.add(SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("/.*")) + .build()); + return res; + } + + private List defaultAuth() { + List res = new ArrayList<>(); + AuthorizationScope authorizationScope = new AuthorizationScope("global", Constants.HEADER_AUTHORIZATION_KEY); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + res.add(new SecurityReference(Constants.HEADER_AUTHORIZATION_KEY, authorizationScopes)); + return res; + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/TaskExecutorConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/TaskExecutorConfig.java new file mode 100644 index 0000000..1139deb --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/TaskExecutorConfig.java @@ -0,0 +1,97 @@ +package com.yzt.admin.config; + +import lombok.Data; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * Task类的线程配置 + * + */ +@Data +@Configuration +public class TaskExecutorConfig { + + //普通模式 + private final int taskCorePoolSize = 20; //核心线程池数量 + private final int taskMaxPoolSize = 100; //最大线程 + private final int taskQueueCapacity = 200; //缓存队列条数 + private final int taskKeepAliveSecond = 10; //允许的空闲时间 + private final String taskNamePrefix = "task-executor-"; //线程名称前缀 + + //发布订阅模式 +// private final int listenerCorePoolSize = 3; +// private final int listenerMaxPoolSize = 20; +// private final int listenerQueueCapacity = 200; +// private final int listenerKeepAliveSecond = 10; +// private final String listenerNamePrefix = "listener-executor-"; + + //普通模式 + @Bean("taskExecutor") + public ThreadPoolTaskExecutor taskExecutor(){ + return initTaskExecutor( + getTaskCorePoolSize(), + getTaskMaxPoolSize(), + getTaskQueueCapacity(), + getTaskKeepAliveSecond(), + getTaskNamePrefix() + ); + } + +// //针对发布订阅(pub listener) 的线程池 +// @Bean("listenerTaskExecutor") +// public ThreadPoolTaskExecutor listenerTaskExecutor(){ +// return initTaskExecutor(getListenerCorePoolSize(), getListenerMaxPoolSize(), +// getListenerQueueCapacity(), getListenerKeepAliveSecond(), getListenerNamePrefix()); +// } + + /** + * + * 初始化TaskExecutor + * @param corePoolSize int 默认线程数 + * @param maxPoolSize int 最大线程数 + * @param queueCapacity int 缓冲队列长度 + * @param keepAliveSecond int 允许空闲时间 + * @param namePrefix String 名称的前缀 + * + * @return ThreadPoolTaskExecutor + */ + private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, + int queueCapacity, int keepAliveSecond, String namePrefix){ + //callrunspolicy:由调度线程(提交任务的线程)处理该任务CallerRunsPolicy + return initTaskExecutor(corePoolSize, maxPoolSize, queueCapacity, keepAliveSecond, namePrefix, + new ThreadPoolExecutor.CallerRunsPolicy()); + } + + /** + * 初始化TaskExecutor + * @param corePoolSize int 默认线程数 + * @param maxPoolSize int 最大线程数 + * @param queueCapacity int 缓冲队列长度 + * @param keepAliveSecond int 允许空闲时间 + * @param namePrefix String 名称的前缀 + * @param rejectedExecutionHandler 线程池满的时候如何处理 + * @return ThreadPoolTaskExecutor + */ + private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, + int queueCapacity, int keepAliveSecond, String namePrefix, + RejectedExecutionHandler rejectedExecutionHandler){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize);//核心线程数(默认线程数) + executor.setMaxPoolSize(maxPoolSize);//最大线程数 + executor.setQueueCapacity(queueCapacity);//缓冲队列数 + executor.setKeepAliveSeconds(keepAliveSecond);//允许线程空闲时间(单位默认为秒) + executor.setThreadNamePrefix(namePrefix);//线程名前缀 + + //线程池对拒绝任务的处理策略, + executor.setRejectedExecutionHandler(rejectedExecutionHandler); + + //初始化 + executor.initialize(); + return executor; + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/WebConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/WebConfig.java new file mode 100644 index 0000000..2c1c57f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/WebConfig.java @@ -0,0 +1,109 @@ +package com.yzt.admin.config; + +import com.yzt.admin.filter.ResponseFilter; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.interceptor.SwaggerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.handler.MappedInterceptor; + +/** + * token验证拦截器 + * + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + + // 这里使用一个Bean为的是可以在拦截器中自由注入,也可以在拦截器中使用SpringUtil.getBean 获取 + // 但是觉得这样更优雅 + + @Autowired + YztConfig yztConfig; + + @Bean + public ResponseFilter responseFilter(){ return new ResponseFilter(); } + + @Value("${swagger.basic.username}") + private String username; + @Value("${swagger.basic.password}") + private String password; + @Value("${swagger.basic.check}") + private Boolean check; + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + //添加token拦截器 + //addPathPatterns添加需要拦截的命名空间; + //excludePathPatterns添加排除拦截命名空间 + + +// //后台token拦截 +// registry.addInterceptor(adminTokenInterceptor()). +// addPathPatterns("/api/admin/**"). +// excludePathPatterns("/api/admin/validate/**"). +// excludePathPatterns("/api/admin/login"). +// excludePathPatterns("/api/admin/logout"). +// excludePathPatterns("/api/admin/getLoginPic"). +// excludePathPatterns("/api/admin/wechat/config"). +// excludePathPatterns("/api/admin/authorize/login"). +// excludePathPatterns("/api/admin/payment/callback/**"). +//// excludePathPatterns("/api/admin/system/role/menu"). +// excludePathPatterns("/api/admin/system/role/info"). +// excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); +// +// //后台权限规则 +// registry.addInterceptor(adminAuthInterceptor()). +// addPathPatterns("/api/admin/**"). +// excludePathPatterns("/api/admin/validate/**"). +// excludePathPatterns("/api/admin/login"). +// excludePathPatterns("/api/admin/logout"). +// excludePathPatterns("/api/admin/getLoginPic"). +// excludePathPatterns("/api/admin/payment/callback/**"). +// excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); + + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + + /** 本地文件上传路径 */ + registry.addResourceHandler(UploadConstants.UPLOAD_FILE_KEYWORD + "/**") + .addResourceLocations("file:" + yztConfig.getImagePath() + "/" + UploadConstants.UPLOAD_FILE_KEYWORD + "/"); + + registry.addResourceHandler(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD + "/**") + .addResourceLocations("file:" +yztConfig.getImagePath() + "/" + UploadConstants.UPLOAD_AFTER_FILE_KEYWORD + "/" ); + + } + + @Bean + public FilterRegistrationBean filterRegister() + { + //注册过滤器 + FilterRegistrationBean registration = new FilterRegistrationBean(responseFilter()); + // 仅仅api前缀的请求才会拦截 + registration.addUrlPatterns("/api/*"); + return registration; + } + + /* 必须在此处配置拦截器,要不然拦不到swagger的静态资源 */ + @Bean + @ConditionalOnProperty(name = "swagger.basic.enable", havingValue = "true") + public MappedInterceptor getMappedInterceptor() { + return new MappedInterceptor(new String[]{"/doc.html", "/webjars/**"}, new SwaggerInterceptor(username, password, check)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/config/WebSecurityConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/config/WebSecurityConfig.java new file mode 100644 index 0000000..b30c02d --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/config/WebSecurityConfig.java @@ -0,0 +1,153 @@ +package com.yzt.admin.config; + +import com.yzt.admin.filter.JwtAuthenticationTokenFilter; +import com.yzt.admin.manager.AuthenticationEntryPointImpl; +import com.yzt.admin.manager.CustomAccessDeniedHandler; +import com.yzt.admin.manager.CustomAuthenticationProvider; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.service.service.impl.UserDetailServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; + +/** + * Security配置 + * + */ +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * token认证过滤器 + */ + @Bean + public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() { + return new JwtAuthenticationTokenFilter(); + } + + /** + * 认证失败处理类 + */ + @Bean + public AuthenticationEntryPointImpl unauthorizedHandler() { + return new AuthenticationEntryPointImpl(); + } + + /** + * 鉴权失败处理类 + */ + @Bean + public CustomAccessDeniedHandler accessDeniedHandler() { + return new CustomAccessDeniedHandler(); + } + + /** + * 这里将Spring Security自带的authenticationManager声明成Bean,声明它的作用是用它帮我们进行认证操作, + * 调用这个Bean的authenticate方法会由Spring Security自动帮我们做认证。 + */ +// @Bean +// public AuthenticationManager authenticationManager() throws Exception { +// return new CusAuthenticationManager(customAuthenticationProvider); +// } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(new CustomAuthenticationProvider(new UserDetailServiceImpl())); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + + // CRSF禁用,因为不使用session + http.cors().and().csrf().disable() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler()) + .accessDeniedHandler(accessDeniedHandler()).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 跨域预检请求 +// .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() + // 对于登录login 验证码captchaImage 和其他放行的目录 允许匿名访问"/citylife/front/**" + .antMatchers("/api/admin/login", "/api/admin/validate/code/get").permitAll() + .antMatchers("/api/admin/getLoginPic").permitAll() + .antMatchers("/api/admin/login/account/detection").permitAll() + .antMatchers("/api/admin/validate/code/getcaptchaconfig").permitAll() + // 放行资源路径 + .antMatchers("/"+ UploadConstants.UPLOAD_FILE_KEYWORD +"/**").permitAll() + .antMatchers("/"+ UploadConstants.DOWNLOAD_FILE_KEYWORD +"/**").permitAll() + .antMatchers("/"+ UploadConstants.UPLOAD_AFTER_FILE_KEYWORD +"/**").permitAll() + // 放行图片、文件上传 + .antMatchers("/api/admin/upload/image").permitAll() + .antMatchers("/api/admin/upload/file").permitAll() +// .antMatchers("/wx/user/*/login","/citylife/nocheck/**").anonymous() + .antMatchers( + HttpMethod.GET, + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js", + "/**/*.png" + ).permitAll() + .antMatchers("/profile/**").anonymous() + .antMatchers("/common/download**").anonymous() + .antMatchers("/common/download/resource**").anonymous() + .antMatchers("/doc.html").permitAll() + .antMatchers("/swagger-resources/**").permitAll() + .antMatchers("/webjars/**").permitAll() + .antMatchers("/v2/**").permitAll() + .antMatchers("/swagger-ui.html/**").permitAll() + .antMatchers("/*/api-docs").anonymous() + .antMatchers("/druid/**").anonymous() + .antMatchers("/captcha/get", "/captcha/check").anonymous() + .antMatchers("/api/admin/payment/callback/**").anonymous() + .antMatchers("/api/public/**").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable();// 防止iframe 造成跨域 +// http.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + // 开启登录认证流程过滤器 + http.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class); + // 添加CORS filter + http.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + http.addFilterBefore(corsFilter, LogoutFilter.class); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityEnrollController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityEnrollController.java new file mode 100644 index 0000000..a7de157 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityEnrollController.java @@ -0,0 +1,66 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ActivityEnrollSearchRequest; +import com.yzt.common.request.EnrollSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityEnrollResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.VirtualRemarkVo; +import com.yzt.service.service.StoreOrderInfoService; +import com.yzt.service.service.StoreProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.Min; + +/** + * @Author: pengsz + * @Date: 2025/12/02 + * @Description: + */ +@RestController +@RequestMapping("/api/admin/activityenroll") +@Api(tags = "活动报名") //配合swagger使用 +@Slf4j +public class ActivityEnrollController { + @Autowired + StoreProductService storeProductService; + + @Autowired + StoreOrderInfoService storeOrderInfoService; + /** + * 分页显示 + * + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "活动报名分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated ActivityEnrollSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage activityEnrollCommonPage = CommonPage.restPage(storeProductService.getActivityList(request, pageParamRequest)); + return CommonResult.success(activityEnrollCommonPage); + } + + /** + * 分页显示 + * + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "客户报名分页列表") //配合swagger使用 + @RequestMapping(value = "/customers", method = RequestMethod.GET) + public CommonResult> getEnrollmentListByActivity(@Validated EnrollSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage enrollCommonPage = CommonPage.restPage(storeOrderInfoService.getEnrollmentListByActivity(request.getId(), pageParamRequest)); + return CommonResult.success(enrollCommonPage); + } + + + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityStyleController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityStyleController.java new file mode 100644 index 0000000..78e403c --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ActivityStyleController.java @@ -0,0 +1,132 @@ +package com.yzt.admin.controller; + +import cn.hutool.core.date.DateUtil; +import com.yzt.common.constants.DateConstants; +import com.yzt.common.model.acticitystyle.ActivityStyle; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ActivityStyleRequest; +import com.yzt.common.request.ActivityStyleSearchRequest; +import com.yzt.common.request.ActivityStyleUpdateStatusRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityStyleResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.ActivityStyleService; +import com.yzt.service.service.SystemAttachmentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 活动样式 前端控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/admin/activitystyle") +@Api(tags = "活动样式") //配合swagger使用 +public class ActivityStyleController { + + @Autowired + private ActivityStyleService activityStyleService; + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 分页显示 + * + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:activitystyle:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated ActivityStyleSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage activityStyleCommonPage = CommonPage.restPage(activityStyleService.getList(request, pageParamRequest)); + return CommonResult.success(activityStyleCommonPage); + } + + /** + * 新增 + * + * @param activityStyleRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:activitystyle:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated ActivityStyleRequest activityStyleRequest) { + ActivityStyle activityStyle = new ActivityStyle(); + BeanUtils.copyProperties(activityStyleRequest, activityStyle); + activityStyle.setStarttime(YztDateUtil.strToDate(activityStyleRequest.getStarttime(), DateConstants.DATE_FORMAT)); + activityStyle.setEndtime(YztDateUtil.strToDate(activityStyleRequest.getEndtime(), DateConstants.DATE_FORMAT)); + activityStyle.setStyle(systemAttachmentService.clearPrefix(activityStyle.getStyle())); + if (activityStyleService.save(activityStyle)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除 + * + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:activitystyle:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (activityStyleService.removeById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改 + * + * @param activityStyleRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:activitystyle:edite')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated ActivityStyleRequest activityStyleRequest) { + ActivityStyle activityStyle = new ActivityStyle(); + BeanUtils.copyProperties(activityStyleRequest, activityStyle); + activityStyle.setId(activityStyleRequest.getId()); + activityStyle.setStyle(systemAttachmentService.clearPrefix(activityStyle.getStyle())); + activityStyle.setStarttime(YztDateUtil.strToDate(activityStyleRequest.getStarttime(), DateConstants.DATE_FORMAT)); + activityStyle.setEndtime(YztDateUtil.strToDate(activityStyleRequest.getEndtime(), DateConstants.DATE_FORMAT)); + activityStyle.setUpdatetime(DateUtil.date()); + if (activityStyleService.updateById(activityStyle)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 更新状态 + */ + @PreAuthorize("hasAuthority('admin:activitystyle:updatestatus')") + @ApiOperation(value = "更新状态") + @RequestMapping(value = "/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestBody @Validated ActivityStyleUpdateStatusRequest activityStyleUpdateStatusRequest) { + boolean result = activityStyleService.updateStatus(activityStyleUpdateStatusRequest.getId(), activityStyleUpdateStatusRequest.getStatus()); + if (result) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/AdminLoginController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/AdminLoginController.java new file mode 100644 index 0000000..c34408a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/AdminLoginController.java @@ -0,0 +1,107 @@ +package com.yzt.admin.controller; + +import com.yzt.admin.service.AdminLoginService; +import com.yzt.common.request.AdminAccountDetectionRequest; +import com.yzt.common.request.LoginAdminUpdatePasswordRequest; +import com.yzt.common.request.LoginAdminUpdateRequest; +import com.yzt.common.request.SystemAdminLoginRequest; +import com.yzt.common.response.MenusResponse; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.response.SystemLoginResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * 管理端登录服务 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin") +@Api(tags = "管理端登录服务") +public class AdminLoginController { + + @Autowired + private AdminLoginService adminLoginService; + + @ApiOperation(value="PC登录") + @PostMapping(value = "/login", produces = "application/json") + public CommonResult SystemAdminLogin(@RequestBody @Validated SystemAdminLoginRequest systemAdminLoginRequest, HttpServletRequest request) { + String ip = YztUtil.getClientIp(request); + SystemLoginResponse systemAdminResponse = adminLoginService.login(systemAdminLoginRequest, ip); + return CommonResult.success(systemAdminResponse); + } + + @PreAuthorize("hasAuthority('admin:logout')") + @ApiOperation(value="PC登出") + @GetMapping(value = "/logout") + public CommonResult SystemAdminLogout() { + adminLoginService.logout(); + return CommonResult.success(); + } + + @PreAuthorize("hasAuthority('admin:info')") + @ApiOperation(value="获取用户详情") + @GetMapping(value = "/getAdminInfoByToken") + public CommonResult getAdminInfo() { + return CommonResult.success(adminLoginService.getInfoByToken()); + } + + /** + * 获取登录页图片 + * @return Map + */ + @ApiOperation(value = "获取登录页图片") + @RequestMapping(value = "/getLoginPic", method = RequestMethod.GET) + public CommonResult> getLoginPic() { + return CommonResult.success(adminLoginService.getLoginPic()); + } + + /** + * 获取管理员可访问目录 + */ + @PreAuthorize("hasAuthority('admin:login:menus')") + @ApiOperation(value = "获取管理员可访问目录") + @RequestMapping(value = "/getMenus", method = RequestMethod.GET) + public CommonResult> getMenus() { + return CommonResult.success(adminLoginService.getMenus()); + } + + + @ApiOperation(value="账号登录检测") + @RequestMapping(value = "/login/account/detection", method = RequestMethod.POST) + public CommonResult accountDetection(@RequestBody @Validated AdminAccountDetectionRequest request) { + return CommonResult.success(adminLoginService.accountDetection(request.getAccount())); + } + + @PreAuthorize("hasAuthority('admin:update:name')") + @ApiOperation(value="修改登录用户信息") + @RequestMapping(value = "/login/admin/update", method = RequestMethod.POST) + public CommonResult loginAdminUpdate(@RequestBody @Validated LoginAdminUpdateRequest request) { + if (adminLoginService.loginAdminUpdate(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:update:password')") + @ApiOperation(value="修改登录用户密码") + @RequestMapping(value = "/login/update/password", method = RequestMethod.POST) + public CommonResult loginAdminUpdatePwd(@RequestBody @Validated LoginAdminUpdatePasswordRequest request) { + if (adminLoginService.loginAdminUpdatePwd(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ArticleController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ArticleController.java new file mode 100644 index 0000000..896e660 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ArticleController.java @@ -0,0 +1,110 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.article.Article; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ArticleRequest; +import com.yzt.common.request.ArticleSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.ArticleVo; +import com.yzt.service.service.ArticleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 文章管理表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/article") +@Api(tags = "文章管理") +public class ArticleController { + + @Autowired + private ArticleService articleService; + + /** + * 分页显示文章管理表 + * @param request ArticleSearchRequest 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:article:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParam(name="keywords", value="搜索关键字") + public CommonResult> getList(@Validated ArticleSearchRequest request, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(articleService.getAdminList(request, pageParamRequest))); + } + + /** + * 新增文章管理表 + * @param articleRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:article:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated ArticleRequest articleRequest) { + if (articleService.create(articleRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除文章管理表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:article:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="文章ID") + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (articleService.deleteById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改文章管理表 + * @param id integer id + * @param articleRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:article:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ApiImplicitParam(name="id", value="文章ID") + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated ArticleRequest articleRequest) { + if (articleService.updateArticle(id, articleRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询文章管理表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:article:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="文章ID") + public CommonResult
info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(articleService.getDetail(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/CallbackController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/CallbackController.java new file mode 100644 index 0000000..dda0bae --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/CallbackController.java @@ -0,0 +1,53 @@ +package com.yzt.admin.controller; + +import com.yzt.service.service.CallbackService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 支付回调 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/payment/callback") +@Api(tags = "支付回调") +public class CallbackController { + + @Autowired + private CallbackService callbackService; + + /** + * 微信支付回调 + */ + @ApiOperation(value = "微信支付回调") + @RequestMapping(value = "/wechat", method = RequestMethod.POST) + public String weChat(@RequestBody String request) { + System.out.println("微信支付回调 request ===> " + request); + String response = callbackService.weChat(request); + System.out.println("微信支付回调 response ===> " + response); + return response; + } + + /** + * 微信退款回调 + */ + @ApiOperation(value = "微信退款回调") + @RequestMapping(value = "/wechat/refund", method = RequestMethod.POST) + public String weChatRefund(@RequestBody String request) { + System.out.println("微信退款回调 request ===> " + request); + String response = callbackService.weChatRefund(request); + System.out.println("微信退款回调 response ===> " + response); + return response; + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/CategoryController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/CategoryController.java new file mode 100644 index 0000000..40248d9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/CategoryController.java @@ -0,0 +1,167 @@ +package com.yzt.admin.controller; + +import com.yzt.common.exception.YztException; +import com.yzt.common.model.category.Category; +import com.yzt.common.request.CategoryRequest; +import com.yzt.common.request.CategorySearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.CategoryTreeVo; +import com.yzt.service.service.CategoryService; +import com.yzt.service.service.SystemAttachmentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 分类表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/category") +@Api(tags = "分类服务") +public class CategoryController { + + @Autowired + private CategoryService categoryService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 显示分类表 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:category:list')") + @ApiOperation(value = "分类列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@ModelAttribute CategorySearchRequest request) { + return CommonResult.success(categoryService.getList(request)); + } + + /** + * 新增分类表 + * @param categoryRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:category:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@Validated CategoryRequest categoryRequest) { + if (categoryService.create(categoryRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除分类表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:category:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="分类ID") + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (categoryService.delete(id) > 0) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改分类表 + * @param id integer id + * @param categoryRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:category:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + @ApiImplicitParam(name="id", value="分类ID") + public CommonResult update(@RequestParam Integer id, @ModelAttribute CategoryRequest categoryRequest) { + if (null == id || id <= 0) throw new YztException("id 参数不合法"); + categoryRequest.setExtra(systemAttachmentService.clearPrefix(categoryRequest.getExtra())); + if (categoryService.update(categoryRequest, id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询分类表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:category:info')") + @ApiOperation(value = "分类详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="分类ID") + public CommonResult info(@RequestParam(value = "id") Integer id) { + Category category = categoryService.getById(id); + return CommonResult.success(category); + } + + + /** + * 查询分类表信息 + */ + @PreAuthorize("hasAuthority('admin:category:list:tree')") + @ApiOperation(value = "获取tree结构的列表") + @RequestMapping(value = "/list/tree", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="type", value="类型ID | 类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置", example = "1"), + @ApiImplicitParam(name="status", value="-1=全部,0=未生效,1=已生效", example = "1"), + @ApiImplicitParam(name="name", value="模糊搜索", example = "电视") + }) + public CommonResult> getListTree(@RequestParam(name = "type") Integer type, + @RequestParam(name = "status") Integer status, + @RequestParam(name = "name", required = false) String name) { + List listTree = categoryService.getListTree(type,status,name); + return CommonResult.success(listTree); + } + + /** + * 根据分类id集合获取分类数据 + * @param ids String id集合字符串 + * @since 2020-04-16 + */ + @PreAuthorize("hasAuthority('admin:category:list:ids')") + @ApiOperation(value = "根据id集合获取分类列表") + @RequestMapping(value = "/list/ids", method = RequestMethod.GET) + @ApiImplicitParam(name = "ids", value="分类id集合") + public CommonResult> getByIds(@Validated @RequestParam(name = "ids") String ids) { + return CommonResult.success(categoryService.getByIds(YztUtil.stringToArray(ids))); + } + + /** + * 更改分类状态 + * @param id Integer 分类id + * @since 2020-04-16 + * @return + */ + @PreAuthorize("hasAuthority('admin:category:update:status')") + @ApiOperation(value = "更改分类状态") + @RequestMapping(value = "/updateStatus/{id}", method = RequestMethod.GET) + @ApiImplicitParam(name = "id", value="分类id") + public CommonResult getByIds(@Validated @PathVariable(name = "id") Integer id) { + if (categoryService.updateStatus(id)) { + return CommonResult.success("修改成功"); + } else { + return CommonResult.failed("修改失败"); + } + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/CopyrightController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/CopyrightController.java new file mode 100644 index 0000000..e20ea09 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/CopyrightController.java @@ -0,0 +1,36 @@ +package com.yzt.admin.controller; + +import com.yzt.admin.copyright.CopyrightInfoResponse; +import com.yzt.admin.service.CopyrightService; +import com.yzt.common.result.CommonResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 版权控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/copyright") +@Api(tags = "版权控制器") +public class CopyrightController { + + @Autowired + private CopyrightService copyrightService; + + @PreAuthorize("hasAuthority('admin:copyright:get:info')") + @ApiOperation(value = "获取版权信息") + @RequestMapping(value = "/get/info", method = RequestMethod.GET) + public CommonResult getInfo() { + return CommonResult.success(copyrightService.getInfo()); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ExcelController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ExcelController.java new file mode 100644 index 0000000..e3b6fb2 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ExcelController.java @@ -0,0 +1,104 @@ +package com.yzt.admin.controller; + +import cn.hutool.core.collection.CollUtil; +import com.yzt.common.request.*; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ExcelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.Min; +import java.util.HashMap; + + +/** + * Excel导出 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/export/excel") +@Api(tags = "导出 -- Excel") +public class ExcelController { + + @Autowired + private ExcelService excelService; + + /** + * 商品导出 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:export:excel:product')") + @ApiOperation(value = "产品") + @RequestMapping(value = "/product", method = RequestMethod.GET) + public CommonResult> export(@Validated StoreProductSearchRequest request) { + String fileName = excelService.exportProduct(request); + HashMap map = CollUtil.newHashMap(); + map.put("fileName", fileName); + return CommonResult.success(map); + } + + /** + * 砍价商品导出 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:export:excel:bargain')") + @ApiOperation(value = "砍价商品导出") + @RequestMapping(value = "/bargain/product", method = RequestMethod.GET) + public CommonResult> exportBargainProduct(@Validated StoreBargainSearchRequest request) { + String fileName = excelService.exportBargainProduct(request); + HashMap map = CollUtil.newHashMap(); + map.put("fileName", fileName); + return CommonResult.success(map); + } + + /** + * 拼团商品导出 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:export:excel:combiantion')") + @ApiOperation(value = "拼团商品导出") + @RequestMapping(value = "/combiantion/product", method = RequestMethod.GET) + public CommonResult> exportCombinationProduct(@Validated StoreCombinationSearchRequest request) { + String fileName = excelService.exportCombinationProduct(request); + HashMap map = CollUtil.newHashMap(); + map.put("fileName", fileName); + return CommonResult.success(map); + } + + /** + * 订单导出 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:export:excel:order')") + @ApiOperation(value = "订单导出") + @RequestMapping(value = "/order", method = RequestMethod.GET) + public CommonResult> exportOrder(@Validated StoreOrderSearchRequest request){ + String fileName = excelService.exportOrder(request); + HashMap map = CollUtil.newHashMap(); + map.put("fileName", fileName); + return CommonResult.success(map); + } + + /** + * 活动报名客户列表导出 + * @param request 搜索条件 + */ + @ApiOperation(value = "活动报名客户列表导出") + @RequestMapping(value = "/customer", method = RequestMethod.GET) + public CommonResult> exportCustomer(@Validated EnrollSearchRequest request){ + String fileName = excelService.exportCustomer(request.getId()); + HashMap map = CollUtil.newHashMap(); + map.put("fileName", fileName); + return CommonResult.success(map); + } + +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ExpressController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ExpressController.java new file mode 100644 index 0000000..78e0eb1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ExpressController.java @@ -0,0 +1,140 @@ +package com.yzt.admin.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.model.express.Express; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ExpressSearchRequest; +import com.yzt.common.request.ExpressUpdateRequest; +import com.yzt.common.request.ExpressUpdateShowRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ExpressService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 快递公司表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/express") +@Api(tags = "设置 -- 物流 -- 公司") +public class ExpressController { + + @Autowired + private ExpressService expressService; + + /** + * 分页显示快递公司表 + * @param request ExpressSearchRequest 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:express:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParam(name="keywords", value="搜索关键字") + public CommonResult> getList(@Validated ExpressSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage expressCommonPage = CommonPage.restPage(expressService.getList(request, pageParamRequest)); + return CommonResult.success(expressCommonPage); + } + + /** + * 编辑快递公司 + */ + @PreAuthorize("hasAuthority('admin:express:update')") + @ApiOperation(value = "编辑") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated ExpressUpdateRequest expressRequest) { + if (expressService.updateExpress(expressRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + *修改显示状态 + */ + @PreAuthorize("hasAuthority('admin:express:update:show')") + @ApiOperation(value = "修改显示状态") + @RequestMapping(value = "/update/show", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated ExpressUpdateShowRequest expressRequest) { + if (expressService.updateExpressShow(expressRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 同步物流公司 + */ + @PreAuthorize("hasAuthority('admin:express:sync')") + @ApiOperation(value = "同步物流公司") + @RequestMapping(value = "/sync/express", method = RequestMethod.POST) + public CommonResult syncExpress() { + if (expressService.syncExpress()) { + CommonResult success = CommonResult.success(); + success.setMessage("同步物流公司成功"); + return success; + } + return CommonResult.failed("同步物流公司失败"); + } + + + /** + * 查询快递公司表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:express:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="快递公司ID", required = true) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(expressService.getInfo(id)); + } + + /** + * 查询全部物流公司 + */ + @PreAuthorize("hasAuthority('admin:express:all')") + @ApiOperation(value = "查询全部物流公司") + @RequestMapping(value = "/all", method = RequestMethod.GET) + @ApiImplicitParam(name="type", value="类型:normal-普通,elec-电子面单") + public CommonResult> all(@RequestParam(value = "type") String type) { + return CommonResult.success(expressService.findAll(type)); + } + + /** + * 查询物流公司面单模板 + */ + @PreAuthorize("hasAuthority('admin:express:template')") + @ApiOperation(value = "查询物流公司面单模板") + @RequestMapping(value = "/template", method = RequestMethod.GET) + @ApiImplicitParam(name="com", value="快递公司编号", required = true) + public CommonResult template(@RequestParam(value = "com") String com) { + return CommonResult.success(expressService.template(com)); + } + +// /** +// * 获取电子面单模版 +// */ +// @ApiOperation(value = "查询 电子面单 模版列表") +// @RequestMapping(value = "/templatedianzi", method = RequestMethod.GET) +// @ApiImplicitParam(name="com", value="快递公司编号", required = true) +// public CommonResult templateDZ(@RequestParam(value = "com") String com) { +// return CommonResult.success(expressService.templateFor(com)); +// } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/FundsMonitorController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/FundsMonitorController.java new file mode 100644 index 0000000..fcb7e02 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/FundsMonitorController.java @@ -0,0 +1,102 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.BrokerageRecordRequest; +import com.yzt.common.request.FundsMonitorRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.MonitorResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserFundsMonitorService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 用户提现表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/finance/founds/monitor") +@Api(tags = "财务 -- 资金监控") +public class FundsMonitorController { + + @Autowired + private UserBillService userBillService; + + @Autowired + private UserFundsMonitorService userFundsMonitorService; + + /** + * 分页显示资金监控 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:finance:monitor:list')") + @ApiOperation(value = "资金监控") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated FundsMonitorRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage userExtractCommonPage = CommonPage.restPage(userBillService.fundMonitoring(request, pageParamRequest)); + return CommonResult.success(userExtractCommonPage); + } + + /** + * 佣金记录 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:finance:monitor:brokerage:record')") + @ApiOperation(value = "佣金记录") + @RequestMapping(value = "/brokerage/record", method = RequestMethod.GET) + public CommonResult> brokerageRecord(@Validated BrokerageRecordRequest request, @Validated PageParamRequest pageParamRequest){ + return CommonResult.success(CommonPage.restPage(userFundsMonitorService.getBrokerageRecord(request, pageParamRequest))); + } + + /** + * 佣金收益类型枚举 + */ + @PreAuthorize("hasAuthority('admin:finance:monitor:brokerage:record')") + @ApiOperation(value = "佣金收益类型枚举") + @RequestMapping(value = "/brokerage/linkType/list", method = RequestMethod.GET) + public CommonResult>> getBrokerageLinkTypeList() { + Map saleReward = new HashMap<>(); + saleReward.put("value", "sale_reward"); + saleReward.put("label", "销售奖励"); + + Map queue = new HashMap<>(); + queue.put("value", "queue"); + queue.put("label", "免单奖"); + + Map incubatorAll = new HashMap<>(); + incubatorAll.put("value", "incubator_all"); + incubatorAll.put("label", "孵化奖"); + + Map manageReward = new HashMap<>(); + manageReward.put("value", "manage_reward"); + manageReward.put("label", "管理奖"); + + Map subsidyReward = new HashMap<>(); + subsidyReward.put("value", "subsidy_reward"); + subsidyReward.put("label", "补贴奖励"); + + List> list = Arrays.asList(saleReward, queue, incubatorAll, manageReward, subsidyReward); + return CommonResult.success(list); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/HomeController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/HomeController.java new file mode 100644 index 0000000..348af53 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/HomeController.java @@ -0,0 +1,111 @@ +package com.yzt.admin.controller; + +import com.yzt.common.response.HomeOperatingDataResponse; +import com.yzt.common.response.HomeRateResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.HomeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + + +/** + * 统计 -- 主页 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/statistics/home") +@Api(tags = "统计 -- 主页") +public class HomeController { + + @Autowired + private HomeService homeService; + + @PreAuthorize("hasAuthority('admin:statistics:home:index')") + @ApiOperation(value = "首页数据") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult indexDate() { + return CommonResult.success(homeService.indexDate()); + } + + /** + * 用户曲线图 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:user')") + @ApiOperation(value = "用户曲线图") + @RequestMapping(value = "/chart/user", method = RequestMethod.GET) + public CommonResult> chartUser() { + return CommonResult.success(homeService.chartUser()); + } + + /** + * 用户购买统计 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:user:buy')") + @ApiOperation(value = "用户购买统计") + @RequestMapping(value = "/chart/user/buy", method = RequestMethod.GET) + public CommonResult> chartUserBuy() { + return CommonResult.success(homeService.chartUserBuy()); + } + + /** + * 30天订单量趋势 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:order')") + @ApiOperation(value = "30天订单量趋势") + @RequestMapping(value = "/chart/order", method = RequestMethod.GET) + public CommonResult> chartOrder() { + return CommonResult.success(homeService.chartOrder()); + } + + /** + * 周订单量趋势 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:order:week')") + @ApiOperation(value = "周订单量趋势") + @RequestMapping(value = "/chart/order/week", method = RequestMethod.GET) + public CommonResult> chartOrderInWeek() { + return CommonResult.success(homeService.chartOrderInWeek()); + } + + /** + * 月订单量趋势 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:order:month')") + @ApiOperation(value = "月订单量趋势") + @RequestMapping(value = "/chart/order/month", method = RequestMethod.GET) + public CommonResult> chartOrderInMonth() { + return CommonResult.success(homeService.chartOrderInMonth()); + } + + /** + * 年订单量趋势 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:chart:order:year')") + @ApiOperation(value = "年订单量趋势") + @RequestMapping(value = "/chart/order/year", method = RequestMethod.GET) + public CommonResult> chartOrderInYear() { + return CommonResult.success(homeService.chartOrderInYear()); + } + + /** + * 首页经营数据 + */ + @PreAuthorize("hasAuthority('admin:statistics:home:operating:data')") + @ApiOperation(value = "经营数据") + @RequestMapping(value = "/operating/data", method = RequestMethod.GET) + public CommonResult operatingData() { + return CommonResult.success(homeService.operatingData()); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/OnePassController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/OnePassController.java new file mode 100644 index 0000000..8c2d813 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/OnePassController.java @@ -0,0 +1,68 @@ +package com.yzt.admin.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.request.onepass.OnePassLoginRequest; +import com.yzt.common.request.onepass.OnePassShipmentCancelOrderRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.OnePassService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 一号通控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/pass") +@Api(tags = "一号通服务") +public class OnePassController { + + @Autowired + private OnePassService onePassService; + + + @PreAuthorize("hasAuthority('admin:pass:appsave')") + @ApiOperation(value = "一号通 应用保存") + @RequestMapping(value = "/appsave", method = RequestMethod.POST) + public CommonResult saveOnePassApplication(@Validated @RequestBody OnePassLoginRequest request) { + return CommonResult.success(onePassService.saveOnePassApplicationInfo(request)); + } + + @PreAuthorize("hasAuthority('admin:pass:appget')") + @ApiOperation(value = "一号通 应用详情获取") + @RequestMapping(value = "/appget", method = RequestMethod.GET) + public CommonResult getOnePassApplication() { + return CommonResult.success(onePassService.getOnePassApplicationInfo()); + } + + @PreAuthorize("hasAuthority('admin:pass:shipment:cancel')") + @ApiOperation(value = "一号通 取消商家寄件") + @RequestMapping(value = "/shipment/cancel", method = RequestMethod.POST) + public CommonResult onePassShipmentCancel(OnePassShipmentCancelOrderRequest request) { + return CommonResult.success(onePassService.shipmentCancelOrder(request)); + } + + @PreAuthorize("hasAuthority('admin:pass:shipment:express')") + @ApiOperation(value = "一号通 商家寄件 快递列表") + @RequestMapping(value = "/shipment/express", method = RequestMethod.GET) + public CommonResult onePassShipmentExpress() { + return CommonResult.success(onePassService.shipmentComs()); + } + + @PreAuthorize("hasAuthority('admin:pass:shipment:callback')") + @ApiOperation(value = "一号通 商家寄件 回调地址") + @RequestMapping(value = "/shipment/callback", method = RequestMethod.POST) + public CommonResult onePassShipmentCallBack(String type, String data) { + return CommonResult.success(onePassService.shipmentCallBackMethod(type, data)); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/OrderInvoiceController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/OrderInvoiceController.java new file mode 100644 index 0000000..85fc585 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/OrderInvoiceController.java @@ -0,0 +1,132 @@ +package com.yzt.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yzt.common.constants.InvoiceConstants; +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreOrderInvoiceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 订单发票后台管理控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/admin/order/invoice") +@Api(tags = "后台-订单发票管理") +public class OrderInvoiceController { + + @Autowired + private StoreOrderInvoiceService storeOrderInvoiceService; + + /** + * 分页查询发票列表 + */ + @GetMapping("/list") + @ApiOperation("分页查询发票列表") + public CommonResult> getList( + @ApiParam("订单号") @RequestParam(required = false) String orderId, + @ApiParam("发票抬头类型") @RequestParam(required = false) Integer invoiceType, + @ApiParam("开票状态") @RequestParam(required = false) Integer invoiceStatus, + PageParamRequest pageParamRequest) { + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + if (orderId != null && !orderId.trim().isEmpty()) { + wrapper.like(StoreOrderInvoice::getOrderId, orderId); + } + if (invoiceType != null) { + wrapper.eq(StoreOrderInvoice::getInvoiceType, invoiceType); + } + if (invoiceStatus != null) { + wrapper.eq(StoreOrderInvoice::getInvoiceStatus, invoiceStatus); + } + + wrapper.orderByDesc(StoreOrderInvoice::getCreateTime); + + Page page = new Page<>(pageParamRequest.getPage(), pageParamRequest.getLimit()); + Page pageResult = storeOrderInvoiceService.page(page, wrapper); + + // 手动构建分页结果 + CommonPage result = new CommonPage<>(); + result.setPage(pageParamRequest.getPage()); + result.setLimit(pageParamRequest.getLimit()); + result.setTotal(pageResult.getTotal()); + result.setTotalPage((int) pageResult.getPages()); + result.setList(pageResult.getRecords()); + + return CommonResult.success(result); + } + + /** + * 查询订单发票详情 + */ + @GetMapping("/detail/{orderId}") + @ApiOperation("查询订单发票详情") + public CommonResult getInvoiceDetail(@PathVariable String orderId) { + StoreOrderInvoice invoice = storeOrderInvoiceService.getByOrderId(orderId); + if (invoice == null) { + return CommonResult.failed("该订单暂无发票信息"); + } + return CommonResult.success(invoice); + } + + /** + * 更新发票状态(开票) + */ + @PostMapping("/issue") + @ApiOperation("更新发票状态为已开票") + public CommonResult issueInvoice( + @ApiParam("订单号") @RequestParam String orderId, + @ApiParam("发票代码") @RequestParam(required = false) String invoiceCode, + @ApiParam("发票号码") @RequestParam(required = false) String invoiceNumber, + @ApiParam("电子发票URL") @RequestParam(required = false) String invoiceUrl) { + + boolean result = storeOrderInvoiceService.updateInvoiceStatus( + orderId, + InvoiceConstants.INVOICE_STATUS_ISSUED, + invoiceCode, + invoiceNumber, + invoiceUrl + ); + + if (result) { + return CommonResult.success(true); + } else { + return CommonResult.failed("开票失败"); + } + } + + /** + * 更新发票状态为开票失败 + */ + @PostMapping("/fail") + @ApiOperation("更新发票状态为开票失败") + public CommonResult failInvoice( + @ApiParam("订单号") @RequestParam String orderId, + @ApiParam("失败原因") @RequestParam String remark) { + + StoreOrderInvoice invoice = storeOrderInvoiceService.getByOrderId(orderId); + if (invoice == null) { + return CommonResult.failed("该订单暂无发票信息"); + } + + invoice.setInvoiceStatus(InvoiceConstants.INVOICE_STATUS_FAILED); + invoice.setRemark(remark); + boolean result = storeOrderInvoiceService.updateById(invoice); + + if (result) { + return CommonResult.success(true); + } else { + return CommonResult.failed("操作失败"); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/PageDiyController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/PageDiyController.java new file mode 100644 index 0000000..3011e0b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/PageDiyController.java @@ -0,0 +1,161 @@ +package com.yzt.admin.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.page.PageDiy; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.page.PageDiyEditNameRequest; +import com.yzt.common.request.page.PageDiyRequest; +import com.yzt.common.response.page.PageDiyResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.PageDiyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * DIY数据表 前端控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/admin/pagediy") +@Api(tags = "DIY 控制器") //配合swagger使用 + +public class PageDiyController { + + @Autowired + private PageDiyService pageDiyService; + + /** + * 分页显示DIY数据表 + */ + @PreAuthorize("hasAuthority('admin:pagediy:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name = "name", value = "搜索关键子", dataType = "String") + }) + public CommonResult> getList(@RequestParam String name,PageParamRequest pageParamRequest){ + CommonPage pageDiyCommonPage = CommonPage.restPage(pageDiyService.getList(name, pageParamRequest)); + return CommonResult.success(pageDiyCommonPage); + } + + /** + * 设置首页 + * @param id 待设置的首页id + */ + @PreAuthorize("hasAuthority('admin:pagediy:setdefault')") + @ApiOperation(value = "设置商城首页") + @RequestMapping(value = "/setdefault/{id}", method = RequestMethod.GET) + public CommonResult setDefault(@PathVariable(value = "id") Integer id ){ + if(pageDiyService.setDiyPageHome(id)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 获取已经设置的首页模版数据 + * @return 首页模版id + */ + @PreAuthorize("hasAuthority('admin:pagediy:getdefault')") + @ApiOperation(value = "获取商城首页") + @RequestMapping(value = "/getdefault", method = RequestMethod.GET) + public CommonResult getDefault(){ + return CommonResult.success(pageDiyService.getDiyPageHome(Boolean.TRUE).getId()); + } + + /** + * 新增DIY数据表 + * @param pageDiyRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:pagediy:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated PageDiyRequest pageDiyRequest){ + PageDiy pageDiy = new PageDiy(); + BeanUtils.copyProperties(pageDiyRequest, pageDiy); + pageDiy.setValue(JSON.toJSONString(pageDiyRequest.getValue())); + return CommonResult.success(pageDiyService.savePageDiy(pageDiy)); + } + + /** + * 删除DIY数据表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:pagediy:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id){ + if(pageDiyService.removeById(id)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 修改DIY数据表 + * @param pageDiyRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:pagediy:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated PageDiyRequest pageDiyRequest){ + PageDiy pageDiy = new PageDiy(); + BeanUtils.copyProperties(pageDiyRequest, pageDiy); + pageDiy.setValue(JSON.toJSONString(pageDiyRequest.getValue())); + if(pageDiyService.editPageDiy(pageDiy)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * DIY 模版名称更新 + * @param pageDiyEditNameRequest 更新模版名称对象 + * @return 更新结果 + */ + @PreAuthorize("hasAuthority('admin:pagediy:updatename')") + @ApiOperation(value = "DIY 模版名称更新") + @RequestMapping(value = "/updatename", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated PageDiyEditNameRequest pageDiyEditNameRequest){ + if(pageDiyService.editPageDiyName(pageDiyEditNameRequest)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 查询DIY数据表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:pagediy:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable(value = "id") Integer id){ + PageDiy pageDiy = pageDiyService.getDiyPageByPageIdForAdmin(id); + if(ObjectUtil.isNull(pageDiy)) throw new YztException("未找到对应模版信息"); + PageDiyResponse response = new PageDiyResponse(); + BeanUtils.copyProperties(pageDiy, response); + response.setValue(JSON.parseObject(pageDiy.getValue())); + return CommonResult.success(response); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/PageLayoutController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/PageLayoutController.java new file mode 100644 index 0000000..ea9faae --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/PageLayoutController.java @@ -0,0 +1,149 @@ +package com.yzt.admin.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.PageLayoutService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; + +/** + * 页面布局 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/page/layout") +@Api(tags = "页面布局管理") +public class PageLayoutController { + + @Autowired + private PageLayoutService pageLayoutService; + + /** + * 页面首页 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index')") + @ApiOperation(value = "页面首页") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult> index() { + return CommonResult.success(pageLayoutService.index()); + } + + /** + * 页面首页保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:save')") + @ApiOperation(value = "页面首页保存(不建议调用)") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.save(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面首页banner保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index:banner:save')") + @ApiOperation(value = "页面首页banner保存") + @RequestMapping(value = "/index/banner/save", method = RequestMethod.POST) + public CommonResult indexBannerSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.indexBannerSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面首页menu保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index:menu:save')") + @ApiOperation(value = "页面首页menu保存") + @RequestMapping(value = "/index/menu/save", method = RequestMethod.POST) + public CommonResult indexMenuSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.indexMenuSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面首页新闻保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index:news:save')") + @ApiOperation(value = "页面首页新闻保存") + @RequestMapping(value = "/index/news/save", method = RequestMethod.POST) + public CommonResult indexNewsSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.indexNewsSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面用户中心banner保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index:banner:save')") + @ApiOperation(value = "页面用户中心banner保存") + @RequestMapping(value = "/user/banner/save", method = RequestMethod.POST) + public CommonResult userBannerSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.userBannerSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面用户中心导航保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:user:menu:save')") + @ApiOperation(value = "页面用户中心导航保存") + @RequestMapping(value = "/user/menu/save", method = RequestMethod.POST) + public CommonResult userMenuSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.userMenuSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 页面用户中心商品table保存 + */ + @PreAuthorize("hasAuthority('admin:page:layout:index:table:save')") + @ApiOperation(value = "页面用户中心商品table保存") + @RequestMapping(value = "/index/table/save", method = RequestMethod.POST) + public CommonResult indexTableSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.indexTableSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:page:layout:bottom:navigation')") + @ApiOperation(value = "页面底部导航") + @RequestMapping(value = "/bottom/navigation/get", method = RequestMethod.GET) + public CommonResult getBottomNavigation() { + return CommonResult.success(pageLayoutService.getBottomNavigation()); + } + + @PreAuthorize("hasAuthority('admin:page:layout:bottom:navigation:save')") + @ApiOperation(value = "底部导航保存") + @RequestMapping(value = "/bottom/navigation/save", method = RequestMethod.POST) + public CommonResult bottomNavigationSave(@RequestBody JSONObject jsonObject) { + if (pageLayoutService.bottomNavigationSave(jsonObject)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/RetailShopController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/RetailShopController.java new file mode 100644 index 0000000..b33d28e --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/RetailShopController.java @@ -0,0 +1,121 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.RetailShopRequest; +import com.yzt.common.request.RetailShopStairUserRequest; +import com.yzt.common.response.SpreadOrderResponse; +import com.yzt.common.response.SpreadUserResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.RetailShopService; +import com.yzt.service.service.UserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 分销模块 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/retail") +@Api(tags = "分销") +public class RetailShopController { + + @Autowired + private RetailShopService retailShopService; + + @Autowired + private UserService userService; + + /** + * 分销员列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:retail:list')") + @ApiOperation(value = "分销员列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name = "keywords", value = "搜索关键字[姓名、电话、uid]"), + @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + }) + public CommonResult> getList(@RequestParam(required = false) String keywords, + @RequestParam(required = false) String dateLimit, + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(retailShopService.getSpreadPeopleList(keywords, dateLimit, pageParamRequest)); + } + + /** + * 根据用户参数获取推广人列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return 查询结果推广人列表 + */ + @PreAuthorize("hasAuthority('admin:retail:spread:list')") + @ApiOperation(value = "根据条件获取推广人列表") + @RequestMapping(value = "/spread/userlist", method = RequestMethod.POST) + public CommonResult> getUserListBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userService.getUserListBySpreadLevel(request, pageParamRequest))); + } + + + /** + * 根据参数获取推广订单列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return 查询结果推广人订单列表 + */ + @PreAuthorize("hasAuthority('admin:retail:spread:order:list')") + @ApiOperation(value = "根据条件获取推广人订单") + @RequestMapping(value = "/spread/orderlist", method = RequestMethod.POST) + public CommonResult> getOrdersBySpreadLevel(@RequestBody @Validated RetailShopStairUserRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userService.getOrderListBySpreadLevel(request, pageParamRequest))); + } + + /** + * 清除上级推广人 + * @param id 当前被清理的用户id + * @return 推广关系清理后的结果 + */ + @PreAuthorize("hasAuthority('admin:retail:spread:clean')") + @ApiOperation(value = "清除上级推广人") + @RequestMapping(value = "/spread/clean/{id}", method = RequestMethod.GET) + public CommonResult clearSpread(@PathVariable Integer id) { + return CommonResult.success(userService.clearSpread(id)); + } + + /** + * 分销设置获取 + * @return 保存分销设置 + */ + @PreAuthorize("hasAuthority('admin:retail:spread:manage:get')") + @ApiOperation(value = "分销配置信息获取") + @RequestMapping(value = "/spread/manage/get", method = RequestMethod.GET) + public CommonResult getSpreadInfo() { + return CommonResult.success(retailShopService.getManageInfo()); + } + + /** + * 分销管理信息保存 + * @param retailShopRequest 分销管理对象 + * @return 保存结果 + */ + @PreAuthorize("hasAuthority('admin:retail:spread:manage:set')") + @ApiOperation(value = "分销管理信息保存") + @RequestMapping(value = "/spread/manage/set", method = RequestMethod.POST) + public CommonResult setSpreadInfo(@RequestBody @Validated RetailShopRequest retailShopRequest) { + return CommonResult.success(retailShopService.setManageInfo(retailShopRequest)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ScheduleJobController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ScheduleJobController.java new file mode 100644 index 0000000..ec287c3 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ScheduleJobController.java @@ -0,0 +1,115 @@ +package com.yzt.admin.controller; + +import com.yzt.admin.model.ScheduleJob; +import com.yzt.admin.model.ScheduleJobLog; +import com.yzt.admin.service.ScheduleJobLogService; +import com.yzt.admin.service.ScheduleJobService; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ScheduleJobLogSearchRequest; +import com.yzt.common.request.ScheduleJobRequest; +import com.yzt.common.result.CommonResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 定时任务控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/schedule/job") +@Api(tags = "定时任务控制器") +public class ScheduleJobController { + + @Autowired + private ScheduleJobService scheduleJobService; + @Autowired + private ScheduleJobLogService scheduleJobLogService; + + @PreAuthorize("hasAuthority('admin:schedule:job:list')") + @ApiOperation(value = "定时任务列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList() { + return CommonResult.success(scheduleJobService.getAll()); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:add')") + @ApiOperation(value = "添加定时任务") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public CommonResult add(@RequestBody @Validated ScheduleJobRequest request) { + if (scheduleJobService.add(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:update')") + @ApiOperation(value = "定时任务编辑") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated ScheduleJobRequest request) { + if (scheduleJobService.edit(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:suspend')") + @ApiOperation(value = "暂停定时任务") + @RequestMapping(value = "/suspend/{jobId}", method = RequestMethod.POST) + public CommonResult suspend(@PathVariable(value = "jobId") Integer jobId) { + if (scheduleJobService.suspend(jobId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:start')") + @ApiOperation(value = "启动定时任务") + @RequestMapping(value = "/start/{jobId}", method = RequestMethod.POST) + public CommonResult start(@PathVariable(value = "jobId") Integer jobId) { + if (scheduleJobService.start(jobId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:delete')") + @ApiOperation(value = "删除定时任务") + @RequestMapping(value = "/delete/{jobId}", method = RequestMethod.POST) + public CommonResult delete(@PathVariable(value = "jobId") Integer jobId) { + if (scheduleJobService.delete(jobId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:trig')") + @ApiOperation(value = "立即执行定时任务(一次)") + @RequestMapping(value = "/trig/{jobId}", method = RequestMethod.POST) + public CommonResult trig(@PathVariable(value = "jobId") Integer jobId) { + if (scheduleJobService.trig(jobId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + @PreAuthorize("hasAuthority('admin:schedule:job:log:list')") + @ApiOperation(value = "定时任务日志分页列表") + @RequestMapping(value = "/log/list", method = RequestMethod.GET) + public CommonResult> getLogList(@Validated ScheduleJobLogSearchRequest request, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(scheduleJobLogService.findLogPageList(request, pageParamRequest))); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesController.java new file mode 100644 index 0000000..cdeb672 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesController.java @@ -0,0 +1,110 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.express.ShippingTemplates; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ShippingTemplatesRequest; +import com.yzt.common.request.ShippingTemplatesSearchRequest; +import com.yzt.common.response.ShippingTemplatesInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ShippingTemplatesService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 物流-模板控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/express/shipping/templates") +@Api(tags = "设置 -- 物流 -- 模板") +public class ShippingTemplatesController { + + @Autowired + private ShippingTemplatesService shippingTemplatesService; + + /** + * 分页显示 + * + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated ShippingTemplatesSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage shippingTemplatesCommonPage = CommonPage.restPage(shippingTemplatesService.getList(request, pageParamRequest)); + return CommonResult.success(shippingTemplatesCommonPage); + } + + /** + * 新增 + * + * @param request 新增参数 + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated ShippingTemplatesRequest request) { + if (shippingTemplatesService.create(request)) { + return CommonResult.success("新增运费模板成功"); + } + return CommonResult.failed("新增运费模板失败"); + } + + /** + * 删除 + * + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + @ApiImplicitParam(name = "id", value = "模板ID", required = true) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (shippingTemplatesService.remove(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改 + * + * @param id integer id + * @param request ShippingTemplatesRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated ShippingTemplatesRequest request) { + if (shippingTemplatesService.update(id, request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询信息 + * + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + @ApiImplicitParam(name = "id", value = "模板ID", required = true) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(shippingTemplatesService.getInfo(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesFreeController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesFreeController.java new file mode 100644 index 0000000..f5e4c07 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesFreeController.java @@ -0,0 +1,42 @@ +package com.yzt.admin.controller; + +import com.yzt.common.response.ShippingTemplatesFreeResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ShippingTemplatesFreeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 物流控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/express/shipping/free") +@Api(tags = "设置 -- 物流 -- 免费") +public class ShippingTemplatesFreeController { + + @Autowired + private ShippingTemplatesFreeService shippingTemplatesFreeService; + + /** + * 根据模板id查询数据 + * @param tempId Integer 模板id + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:free:list')") + @ApiOperation(value = "根据模板id查询数据") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@RequestParam Integer tempId){ + return CommonResult.success(shippingTemplatesFreeService.getListGroup(tempId)); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesRegionController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesRegionController.java new file mode 100644 index 0000000..7b2a7e4 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/ShippingTemplatesRegionController.java @@ -0,0 +1,41 @@ +package com.yzt.admin.controller; + +import com.yzt.common.response.ShippingTemplatesRegionResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ShippingTemplatesRegionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 物流付费前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/express/shipping/region") +@Api(tags = "设置 -- 物流 -- 付费") +public class ShippingTemplatesRegionController { + + @Autowired + private ShippingTemplatesRegionService shippingTemplatesRegionService; + + /** + * 根据模板id查询数据 + * @param tempId Integer 模板id + */ + @PreAuthorize("hasAuthority('admin:shipping:templates:region:list')") + @ApiOperation(value = "根据模板id查询数据") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@RequestParam Integer tempId){ + return CommonResult.success(shippingTemplatesRegionService.getListGroup(tempId)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SmsRecordController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SmsRecordController.java new file mode 100644 index 0000000..5a5c989 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SmsRecordController.java @@ -0,0 +1,85 @@ +package com.yzt.admin.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SmsApplyTempRequest; +import com.yzt.common.request.SmsModifySignRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.MyRecord; +import com.yzt.service.service.SmsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 短信发送记录表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/sms") +@Api(tags = "短信服务") +public class SmsRecordController { + + @Autowired + private SmsService smsService; + + /** + * 修改签名 + */ + @PreAuthorize("hasAuthority('admin:sms:modify:sign')") + @ApiOperation(value = "修改签名") + @RequestMapping(value = "/modify/sign", method = RequestMethod.POST) + public CommonResult modifySign(@RequestBody @Validated SmsModifySignRequest request) { + if (smsService.modifySign(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 短信模板 + */ + @PreAuthorize("hasAuthority('admin:sms:temps')") + @ApiOperation(value = "短信模板") + @RequestMapping(value = "/temps", method = RequestMethod.GET) + public CommonResult> temps(@ModelAttribute PageParamRequest pageParamRequest) { + MyRecord myRecord = smsService.temps(pageParamRequest); + return CommonResult.success(myRecord); + } + + /** + * 申请短信模板 + */ + @PreAuthorize("hasAuthority('admin:sms:temp:apply')") + @ApiOperation(value = "申请短信模板") + @RequestMapping(value = "/temp/apply", method = RequestMethod.POST) + public CommonResult applyTempMessage(@RequestBody @Validated SmsApplyTempRequest request) { + if (smsService.applyTempMessage(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 模板申请记录 + */ + @PreAuthorize("hasAuthority('admin:sms:applys')") + @ApiOperation(value = "模板申请记录") + @RequestMapping(value = "/applys", method = RequestMethod.POST) + @ApiImplicitParam(name="type", value="type (1=验证码 2=通知 3=推广)") + public CommonResult> applys(@RequestParam(name = "type", required = false) Integer type, @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(smsService.applys(type, pageParamRequest)); + } + +} + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreBargainController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreBargainController.java new file mode 100644 index 0000000..a607f06 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreBargainController.java @@ -0,0 +1,161 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreBargainRequest; +import com.yzt.common.request.StoreBargainSearchRequest; +import com.yzt.common.request.StoreBargainUserSearchRequest; +import com.yzt.common.response.StoreBargainResponse; +import com.yzt.common.response.StoreBargainUserHelpResponse; +import com.yzt.common.response.StoreBargainUserResponse; +import com.yzt.common.response.StoreProductInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreBargainService; +import com.yzt.service.service.StoreBargainUserHelpService; +import com.yzt.service.service.StoreBargainUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 砍价表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/bargain") +@Api(tags = "商品 -- 砍价 -- 商品") //配合swagger使用 +public class StoreBargainController { + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Autowired + private StoreBargainUserHelpService storeBargainUserHelpService; + + /** + * 分页显示砍价商品列表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:bargain:list')") + @ApiOperation(value = "分页显示砍价商品列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreBargainSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage storeBargainCommonPage = CommonPage.restPage(storeBargainService.getList(request, pageParamRequest)); + return CommonResult.success(storeBargainCommonPage); + } + + /** + * 新增砍价商品 + * @param storeBargainRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:bargain:save')") + @ApiOperation(value = "新增砍价商品") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreBargainRequest storeBargainRequest){ + if(storeBargainService.saveBargain(storeBargainRequest)){ + return CommonResult.success("添加砍价商品成功"); + }else{ + return CommonResult.failed("添加砍价商品失败"); + } + } + + /** + * 删除砍价商品 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:bargain:delete')") + @ApiOperation(value = "删除砍价商品") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id){ + if(storeBargainService.deleteById(id)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 修改砍价商品 + * @param storeBargainRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:bargain:update')") + @ApiOperation(value = "修改砍价商品") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated StoreBargainRequest storeBargainRequest){ + if (storeBargainService.updateBargain(storeBargainRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询砍价商品详情 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:bargain:info')") + @ApiOperation(value = "查询砍价商品详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id){ + StoreProductInfoResponse storeBargainResponse = storeBargainService.getAdminDetail(id); + return CommonResult.success(storeBargainResponse); + } + + /** + * + * 修改砍价商品状态 + * @param id 商品id + * @param status 商品状态 + * @return {@link CommonResult} + */ + @PreAuthorize("hasAuthority('admin:bargain:update:status')") + @ApiOperation(value = "修改砍价商品状态") + @RequestMapping(value = "/update/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam @Validated Integer id, @RequestParam @Validated boolean status){ + if(storeBargainService.updateBargainStatus(id,status)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 分页显示砍价列表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:bargain:user:list')") + @ApiOperation(value = "分页显示砍价列表") //配合swagger使用 + @RequestMapping(value = "/bargain_list", method = RequestMethod.GET) + public CommonResult> getBargainUserList(@Validated StoreBargainUserSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage bargainUserCommonPage = CommonPage.restPage(storeBargainUserService.getList(request, pageParamRequest)); + return CommonResult.success(bargainUserCommonPage); + } + + /** + * 获取砍价参与详情列表 + * @param id StoreBargainUser 砍价参与用户编号 + */ + @PreAuthorize("hasAuthority('admin:bargain:user:help:list')") + @ApiOperation(value = "获取砍价参与详情列表") //配合swagger使用 + @RequestMapping(value = "/bargain_list/{id}", method = RequestMethod.GET) + public CommonResult> getBargainUserHelpDetail(@PathVariable(value = "id") Integer id){ + List list = storeBargainUserHelpService.getList(id); + return CommonResult.success(list); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCombinationController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCombinationController.java new file mode 100644 index 0000000..f877cb0 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCombinationController.java @@ -0,0 +1,161 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreCombinationRequest; +import com.yzt.common.request.StoreCombinationSearchRequest; +import com.yzt.common.request.StorePinkSearchRequest; +import com.yzt.common.response.StoreCombinationResponse; +import com.yzt.common.response.StorePinkAdminListResponse; +import com.yzt.common.response.StorePinkDetailResponse; +import com.yzt.common.response.StoreProductInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCombinationService; +import com.yzt.service.service.StorePinkService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 拼团商品表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/combination") +@Api(tags = "商品——拼团——商品") //配合swagger使用 +public class StoreCombinationController { + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StorePinkService storePinkService; + + /** + * 分页显示拼团商品表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + * @return + */ + @PreAuthorize("hasAuthority('admin:combination:list')") + @ApiOperation(value = "分页显示拼团商品表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreCombinationSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage commonPage = CommonPage.restPage(storeCombinationService.getList(request, pageParamRequest)); + return CommonResult.success(commonPage); + } + + /** + * 新增拼团商品表 + * @param request 新增参数 + */ + @PreAuthorize("hasAuthority('admin:combination:save')") + @ApiOperation(value = "新增拼团商品") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreCombinationRequest request){ + if(storeCombinationService.saveCombination(request)){ + return CommonResult.success("新增拼团商品成功"); + }else{ + return CommonResult.failed("新增拼团商品失败"); + } + } + + /** + * 删除拼团商品表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:combination:delete')") + @ApiOperation(value = "删除拼团商品") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id){ + if(storeCombinationService.deleteById(id)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 修改拼团商品表 + * @param storeCombinationRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:combination:update')") + @ApiOperation(value = "修改拼团商品") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated StoreCombinationRequest storeCombinationRequest){ + if(storeCombinationService.updateCombination(storeCombinationRequest)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 查询拼团商品信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:combination:info')") + @ApiOperation(value = "拼团商品详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id){ + StoreProductInfoResponse detail = storeCombinationService.getAdminDetail(id); + return CommonResult.success(detail); + } + + /** + * 修改拼团商品状态 + */ + @PreAuthorize("hasAuthority('admin:combination:update:status')") + @ApiOperation(value = "修改拼团商品状态") + @RequestMapping(value = "/update/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam(value = "id") Integer id, @RequestParam @Validated boolean isShow){ + if(storeCombinationService.updateCombinationShow(id, isShow)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 拼团统计 + */ + @PreAuthorize("hasAuthority('admin:combination:statistics')") + @ApiOperation(value = "拼团统计") + @RequestMapping(value = "/statistics", method = RequestMethod.GET) + public CommonResult> statistics() { + Map map = storeCombinationService.getAdminStatistics(); + return CommonResult.success(map); + } + + /** + * 拼团列表 + */ + @PreAuthorize("hasAuthority('admin:combination:combine:list')") + @ApiOperation(value = "拼团列表") + @RequestMapping(value = "/combine/list", method = RequestMethod.GET) + public CommonResult> getCombineList(@Validated StorePinkSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage responseCommonPage = CommonPage.restPage(storePinkService.getList(request, pageParamRequest)); + return CommonResult.success(responseCommonPage); + } + + /** + * 拼团订单列表 + */ + @PreAuthorize("hasAuthority('admin:combination:order:pink')") + @ApiOperation(value = "拼团订单列表") + @RequestMapping(value = "/order_pink/{id}", method = RequestMethod.GET) + public CommonResult> getPinkList(@PathVariable(value = "id") Integer id) { + return CommonResult.success(storePinkService.getAdminList(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponController.java new file mode 100644 index 0000000..8b3f587 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponController.java @@ -0,0 +1,119 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SearchAndPageRequest; +import com.yzt.common.request.StoreCouponRequest; +import com.yzt.common.request.StoreCouponSearchRequest; +import com.yzt.common.response.StoreCouponInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCouponService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 优惠券表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/marketing/coupon") +@Api(tags = "营销 -- 优惠券") +public class StoreCouponController { + + @Autowired + private StoreCouponService storeCouponService; + + /** + * 分页显示优惠券表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:coupon:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreCouponSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage storeCouponCommonPage = CommonPage.restPage(storeCouponService.getList(request, pageParamRequest)); + return CommonResult.success(storeCouponCommonPage); + } + + /** + * 保存优惠券表 + * @param request StoreCouponRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:coupon:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreCouponRequest request) { + if (storeCouponService.create(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 是否有效 + * @param id integer id + */ + @PreAuthorize("hasAuthority('admin:coupon:update:status')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam Integer id, @RequestParam Boolean status) { + if (storeCouponService.updateStatus(id, status)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 详情 + * @param id integer id + */ + @PreAuthorize("hasAuthority('admin:coupon:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.POST) + @ApiImplicitParam(name="id", value="优惠券ID", required = true) + public CommonResult info(@RequestParam Integer id) { + return CommonResult.success(storeCouponService.info(id)); + } + + /** + * 发送优惠券列表 + * @param searchAndPageRequest 搜索分页参数 + */ + @PreAuthorize("hasAuthority('admin:coupon:send:list')") + @ApiOperation(value = "发送优惠券列表") + @RequestMapping(value = "/send/list", method = RequestMethod.GET) + public CommonResult> getSendList(@Validated SearchAndPageRequest searchAndPageRequest) { + CommonPage storeCouponCommonPage = CommonPage.restPage(storeCouponService.getSendList(searchAndPageRequest)); + return CommonResult.success(storeCouponCommonPage); + } + + /** + * 删除优惠券 + * @param id 优惠券id + */ + @PreAuthorize("hasAuthority('admin:coupon:delete')") + @ApiOperation(value = "删除优惠券") + @RequestMapping(value = "/delete", method = RequestMethod.POST) + public CommonResult delete(@RequestParam Integer id) { + if (storeCouponService.delete(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed("删除失败"); + } + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponUserController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponUserController.java new file mode 100644 index 0000000..43a9aa0 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreCouponUserController.java @@ -0,0 +1,64 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreCouponUserRequest; +import com.yzt.common.request.StoreCouponUserSearchRequest; +import com.yzt.common.response.StoreCouponUserResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCouponUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 优惠券发放记录表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/marketing/coupon/user") +@Api(tags = "营销 -- 优惠券 -- 领取记录") +public class StoreCouponUserController { + + @Autowired + private StoreCouponUserService storeCouponUserService; + + /** + * 分页显示优惠券发放记录表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:coupon:user:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreCouponUserSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage storeCouponUserCommonPage = CommonPage.restPage(storeCouponUserService.getList(request, pageParamRequest)); + return CommonResult.success(storeCouponUserCommonPage); + } + + /** + * 领券 + * @param storeCouponUserRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:coupon:user:receive')") + @ApiOperation(value = "领券") + @RequestMapping(value = "/receive", method = RequestMethod.POST) + public CommonResult receive(@Validated StoreCouponUserRequest storeCouponUserRequest) { + if(storeCouponUserService.receive(storeCouponUserRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderController.java new file mode 100644 index 0000000..9d6f085 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderController.java @@ -0,0 +1,267 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.ExpressSheetVo; +import com.yzt.common.vo.LogisticsResultVo; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.StoreOrderVerification; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.constraints.Range; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/order") +@Api(tags = "订单") //配合swagger使用 +public class StoreOrderController { + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderVerification storeOrderVerification; + + /** + * 分页显示订单表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:order:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreOrderSearchRequest request, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(storeOrderService.getAdminList(request, pageParamRequest)); + } + + /** + * 获取订单各状态数量 + */ + @PreAuthorize("hasAuthority('admin:order:status:num')") + @ApiOperation(value = "获取订单各状态数量") + @RequestMapping(value = "/status/num", method = RequestMethod.GET) + public CommonResult getOrderStatusNum( + @RequestParam(value = "dateLimit", defaultValue = "") String dateLimit, + @RequestParam(value = "type", defaultValue = "3") @Range(min = 0, max = 5, message = "未知的订单类型") Integer type, + @RequestParam(value = "orderId", defaultValue = "") String orderNo) { + return CommonResult.success(storeOrderService.getOrderStatusNum(dateLimit, type, orderNo)); + } + + /** + * 获取订单统计数据 + */ + @PreAuthorize("hasAuthority('admin:order:list:data')") + @ApiOperation(value = "获取订单统计数据") + @RequestMapping(value = "/list/data", method = RequestMethod.GET) + public CommonResult getOrderData(@RequestParam(value = "dateLimit", defaultValue = "")String dateLimit) { + return CommonResult.success(storeOrderService.getOrderData(dateLimit)); + } + + + /** + * 订单删除 + */ + @PreAuthorize("hasAuthority('admin:order:delete')") + @ApiOperation(value = "订单删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "orderNo") String orderNo) { + if (storeOrderService.delete(orderNo)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 备注订单 + */ + @PreAuthorize("hasAuthority('admin:order:mark')") + @ApiOperation(value = "备注") + @RequestMapping(value = "/mark", method = RequestMethod.POST) + public CommonResult mark(@RequestParam String orderNo, @RequestParam String mark) { + if (storeOrderService.mark(orderNo, mark)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改订单(改价) + */ + @PreAuthorize("hasAuthority('admin:order:update:price')") + @ApiOperation(value = "修改订单(改价)") + @RequestMapping(value = "/update/price", method = RequestMethod.POST) + public CommonResult updatePrice(@RequestBody @Validated StoreOrderUpdatePriceRequest request) { + if (storeOrderService.updatePrice(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 订单详情 + */ + @PreAuthorize("hasAuthority('admin:order:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "orderNo") String orderNo) { + return CommonResult.success(storeOrderService.info(orderNo)); + } + + /** + * 发送货 + */ + @PreAuthorize("hasAuthority('admin:order:send')") + @ApiOperation(value = "发送货") + @RequestMapping(value = "/send", method = RequestMethod.POST) + public CommonResult send(@RequestBody @Validated StoreOrderSendRequest request) { + return CommonResult.success(storeOrderService.send(request)); + } + + /** + * 退款 + */ + @PreAuthorize("hasAuthority('admin:order:refund')") + @ApiOperation(value = "退款") + @RequestMapping(value = "/refund", method = RequestMethod.GET) + public CommonResult refund(@Validated StoreOrderRefundRequest request) { + return CommonResult.success(storeOrderService.refund(request)); + } + + /** + * 拒绝退款 + */ + @PreAuthorize("hasAuthority('admin:order:refund:refuse')") + @ApiOperation(value = "拒绝退款") + @RequestMapping(value = "/refund/refuse", method = RequestMethod.GET) + public CommonResult refundRefuse(@RequestParam String orderNo, @RequestParam String reason) { + if (storeOrderService.refundRefuse(orderNo, reason)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 快递查询 + */ + @PreAuthorize("hasAuthority('admin:order:logistics:info')") + @ApiOperation(value = "快递查询") + @RequestMapping(value = "/getLogisticsInfo", method = RequestMethod.GET) + public CommonResult getLogisticsInfo(@RequestParam(value = "orderNo") String orderNo) { + return CommonResult.success(storeOrderService.getLogisticsInfo(orderNo)); + } + + /** + * 核销订单头部数据 + * + * @author stivepeim + * @since 2020-08-29 + */ + @PreAuthorize("hasAuthority('admin:order:statistics')") + @ApiOperation(value = "核销订单头部数据") + @RequestMapping(value = "/statistics", method = RequestMethod.GET) + public CommonResult getStatistics() { + return CommonResult.success(storeOrderVerification.getOrderVerificationData()); + } + + /** + * 核销订单 月列表数据 + * + * @author stivepeim + * @since 2020-08-29 + */ + @PreAuthorize("hasAuthority('admin:order:statistics:data')") + @ApiOperation(value = "核销订单 月列表数据") + @RequestMapping(value = "/statisticsData", method = RequestMethod.GET) + public CommonResult> getStaffDetail(StoreOrderStaticsticsRequest request) { + return CommonResult.success(storeOrderVerification.getOrderVerificationDetail(request)); + } + + + /** + * 核销码核销订单 + * + * @author stivepeim + * @since 2020-09-01 + */ + @PreAuthorize("hasAuthority('admin:order:write:update')") + @ApiOperation(value = "核销码核销订单") + @RequestMapping(value = "/writeUpdate/{vCode}", method = RequestMethod.GET) + public CommonResult verificationOrder(@PathVariable String vCode) { + return CommonResult.success(storeOrderVerification.verificationOrderByCode(vCode)); + } + + /** + * 核销码查询待核销订单 + * + * @author stivepeim + * @since 2020-09-01 + */ + @PreAuthorize("hasAuthority('admin:order:write:confirm')") + @ApiOperation(value = "核销码查询待核销订单") + @RequestMapping(value = "/writeConfirm/{vCode}", method = RequestMethod.GET) + public CommonResult verificationConfirmOrder( + @PathVariable String vCode) { + return CommonResult.success(storeOrderVerification.getVerificationOrderByCode(vCode)); + } + + /** + * 订单统计详情 + * + * @author stivepeim + * @since 2020-09-01 + */ + @PreAuthorize("hasAuthority('admin:order:time')") + @ApiOperation(value = "订单统计详情") + @RequestMapping(value = "/time", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name = "dateLimit", value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/", + dataType = "String", required = true), + @ApiImplicitParam(name = "type", value = "1=price 2=order", required = true) + }) + public CommonResult statisticsOrderTime(@RequestParam String dateLimit, + @RequestParam Integer type) { + return CommonResult.success(storeOrderService.orderStatisticsByTime(dateLimit, type)); + } + + /** + * 获取面单默认配置信息 + */ + @PreAuthorize("hasAuthority('admin:order:sheet:info')") + @ApiOperation(value = "获取面单默认配置信息") + @RequestMapping(value = "/sheet/info", method = RequestMethod.GET) + public CommonResult getDeliveryInfo() { + return CommonResult.success(storeOrderService.getDeliveryInfo()); + } + + @PreAuthorize("hasAuthority('admin:order:tracking:number:update')") + @ApiOperation(value = "更改订单运单号") + @RequestMapping(value = "/update/tracking/number", method = RequestMethod.POST) + public CommonResult updateTrackingNumber(@RequestBody @Validated StoreOrderSendRequest request) { + if (storeOrderService.updateTrackingNumber(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderStatusController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderStatusController.java new file mode 100644 index 0000000..dd7aa8a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreOrderStatusController.java @@ -0,0 +1,50 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.order.StoreOrderStatus; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreOrderStatusSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreOrderStatusService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 订单操作记录表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/order/status") +@Api(tags = "订单 -- 操作记录") //配合swagger使用 + +public class StoreOrderStatusController { + + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + /** + * 分页显示订单操作记录表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:order:status:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreOrderStatusSearchRequest request, + @Validated PageParamRequest pageParamRequest){ + CommonPage storeOrderStatusCommonPage = CommonPage.restPage(storeOrderStatusService.getList(request, pageParamRequest)); + return CommonResult.success(storeOrderStatusCommonPage); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductController.java new file mode 100644 index 0000000..6a75341 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductController.java @@ -0,0 +1,224 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.StoreProductInfoResponse; +import com.yzt.common.response.StoreProductResponse; +import com.yzt.common.response.StoreProductTabsHeader; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCartService; +import com.yzt.service.service.StoreProductService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; +import java.util.Map; + + +/** + * 商品表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/product") +@Api(tags = "商品") //配合swagger使用 +public class StoreProductController { + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreCartService storeCartService; + + /** + * 分页显示商品表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:product:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreProductSearchRequest request, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeProductService.getAdminList(request, pageParamRequest))); + } + + @PreAuthorize("hasAuthority('admin:product:listbyids')") + @ApiOperation(value = "根据id集合获取商品列表") //配合swagger使用 + @RequestMapping(value = "/listids/{ids}", method = RequestMethod.GET) + public CommonResult> getListByIds(@PathVariable(value = "ids") List ids) { + return CommonResult.success(CommonPage.restPage(storeProductService.getListInIds(ids))); + } + + /** + * 新增商品 + * @param request 新增参数 + */ + @PreAuthorize("hasAuthority('admin:product:save')") + @ApiOperation(value = "新增商品") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreProductAddRequest request) { + if (storeProductService.save(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除商品表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:product:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) + public CommonResult delete(@RequestBody @PathVariable Integer id, @RequestParam(value = "type", required = false, defaultValue = "recycle")String type) { + if (storeProductService.deleteProduct(id, type)) { + if (type.equals("recycle")) { + storeCartService.productStatusNotEnable(id); + } else { + storeCartService.productDelete(id); + } + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 恢复已删除商品表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:product:restore')") + @ApiOperation(value = "恢复商品") + @RequestMapping(value = "/restore/{id}", method = RequestMethod.GET) + public CommonResult restore(@RequestBody @PathVariable Integer id) { + if (storeProductService.reStoreProduct(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 商品修改 + * @param storeProductRequest 商品参数 + */ + @PreAuthorize("hasAuthority('admin:product:update')") + @ApiOperation(value = "商品修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated StoreProductAddRequest storeProductRequest) { + if (storeProductService.update(storeProductRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 商品详情 + * @param id 商品id + */ + @PreAuthorize("hasAuthority('admin:product:info')") + @ApiOperation(value = "商品详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable Integer id) { + return CommonResult.success(storeProductService.getInfo(id)); + } + + /** + * 商品tabs表头数据 + */ + @PreAuthorize("hasAuthority('admin:product:tabs:headers')") + @ApiOperation(value = "商品表头数量") + @RequestMapping(value = "/tabs/headers", method = RequestMethod.GET) + public CommonResult> getTabsHeader(@Validated StoreProductHeaderRequest request) { + return CommonResult.success(storeProductService.getTabsHeader(request)); + } + + + /** + * 上架 + */ + @PreAuthorize("hasAuthority('admin:product:up')") + @ApiOperation(value = "上架") + @RequestMapping(value = "/putOnShell/{id}", method = RequestMethod.GET) + public CommonResult putOn(@PathVariable Integer id) { + if (storeProductService.putOnShelf(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 下架 + */ + @PreAuthorize("hasAuthority('admin:product:down')") + @ApiOperation(value = "下架") + @RequestMapping(value = "/offShell/{id}", method = RequestMethod.GET) + public CommonResult offShell(@PathVariable Integer id) { + if (storeProductService.offShelf(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + @PreAuthorize("hasAuthority('admin:product:import:product')") + @ApiOperation(value = "导入99Api商品") + @RequestMapping(value = "/importProduct", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "form", value = "导入平台1=淘宝,2=京东,3=苏宁,4=拼多多, 5=天猫", dataType = "int", required = true), + @ApiImplicitParam(name = "url", value = "URL", dataType = "String", required = true), + }) + public CommonResult importProduct( + @RequestParam @Valid int form, + @RequestParam @Valid String url) throws IOException, JSONException { + StoreProductRequest productRequest = storeProductService.importProductFromUrl(url, form); + return CommonResult.success(productRequest); + } + + /** + * 获取复制商品配置 + */ + @PreAuthorize("hasAuthority('admin:product:copy:config')") + @ApiOperation(value = "获取复制商品配置") + @RequestMapping(value = "/copy/config", method = RequestMethod.POST) + public CommonResult> copyConfig() { + return CommonResult.success(storeProductService.copyConfig()); + } + + @PreAuthorize("hasAuthority('admin:product:copy:product')") + @ApiOperation(value = "复制平台商品") + @RequestMapping(value = "/copy/product", method = RequestMethod.POST) + public CommonResult> copyProduct(@RequestBody @Valid StoreCopyProductRequest request) { + return CommonResult.success(storeProductService.copyProduct(request.getUrl())); + } + + @PreAuthorize("hasAuthority('admin:product:quick:stock:add')") + @ApiOperation(value = "快捷添加库存") + @RequestMapping(value = "/quick/stock/add", method = RequestMethod.POST) + public CommonResult quickAddStock(@RequestBody @Validated ProductAddStockRequest request) { + if (storeProductService.quickAddStock(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductReplyController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductReplyController.java new file mode 100644 index 0000000..5508d20 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductReplyController.java @@ -0,0 +1,107 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.product.StoreProductReply; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductReplyAddRequest; +import com.yzt.common.request.StoreProductReplyCommentRequest; +import com.yzt.common.request.StoreProductReplySearchRequest; +import com.yzt.common.response.StoreProductReplyResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreProductReplyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 评论表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/product/reply") +@Api(tags = "商品 -- 评论") //配合swagger使用 +public class StoreProductReplyController { + + @Autowired + private StoreProductReplyService storeProductReplyService; + + /** + * 分页显示评论表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:product:reply:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreProductReplySearchRequest request, + @Validated PageParamRequest pageParamRequest) { + CommonPage storeProductReplyCommonPage = + CommonPage.restPage(storeProductReplyService.getList(request, pageParamRequest)); + return CommonResult.success(storeProductReplyCommonPage); + } + + /** + * 新增评论表 + * @param request 新增参数 + */ + @PreAuthorize("hasAuthority('admin:product:reply:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreProductReplyAddRequest request) { + if (storeProductReplyService.virtualCreate(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除评论表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:product:reply:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET) + public CommonResult delete(@PathVariable Integer id) { + if (storeProductReplyService.delete(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询评论表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:product:reply:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable Integer id) { + StoreProductReply storeProductReply = storeProductReplyService.getById(id); + return CommonResult.success(storeProductReply); + } + + /** + * 回复商品评论 + * @param request StoreProductReplyCommentRequest 回复参数 + */ + @PreAuthorize("hasAuthority('admin:product:reply:comment')") + @ApiOperation(value = "回复") + @RequestMapping(value = "/comment", method = RequestMethod.POST) + public CommonResult comment(@RequestBody StoreProductReplyCommentRequest request) { + if (storeProductReplyService.comment(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductRuleController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductRuleController.java new file mode 100644 index 0000000..4a221cb --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreProductRuleController.java @@ -0,0 +1,107 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.product.StoreProductRule; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductRuleRequest; +import com.yzt.common.request.StoreProductRuleSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.service.StoreProductRuleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 商品规则值(规格)表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/product/rule") +@Api(tags = "商品 -- 规则值(规格)") //配合swagger使用 +public class StoreProductRuleController { + + @Autowired + private StoreProductRuleService storeProductRuleService; + + /** + * 分页显示商品规则值(规格)表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:product:rule:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList( + @Validated StoreProductRuleSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage storeProductRuleCommonPage = + CommonPage.restPage(storeProductRuleService.getList(request, pageParamRequest)); + return CommonResult.success(storeProductRuleCommonPage); + } + + /** + * 新增商品规则值(规格)表 + * @param storeProductRuleRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:product:rule:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreProductRuleRequest storeProductRuleRequest) { + if (storeProductRuleService.save(storeProductRuleRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除商品规则值(规格)表 + * @param ids Integer + */ + @PreAuthorize("hasAuthority('admin:product:rule:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete/{ids}", method = RequestMethod.GET) + public CommonResult delete(@PathVariable String ids) { + if (storeProductRuleService.removeByIds(YztUtil.stringToArray(ids))) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改商品规则值(规格)表 + * @param storeProductRuleRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:product:rule:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated StoreProductRuleRequest storeProductRuleRequest) { + if (storeProductRuleService.updateRule(storeProductRuleRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询商品规则值(规格)表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:product:rule:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable Integer id) { + StoreProductRule storeProductRule = storeProductRuleService.getById(id); + return CommonResult.success(storeProductRule); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillController.java new file mode 100644 index 0000000..acf51b1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillController.java @@ -0,0 +1,117 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreSeckillAddRequest; +import com.yzt.common.request.StoreSeckillSearchRequest; +import com.yzt.common.response.StoreProductInfoResponse; +import com.yzt.common.response.StoreSeckillResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreSeckillService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 商品秒杀产品表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/seckill") +@Api(tags = "商品 -- 秒杀 -- 商品") //配合swagger使用 +public class StoreSeckillController { + + @Autowired + private StoreSeckillService storeSeckillService; + + /** + * 分页显示商品秒杀产品表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated StoreSeckillSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage storeSeckillCommonPage = + CommonPage.restPage(storeSeckillService.getList(request, pageParamRequest)); + return CommonResult.success(storeSeckillCommonPage); + } + + /** + * 新增商品秒杀产品表 + * @param storeSeckillRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreSeckillAddRequest storeSeckillRequest) { + if (storeSeckillService.saveSeckill(storeSeckillRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 删除商品秒杀产品表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:seckill:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (storeSeckillService.deleteById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改商品秒杀产品表 + * @param storeSeckillRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated StoreSeckillAddRequest storeSeckillRequest) { + if (storeSeckillService.updateSeckill(storeSeckillRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + @PreAuthorize("hasAuthority('admin:seckill:update:status')") + @ApiOperation(value = "修改秒杀商品状态") + @RequestMapping(value = "/update/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam @Validated Integer id, @RequestParam @Validated boolean status) { + if (storeSeckillService.updateSecKillStatus(id,status)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询商品秒杀产品表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:seckill:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + StoreProductInfoResponse storeSeckill = storeSeckillService.getDetailAdmin(id); + return CommonResult.success(storeSeckill); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillMangerController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillMangerController.java new file mode 100644 index 0000000..f591cc1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/StoreSeckillMangerController.java @@ -0,0 +1,122 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreSeckillMangerRequest; +import com.yzt.common.request.StoreSeckillMangerSearchRequest; +import com.yzt.common.response.StoreSeckillManagerResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreSeckillMangerService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 秒杀配置 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/store/seckill/manger") +@Api(tags = "商品 -- 秒杀 -- 配置") //配合swagger使用 +public class StoreSeckillMangerController { + + @Autowired + private StoreSeckillMangerService storeSeckillMangerService; + + /** + * 分页显示 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList( + @Validated StoreSeckillMangerSearchRequest request, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeSeckillMangerService.getList(request, pageParamRequest))); + } + + /** + * 新增 + * @param storeSeckillMangerRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated StoreSeckillMangerRequest storeSeckillMangerRequest) { + if (storeSeckillMangerService.saveManger(storeSeckillMangerRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + + /** + * 删除 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (storeSeckillMangerService.deleteLogicById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改 + * @param id integer id + * @param storeSeckillMangerRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated StoreSeckillMangerRequest storeSeckillMangerRequest) { + return storeSeckillMangerService.update(id, storeSeckillMangerRequest) ? CommonResult.success() : CommonResult.failed(); + } + + /** + * 查询信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(storeSeckillMangerService.detail(id)); + } + + /** + * 更新秒杀配置状态 + * @param id 配置id + * @param status 待更新配置状态 + * @return 更新结果 + */ + @PreAuthorize("hasAuthority('admin:seckill:manger:update:status')") + @ApiOperation(value = "秒杀配置状态更新") + @RequestMapping(value = "/update/status/{id}", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "商品id", dataType = "int", required = true), + @ApiImplicitParam(name = "status", value = "状态", dataType = "string", required = true) + }) + public CommonResult updateStatus(@PathVariable(value = "id") Integer id, String status) { + return CommonResult.success(storeSeckillMangerService.updateStatus(id,status)); + } + + +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAdminController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAdminController.java new file mode 100644 index 0000000..9bf6d10 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAdminController.java @@ -0,0 +1,134 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAdminAddRequest; +import com.yzt.common.request.SystemAdminRequest; +import com.yzt.common.request.SystemAdminUpdateRequest; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemAdminService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + + +/** + * 后台管理员表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/admin") +@Api(tags = "后台用户服务") +public class SystemAdminController { + + @Autowired + private SystemAdminService systemAdminService; + + /** + * 分页显示后台管理员表 + * @param systemAdminRequest 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:admin:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ResponseBody + public CommonResult> getList(@Validated SystemAdminRequest systemAdminRequest, PageParamRequest pageParamRequest) { + CommonPage systemAdminCommonPage = CommonPage.restPage(systemAdminService.getList(systemAdminRequest, pageParamRequest)); + return CommonResult.success(systemAdminCommonPage); + } + + /** + * 新增后台管理员 + * @param systemAdminAddRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:admin:save')") + @ApiOperation(value = "新增后台管理员") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody SystemAdminAddRequest systemAdminAddRequest) { + if (systemAdminService.saveAdmin(systemAdminAddRequest)) { + return CommonResult.success(); + } + return CommonResult.failed("添加管理员失败"); + } + + /** + * 删除后台管理员表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:admin:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemAdminService.removeById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改后台管理员表 + * @param systemAdminRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:admin:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody SystemAdminUpdateRequest systemAdminRequest) { + if (systemAdminService.updateAdmin(systemAdminRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 后台管理员详情 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:admin:info')") + @ApiOperation(value = "后台管理员详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") @Valid Integer id) { + return CommonResult.success(systemAdminService.getDetail(id)); + } + + /** + * 修改后台管理员状态 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:admin:update:status')") + @ApiOperation(value = "修改后台管理员状态") + @RequestMapping(value = "/updateStatus", method = RequestMethod.GET) + public CommonResult updateStatus(@RequestParam(value = "id") @Valid Integer id, @RequestParam(value = "status") @Valid Boolean status) { + if (systemAdminService.updateStatus(id, status)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } + + /** + * 修改后台管理员是否接收状态 + */ + @PreAuthorize("hasAuthority('admin:system:admin:update:sms')") + @ApiOperation(value = "修改后台管理员是否接收状态") + @RequestMapping(value = "/update/isSms", method = RequestMethod.GET) + public CommonResult updateIsSms(@RequestParam(value = "id") @Valid Integer id) { + if (systemAdminService.updateIsSms(id)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAttachmentController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAttachmentController.java new file mode 100644 index 0000000..945bbac --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemAttachmentController.java @@ -0,0 +1,123 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemAttachment; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAttachmentMoveRequest; +import com.yzt.common.request.SystemAttachmentRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.service.SystemAttachmentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 附件管理表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/attachment") +@Api(tags = "附件管理") //配合swagger使用 +public class SystemAttachmentController { + + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 分页显示附件管理表 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:attachment:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList( + @RequestParam @Validated Integer pid, + @RequestParam( + value = "attType", + defaultValue = "png,jpeg,jpg,audio/mpeg,text/plain,video/mp4,gif", + required = false) String attType, + @Validated PageParamRequest pageParamRequest) { + CommonPage systemAttachmentCommonPage = + CommonPage.restPage(systemAttachmentService.getList(pid, attType, pageParamRequest)); + return CommonResult.success(systemAttachmentCommonPage); + } + + /** + * 新增附件管理表 TODO:未使用的话删除此接口 + * @param systemAttachmentRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:attachment:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemAttachmentRequest systemAttachmentRequest) { + if (systemAttachmentService.add(systemAttachmentRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除附件管理表 + * @param ids String + */ + @PreAuthorize("hasAuthority('admin:system:attachment:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete/{ids}", method = RequestMethod.GET) + public CommonResult delete(@PathVariable String ids) { + if (systemAttachmentService.removeByIds(YztUtil.stringToArray(ids))) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改附件管理表 + * @param id integer id + * @param systemAttachmentRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:attachment:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, + @RequestBody @Validated SystemAttachmentRequest systemAttachmentRequest) { + systemAttachmentRequest.setAttId(id); + if (systemAttachmentService.edit(systemAttachmentRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询附件管理表信息 + * @param move SystemAttachmentMoveRequest + */ + @PreAuthorize("hasAuthority('admin:system:attachment:move')") + @ApiOperation(value = "更改图片目录") + @RequestMapping(value = "/move", method = RequestMethod.POST) + public CommonResult updateAttrId(@RequestBody @Validated SystemAttachmentMoveRequest move) { + if (systemAttachmentService.updateAttrId(move)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 附件详情 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:attachment:info')") + @ApiOperation(value = "附件详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable Integer id) { + return CommonResult.success(systemAttachmentService.getById(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemCityController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemCityController.java new file mode 100644 index 0000000..52b4c76 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemCityController.java @@ -0,0 +1,100 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemCity; +import com.yzt.common.request.SystemCityRequest; +import com.yzt.common.request.SystemCitySearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.SystemCityTreeVo; +import com.yzt.service.service.SystemCityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 城市表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/city") +@Api(tags = "城市管理") +public class SystemCityController { + + @Autowired + private SystemCityService systemCityService; + + /** + * 分页城市列表 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:system:city:list')") + @ApiOperation(value = "分页城市列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult getList(@Validated SystemCitySearchRequest request) { + return CommonResult.success(systemCityService.getList(request)); + } + + /** + * 修改城市 + * @param id 城市id + * @param request 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:city:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @Validated SystemCityRequest request) { + if (systemCityService.update(id, request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改状态 + * @param id 城市id + * @param status 状态 + */ + @PreAuthorize("hasAuthority('admin:system:city:update:status')") + @ApiOperation(value = "修改状态") + @RequestMapping(value = "/update/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam Integer id, @RequestParam Boolean status) { + if (systemCityService.updateStatus(id, status)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 城市详情 + * @param id 城市id + */ + @PreAuthorize("hasAuthority('admin:system:city:info')") + @ApiOperation(value = "城市详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(systemCityService.getById(id)); + } + + /** + * 获取tree结构的列表 + */ + @PreAuthorize("hasAuthority('admin:system:city:list:tree')") + @ApiOperation(value = "获取tree结构的列表") + @RequestMapping(value = "/list/tree", method = RequestMethod.GET) + public CommonResult> getListTree() { + return CommonResult.success(systemCityService.getListTree()); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemConfigController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemConfigController.java new file mode 100644 index 0000000..0928d5f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemConfigController.java @@ -0,0 +1,124 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.request.SaveConfigRequest; +import com.yzt.common.request.SystemFormCheckRequest; +import com.yzt.common.response.AdminSiteLogoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; + + +/** + * 配置表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/config") +@Api(tags = "设置 -- Config") +public class SystemConfigController { + + @Autowired + private SystemConfigService systemConfigService; + + @PreAuthorize("hasAuthority('admin:system:config:info')") + @ApiOperation(value = "表单详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult> info(@RequestParam(value = "formId") Integer formId) { + return CommonResult.success(systemConfigService.info(formId)); + } + + @PreAuthorize("hasAuthority('admin:system:config:save:form')") + @ApiOperation(value = "整体保存表单数据") + @RequestMapping(value = "/save/form", method = RequestMethod.POST) + public CommonResult saveFrom(@RequestBody @Validated SystemFormCheckRequest systemFormCheckRequest) { + if (systemConfigService.saveForm(systemFormCheckRequest)) { + return CommonResult.success("表单保存成功"); + } + return CommonResult.failed("表单保存失败"); + } + + @PreAuthorize("hasAuthority('admin:system:config:upload:type')") + @ApiOperation(value = "获取文件存储类型") + @RequestMapping(value = "/get/upload/type", method = RequestMethod.GET) + public CommonResult getFileUploadType() { + return CommonResult.success(systemConfigService.getFileUploadType()); + } + +// @PreAuthorize("hasAuthority('admin:system:config:site:logo')") + @ApiOperation(value = "获取管理端logo") + @RequestMapping(value = "/get/site/logo", method = RequestMethod.GET) + public CommonResult getSiteLogo() { + return CommonResult.success(systemConfigService.getSiteLogo()); + } + + @PreAuthorize("hasAuthority('admin:system:config:tx:map:key')") + @ApiOperation(value = "获取腾讯地图key") + @RequestMapping(value = "/get/tx/map/key", method = RequestMethod.GET) + public CommonResult getTxMapKey() { + return CommonResult.success(systemConfigService.getTxMapKey()); + } + + @PreAuthorize("hasAuthority('admin:system:config:home:page:list:style')") + @ApiOperation(value = "获取移动端首页列表样式") + @RequestMapping(value = "/get/home/page/list/style", method = RequestMethod.GET) + public CommonResult getHomePageSaleListStyle() { + return CommonResult.success(systemConfigService.getHomePageSaleListStyle()); + } + + @PreAuthorize("hasAuthority('admin:system:config:home:page:list:style:save')") + @ApiOperation(value = "保存移动端首页列表样式") + @RequestMapping(value = "/save/home/page/list/style", method = RequestMethod.POST) + public CommonResult saveHomePageSaleListStyle(@RequestBody SaveConfigRequest request) { + if (systemConfigService.saveHomePageSaleListStyle(request)) { + return CommonResult.success("保存成功"); + } + return CommonResult.failed("保存失败"); + } + + @PreAuthorize("hasAuthority('admin:system:config:auth:host:get')") + @ApiOperation(value = "获取授权地址") + @RequestMapping(value = "/get/auth/host", method = RequestMethod.GET) + public CommonResult getAuthHost() { + return CommonResult.success(systemConfigService.getAuthHost()); + } + + @PreAuthorize("hasAuthority('admin:system:config:change:color:get')") + @ApiOperation(value = "获取主题色") + @RequestMapping(value = "/get/change/color", method = RequestMethod.GET) + public CommonResult getChangeColor() { + return CommonResult.success(systemConfigService.getChangeColor()); + } + + @PreAuthorize("hasAuthority('admin:system:config:change:color:save')") + @ApiOperation(value = "保存主题色") + @RequestMapping(value = "/save/change/color", method = RequestMethod.POST) + public CommonResult saveChangeColor(@RequestBody SaveConfigRequest request) { + if (systemConfigService.saveChangeColor(request)) { + return CommonResult.success("保存成功"); + } + return CommonResult.failed("保存失败"); + } + + @PreAuthorize("hasAuthority('admin:system:config:clear:cache')") + @ApiOperation(value = "清除config缓存") + @RequestMapping(value = "/clear/cache", method = RequestMethod.POST) + public CommonResult clearCache() { + if (systemConfigService.clearCache()) { + return CommonResult.success("清除成功"); + } + return CommonResult.failed("清除失败"); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemFormTempController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemFormTempController.java new file mode 100644 index 0000000..3679f2f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemFormTempController.java @@ -0,0 +1,88 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemFormTemp; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemFormTempRequest; +import com.yzt.common.request.SystemFormTempSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemFormTempService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 表单模板 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/form/temp") +@Api(tags = "设置 -- 表单模板") +public class SystemFormTempController { + + @Autowired + private SystemFormTempService systemFormTempService; + + /** + * 分页显示表单模板 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:form:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemFormTempSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage systemFormTempCommonPage = CommonPage.restPage(systemFormTempService.getList(request, pageParamRequest)); + return CommonResult.success(systemFormTempCommonPage); + } + + /** + * 新增表单模板 + * @param systemFormTempRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:form:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemFormTempRequest systemFormTempRequest) { + if (systemFormTempService.add(systemFormTempRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改表单模板 + * @param id integer id + * @param systemFormTempRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:form:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated SystemFormTempRequest systemFormTempRequest) { + if (systemFormTempService.edit(id, systemFormTempRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询表单模板信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:form:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + SystemFormTemp systemFormTemp = systemFormTempService.getById(id); + return CommonResult.success(systemFormTemp); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupController.java new file mode 100644 index 0000000..deba339 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupController.java @@ -0,0 +1,104 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemGroup; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemGroupRequest; +import com.yzt.common.request.SystemGroupSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemGroupService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 组合数据表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/group") +@Api(tags = "设置 -- 组合数据") +public class SystemGroupController { + + @Autowired + private SystemGroupService systemGroupService; + + /** + * 分页显示组合数据表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemGroupSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage systemGroupCommonPage = CommonPage.restPage(systemGroupService.getList(request, pageParamRequest)); + return CommonResult.success(systemGroupCommonPage); + } + + /** + * 新增组合数据 + * @param systemGroupRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@Validated SystemGroupRequest systemGroupRequest) { + if (systemGroupService.add(systemGroupRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除组合数据表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:group:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemGroupService.delete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改组合数据表 + * @param id integer id + * @param systemGroupRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @Validated SystemGroupRequest systemGroupRequest) { + if (systemGroupService.edit(id, systemGroupRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询组合数据表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:group:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(systemGroupService.getById(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupDataController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupDataController.java new file mode 100644 index 0000000..624e2a2 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemGroupDataController.java @@ -0,0 +1,102 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemGroupData; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemGroupDataRequest; +import com.yzt.common.request.SystemGroupDataSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemGroupDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 组合数据详情表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/group/data") +@Api(tags = "设置 -- 组合数据 -- 详情") +public class SystemGroupDataController { + + @Autowired + private SystemGroupDataService systemGroupDataService; + + /** + * 分页组合数据详情 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:data:list')") + @ApiOperation(value = "分页组合数据详情") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemGroupDataSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage systemGroupDataCommonPage = CommonPage.restPage(systemGroupDataService.getList(request, pageParamRequest)); + return CommonResult.success(systemGroupDataCommonPage); + } + + /** + * 新增组合数据详情 + * @param systemGroupDataRequest SystemFormCheckRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:data:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemGroupDataRequest systemGroupDataRequest) { + if (systemGroupDataService.create(systemGroupDataRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除组合数据详情表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:group:data:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemGroupDataService.removeById(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改组合数据详情表 + * @param id integer id + * @param request 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:group:data:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated SystemGroupDataRequest request) { + if (systemGroupDataService.update(id, request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 组合数据详情信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:group:data:info')") + @ApiOperation(value = "组合数据详情信息") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + SystemGroupData systemGroupData = systemGroupDataService.getById(id); + return CommonResult.success(systemGroupData); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemMenuController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemMenuController.java new file mode 100644 index 0000000..56487b2 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemMenuController.java @@ -0,0 +1,121 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.request.SystemMenuRequest; +import com.yzt.common.request.SystemMenuSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.MenuCheckVo; +import com.yzt.service.service.SystemMenuService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 系统菜单管理 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/menu") +@Api(tags = "系统菜单管理") +public class SystemMenuController { + + @Autowired + private SystemMenuService systemMenuService; + + /** + * 菜单列表 + * @param request 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:system:menu:list')") + @ApiOperation(value = "菜单列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemMenuSearchRequest request) { + return CommonResult.success(systemMenuService.getAdminList(request)); + } + + /** + * 新增菜单 + * @param systemMenuRequest 新增菜单 + */ + @PreAuthorize("hasAuthority('admin:system:menu:add')") + @ApiOperation(value = "新增菜单") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public CommonResult add(@RequestBody @Validated SystemMenuRequest systemMenuRequest) { + if (systemMenuService.add(systemMenuRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除菜单 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:menu:delete')") + @ApiOperation(value = "删除菜单") + @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST) + public CommonResult delete(@PathVariable(value = "id") Integer id) { + if (systemMenuService.deleteById(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改菜单 + */ + @PreAuthorize("hasAuthority('admin:system:menu:update')") + @ApiOperation(value = "修改菜单") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated SystemMenuRequest systemMenuRequest) { + if (systemMenuService.edit(systemMenuRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 菜单详情 + */ + @PreAuthorize("hasAuthority('admin:system:menu:info')") + @ApiOperation(value = "菜单详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable(value = "id") Integer id) { + return CommonResult.success(systemMenuService.getInfo(id)); + } + + /** + * 修改菜单显示状态 + */ + @PreAuthorize("hasAuthority('admin:system:menu:show:status')") + @ApiOperation(value = "修改菜单显示状态") + @RequestMapping(value = "/updateShowStatus/{id}", method = RequestMethod.POST) + public CommonResult updateShowStatus(@PathVariable(value = "id") Integer id) { + if (systemMenuService.updateShowStatus(id)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } + + /** + * 菜单缓存树 + */ + @PreAuthorize("hasAuthority('admin:system:menu:cache:tree')") + @ApiOperation(value = "菜单缓存树") + @RequestMapping(value = "/cache/tree", method = RequestMethod.GET) + public CommonResult> getCacheTree() { + return CommonResult.success(systemMenuService.getCacheTree()); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemNotificationController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemNotificationController.java new file mode 100644 index 0000000..5afacc1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemNotificationController.java @@ -0,0 +1,108 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.request.NotificationInfoRequest; +import com.yzt.common.request.NotificationSearchRequest; +import com.yzt.common.request.NotificationUpdateRequest; +import com.yzt.common.response.NotificationInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemNotificationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 通知设置 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/notification") +@Api(tags = "通知设置-前端控制器") //配合swagger使用 +public class SystemNotificationController { + + @Autowired + private SystemNotificationService systemNotificationService; + + /** + * 系统通知列表 + * @param request ExpressSearchRequest 搜索条件 + */ + @PreAuthorize("hasAuthority('admin:system:notification:list')") + @ApiOperation(value = "系统通知列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated NotificationSearchRequest request) { + return CommonResult.success(systemNotificationService.getList(request)); + } + + /** + * 公众号模板开关 + */ + @PreAuthorize("hasAuthority('admin:system:notification:wechat:switch')") + @ApiOperation(value = "公众号模板开关") + @RequestMapping(value = "/wechat/switch/{id}", method = RequestMethod.POST) + public CommonResult wechatSwitch(@PathVariable Integer id) { + if (systemNotificationService.wechatSwitch(id)) { + return CommonResult.success("更改成功"); + } + return CommonResult.failed("更改失败"); + } + + /** + * 小程序订阅模板开关 + */ + @PreAuthorize("hasAuthority('admin:system:notification:routine:switch')") + @ApiOperation(value = "小程序订阅模板开关") + @RequestMapping(value = "/routine/switch/{id}", method = RequestMethod.POST) + public CommonResult routineSwitch(@PathVariable Integer id) { + if (systemNotificationService.routineSwitch(id)) { + return CommonResult.success("更改成功"); + } + return CommonResult.failed("更改失败"); + } + + /** + * 发送短信开关 + */ + @PreAuthorize("hasAuthority('admin:system:notification:sms:switch')") + @ApiOperation(value = "发送短信开关") + @RequestMapping(value = "/sms/switch/{id}", method = RequestMethod.POST) + public CommonResult smsSwitch(@PathVariable Integer id) { + if (systemNotificationService.smsSwitch(id)) { + return CommonResult.success("更改成功"); + } + return CommonResult.failed("更改失败"); + } + + /** + * 通知详情 + */ + @PreAuthorize("hasAuthority('admin:system:notification:detail')") + @ApiOperation(value = "通知详情") + @RequestMapping(value = "/detail", method = RequestMethod.GET) + public CommonResult info(@Validated NotificationInfoRequest request) { + return CommonResult.success(systemNotificationService.getDetail(request)); + } + + /** + * 修改通知 + */ + @PreAuthorize("hasAuthority('admin:system:notification:update')") + @ApiOperation(value = "修改通知") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@Validated @RequestBody NotificationUpdateRequest request) { + if (systemNotificationService.modify(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemRoleController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemRoleController.java new file mode 100644 index 0000000..0944a82 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemRoleController.java @@ -0,0 +1,114 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemRole; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemRoleRequest; +import com.yzt.common.request.SystemRoleSearchRequest; +import com.yzt.common.response.RoleInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemRoleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 身份管理表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/role") +@Api(tags = "设置 -- 权限管理 -- 身份管理") +public class SystemRoleController { + + @Autowired + private SystemRoleService systemRoleService; + + /** + * 分页显示身份管理表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:role:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemRoleSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage systemRoleCommonPage = CommonPage.restPage(systemRoleService.getList(request, pageParamRequest)); + return CommonResult.success(systemRoleCommonPage); + } + + /** + * 新增身份 + * @param systemRoleRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:role:save')") + @ApiOperation(value = "新增身份") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemRoleRequest systemRoleRequest) { + if (systemRoleService.add(systemRoleRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除身份管理表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:role:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemRoleService.delete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改身份管理表 + * @param systemRoleRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:role:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated SystemRoleRequest systemRoleRequest) { + if (systemRoleService.edit(systemRoleRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询身份详情 + * @param id String + */ + @PreAuthorize("hasAuthority('admin:system:role:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable Integer id) { + return CommonResult.success(systemRoleService.getInfo(id)); + } + + /** + * 修改身份状态 + */ + @PreAuthorize("hasAuthority('admin:system:role:update:status')") + @ApiOperation(value = "修改身份状态") + @RequestMapping(value = "/updateStatus", method = RequestMethod.GET) + public CommonResult updateStatus(@Validated @RequestParam(value = "id") Integer id, @Validated @RequestParam(value = "status") Boolean status) { + if (systemRoleService.updateStatus(id, status)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreController.java new file mode 100644 index 0000000..0e65469 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreController.java @@ -0,0 +1,155 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemStoreRequest; +import com.yzt.common.request.SystemStoreSearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemStoreService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; + + +/** + * 门店自提 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/store") +@Api(tags = "设置 -- 提货点 -- 提货点") +public class SystemStoreController { + + @Autowired + private SystemStoreService systemStoreService; + + /** + * 分页显示门店自提 + * @param request SystemStoreSearchRequest 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:store:list')") + @ApiOperation(value = "门店自提分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated SystemStoreSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage expressCommonPage = CommonPage.restPage(systemStoreService.getList(request.getKeywords(), request.getStatus(), pageParamRequest)); + return CommonResult.success(expressCommonPage); + } + + /** + * 数量 + */ + @PreAuthorize("hasAuthority('admin:system:store:count')") + @ApiOperation(value = "数量") + @RequestMapping(value = "/getCount", method = RequestMethod.GET) + public CommonResult> getCount( @RequestParam(value = "keywords", defaultValue = "") String keywords) { + return CommonResult.success(systemStoreService.getCount(keywords)); + } + + /** + * 新增门店自提 + * @param request SystemStoreRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:store:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemStoreRequest request) { + if (systemStoreService.create(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + + /** + * 删除门店自提 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:store:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemStoreService.delete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改门店自提 + * @param id integer id + * @param request 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:store:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated SystemStoreRequest request) { + if (systemStoreService.update(id, request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改门店显示状态 + * @param id integer id + * @param status 状态 + */ + @PreAuthorize("hasAuthority('admin:system:store:update:status')") + @ApiOperation(value = "修改门店显示状态") + @RequestMapping(value = "/update/status", method = RequestMethod.GET) + public CommonResult updateStatus(@RequestParam Integer id, @RequestParam Boolean status) { + if (systemStoreService.updateStatus(id, status)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 门店自提详情 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:store:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(systemStoreService.getInfo(id)); + } + + /** + * 彻底删除 + */ + @PreAuthorize("hasAuthority('admin:system:store:completely:delete')") + @ApiOperation(value = "彻底删除") + @RequestMapping(value = "/completely/delete", method = RequestMethod.GET) + public CommonResult completeLyDelete(@RequestParam(value = "id") Integer id) { + if (systemStoreService.completeLyDelete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 恢复 + */ + @PreAuthorize("hasAuthority('admin:system:store:recovery')") + @ApiOperation(value = "提货点恢复") + @RequestMapping(value = "/recovery", method = RequestMethod.GET) + public CommonResult recovery(@RequestParam(value = "id") Integer id) { + if (systemStoreService.recovery(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreStaffController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreStaffController.java new file mode 100644 index 0000000..3347ee2 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemStoreStaffController.java @@ -0,0 +1,117 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemStoreStaff; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemStoreStaffRequest; +import com.yzt.common.response.SystemStoreStaffResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemStoreStaffService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + + +/** + * 门店店员表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/store/staff") +@Api(tags = "设置 -- 提货点 -- 核销员") +public class SystemStoreStaffController { + + @Autowired + private SystemStoreStaffService systemStoreStaffService; + + /** + * 分页显示门店核销员列表 + * @param storeId 门店id + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:staff:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@RequestParam(name = "storeId", required = false, defaultValue = "0") Integer storeId, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage systemStoreStaffCommonPage = + CommonPage.restPage(systemStoreStaffService.getList(storeId, pageParamRequest)); + return CommonResult.success(systemStoreStaffCommonPage); + } + + /** + * 新增门店店员表 + * @param systemStoreStaffRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:system:staff:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @ModelAttribute SystemStoreStaffRequest systemStoreStaffRequest) { + if (systemStoreStaffService.saveUnique(systemStoreStaffRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除门店店员表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:staff:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (systemStoreStaffService.removeById(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改门店店员表 + * @param id integer id + * @param systemStoreStaffRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:system:staff:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @ModelAttribute SystemStoreStaffRequest systemStoreStaffRequest) { + if (systemStoreStaffService.edit(id, systemStoreStaffRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改门店店员表 + * @param id integer id + * @param status 状态 + */ + @PreAuthorize("hasAuthority('admin:system:staff:update:status')") + @ApiOperation(value = "修改状态") + @RequestMapping(value = "/update/status", method = RequestMethod.GET) + public CommonResult updateStatus(@RequestParam Integer id, @RequestParam Integer status) { + if (systemStoreStaffService.updateStatus(id, status)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询门店店员表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:system:staff:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(systemStoreStaffService.getById(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemUserLevelController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemUserLevelController.java new file mode 100644 index 0000000..d340214 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemUserLevelController.java @@ -0,0 +1,99 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.request.SystemUserLevelRequest; +import com.yzt.common.request.SystemUserLevelUpdateShowRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemUserLevelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 设置用户等级表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/user/level") +@Api(tags = "设置 -- 会员等级") +public class SystemUserLevelController { + + @Autowired + private SystemUserLevelService systemUserLevelService; + + /** + * 分页显示设置用户等级表 + */ + @PreAuthorize("hasAuthority('admin:system:user:level:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList() { + return CommonResult.success(systemUserLevelService.getList()); + } + + /** + * 新增等级 + */ + @PreAuthorize("hasAuthority('admin:system:user:level:save')") + @ApiOperation(value = "新增等级") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated SystemUserLevelRequest request) { + if (systemUserLevelService.create(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除等级 + * @param id 等级id + */ + @PreAuthorize("hasAuthority('admin:system:user:level:delete')") + @ApiOperation(value = "删除等级") + @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST) + public CommonResult delete(@PathVariable(value = "id") Integer id) { + if (systemUserLevelService.delete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 更新等级 + */ + @PreAuthorize("hasAuthority('admin:system:user:level:update')") + @ApiOperation(value = "更新等级") + @RequestMapping(value = "/update/{id}", method = RequestMethod.POST) + public CommonResult update(@PathVariable(value = "id") Integer id, + @RequestBody @Validated SystemUserLevelRequest request) { + if (systemUserLevelService.update(id, request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 使用/禁用 + */ + @PreAuthorize("hasAuthority('admin:system:user:level:use')") + @ApiOperation(value = "使用/禁用") + @RequestMapping(value = "/use", method = RequestMethod.POST) + public CommonResult use(@RequestBody @Validated SystemUserLevelUpdateShowRequest request) { + if (systemUserLevelService.updateShow(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemWriteOffOrderController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemWriteOffOrderController.java new file mode 100644 index 0000000..94dc4f8 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/SystemWriteOffOrderController.java @@ -0,0 +1,48 @@ +package com.yzt.admin.controller; + +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemWriteOffOrderSearchRequest; +import com.yzt.common.response.SystemWriteOffOrderResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreOrderService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 订单表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/store/order") +@Api(tags = "设置 -- 提货点 -- 核销订单") //配合swagger使用 +public class SystemWriteOffOrderController { + + @Autowired + private StoreOrderService storeOrderService; + + /** + * 分页显示订单表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:system:order:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.POST) + public CommonResult getList( + @Validated SystemWriteOffOrderSearchRequest request, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(storeOrderService.getWriteOffList(request, pageParamRequest)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/TemplateMessageController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/TemplateMessageController.java new file mode 100644 index 0000000..3a0e7f9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/TemplateMessageController.java @@ -0,0 +1,57 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.TemplateMessageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 微信模板 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/wechat/template") +@Api(tags = "微信 -- 消息模版") //配合swagger使用 +public class TemplateMessageController { + + @Autowired + private TemplateMessageService templateMessageService; + + /** + * 公众号模板消息同步 + */ + @PreAuthorize("hasAuthority('admin:wechat:whcbqhn:sync')") + @ApiOperation(value = "公众号模板消息同步") + @RequestMapping(value = "/whcbqhn/sync", method = RequestMethod.POST) + public CommonResult whcbqhnSync() { + if (templateMessageService.whcbqhnSync()) { + return CommonResult.success("公众号模板消息同步成功"); + } + return CommonResult.failed("公众号模板消息同步失败"); + } + + /** + * 小程序订阅消息同步 + */ + @PreAuthorize("hasAuthority('admin:wechat:routine:sync')") + @ApiOperation(value = "小程序订阅消息同步") + @RequestMapping(value = "/routine/sync", method = RequestMethod.POST) + public CommonResult routineSync() { + if (templateMessageService.routineSync()) { + return CommonResult.success("小程序订阅消息同步成功"); + } + return CommonResult.failed("小程序订阅消息同步失败"); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/TenantController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/TenantController.java new file mode 100644 index 0000000..ac71294 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/TenantController.java @@ -0,0 +1,80 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.TenantPageRequest; +import com.yzt.common.request.TenantSaveRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.TenantVo; +import com.yzt.common.vo.WechatMerchantConfigVo; +import com.yzt.service.service.TenantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +@Slf4j +@RestController +@RequestMapping("api/admin/system/tenant") +@Api(tags = "租户服务") +public class TenantController { + + @Autowired + private TenantService tenantService; + + @ApiOperation(value = "保存租户") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody TenantSaveRequest tenantSaveRequest) { + return CommonResult.success(tenantService.saveTenant(tenantSaveRequest)); + } + + + @GetMapping("/my-tenants") + public CommonResult> getCurrentAdminTenants() { + return CommonResult.success(tenantService.getTenantsByCurrentAdmin()); + } + /** + * 分页显示后台管理员表 + * @param tenantRequest 搜索条件 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ResponseBody + public CommonResult> getList(@Validated TenantPageRequest tenantRequest, PageParamRequest pageParamRequest) { + CommonPage tenantCommonPage = CommonPage.restPage(tenantService.getList(tenantRequest, pageParamRequest)); + return CommonResult.success(tenantCommonPage); + } + + @ApiOperation("获取租户详情") + @GetMapping("/info/{tenantId}") + public CommonResult info(@PathVariable(value = "tenantId") Long tenantId) { + return CommonResult.success(tenantService.getInfo(tenantId)); + } + + @ApiOperation("启用/禁用租户") + @PostMapping("/setStatus") + public CommonResult setStatus(@RequestBody @Validated Integer status ,Long tenantId) { + return CommonResult.success(tenantService.setStatus(status,tenantId)); + } + + + @ApiOperation(value = "物理删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (tenantService.removeById(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UploadController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UploadController.java new file mode 100644 index 0000000..d07a81a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UploadController.java @@ -0,0 +1,70 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.FileResultVo; +import com.yzt.service.service.UploadService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + + +/** + * 上传文件 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/upload") +@Api(tags = "上传文件") +public class UploadController { + + @Autowired + private UploadService uploadService; + + /** + * 图片上传 + */ +// @PreAuthorize("hasAuthority('admin:upload:image')") + @ApiOperation(value = "图片上传") + @RequestMapping(value = "/image", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "model", value = "模块 用户user,商品product,微信wechat,news文章"), + @ApiImplicitParam(name = "pid", value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 ", allowableValues = "range[0,1,2,3,4,5,6,7,8]") + }) + public CommonResult image(MultipartFile multipart, + @RequestParam(value = "model") String model, + @RequestParam(value = "pid") Integer pid) throws IOException { + return CommonResult.success(uploadService.imageUpload(multipart, model, pid)); + } + + /** + * 文件上传 + */ +// @PreAuthorize("hasAuthority('admin:upload:file')") + @ApiOperation(value = "文件上传") + @RequestMapping(value = "/file", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "model", value = "模块 用户user,商品product,微信wechat,news文章"), + @ApiImplicitParam(name = "pid", value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 ", allowableValues = "range[0,1,2,3,4,5,6,7,8]") + }) + public CommonResult file(MultipartFile multipart, + @RequestParam(value = "model") String model, + @RequestParam(value = "pid") Integer pid) throws IOException { + return CommonResult.success(uploadService.fileUpload(multipart, model, pid)); + } + +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserController.java new file mode 100644 index 0000000..8c132ae --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserController.java @@ -0,0 +1,240 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.TopDetail; +import com.yzt.common.response.UserBrokerageRecordResponse; +import com.yzt.common.response.UserCenterResponse; +import com.yzt.common.response.UserResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserBrokerageRecordService; +import com.yzt.service.service.UserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import java.util.List; + +/** + * 用户表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user") +@Api(tags = "会员管理") +@Validated +public class UserController { + @Autowired + private UserService userService; + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + /** + * 分页显示用户表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:user:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@ModelAttribute @Validated UserSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage userCommonPage = CommonPage.restPage(userService.getList(request, pageParamRequest)); + return CommonResult.success(userCommonPage); + } + + @ApiOperation(value = "指定用户(uid)的被推广人列表") + @RequestMapping(value = "/promoted", method = RequestMethod.GET) + public CommonResult> getPromotedUserList(@ModelAttribute @Validated UserSearchRequest request, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage userCommonPage = CommonPage.restPage(userService.getPromotedUserList(request, pageParamRequest)); + return CommonResult.success(userCommonPage); + } + + @ApiOperation(value = "获取指定用户的奖励记录列表") + @RequestMapping(value = "/brokerage/{uid}", method = RequestMethod.GET) + public CommonResult> getUserBrokerageRecords(@PathVariable Integer uid,String customerName, String phone, + @ModelAttribute PageParamRequest pageParamRequest) { + CommonPage userCommonPage = CommonPage.restPage(userBrokerageRecordService.getUserBrokerageRecords(uid, customerName,phone,pageParamRequest)); + return CommonResult.success(userCommonPage); + } + /** + * 创建用户表 + * @param userRequest 创建参数 + */ + @ApiOperation(value = "创建") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public CommonResult create(@RequestBody @Validated UserCreateRequest userRequest) { + if (userService.createUser(userRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改用户表 + * @param id integer id + * @param userRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:user:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated UserUpdateRequest userRequest) { + userRequest.setUid(id); + if (userService.updateUser(userRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改用户手机号 + * @param id 用户uid + * @param phone 手机号 + */ + @PreAuthorize("hasAuthority('admin:user:update:phone')") + @ApiOperation(value = "修改用户手机号") + @RequestMapping(value = "/update/phone", method = RequestMethod.GET) + public CommonResult updatePhone(@RequestParam(name = "id") Integer id, @RequestParam(name = "phone") String phone) { + if (userService.updateUserPhone(id, phone)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 用户详情 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:user:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(userService.getInfoByUid(id)); + } + + /** + * 用户详情 + * @param phone Integer + */ + @ApiOperation(value = "详情通过手机号查询") + @RequestMapping(value = "/by-phone", method = RequestMethod.GET) + public CommonResult infoByPhone(@RequestParam(value = "phone") String phone) { + return CommonResult.success(userService.getUserCenterResponseByPhone(phone)); + } + + /** + * 根据参数类型查询会员对应的信息 + * @param userId Integer 会员id + * @param type int 类型 0=消费记录,1=积分明细,2=签到记录,3=持有优惠券,4=余额变动,5=好友关系 + * @param pageParamRequest PageParamRequest 分页 + */ + @PreAuthorize("hasAuthority('admin:user:infobycondition')") + @ApiOperation(value="会员详情") + @RequestMapping(value = "/infobycondition", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId",example = "1", required = true), + @ApiImplicitParam(name = "type", value="0=消费记录,1=积分明细,2=签到记录,3=持有优惠券,4=余额变动,5=好友关系", example = "0" + , required = true) + }) + public CommonResult> infoByCondition(@RequestParam(name = "userId") @Valid Integer userId, + @RequestParam(name = "type") @Valid @Max(5) @Min(0) int type, + @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage((List) userService.getInfoByCondition(userId,type,pageParamRequest))); + } + + /** + * 会员详情页Top数据 + */ + @PreAuthorize("hasAuthority('admin:user:topdetail')") + @ApiOperation(value = "会员详情页Top数据") + @RequestMapping(value = "topdetail", method = RequestMethod.GET) + public CommonResult topDetail (@RequestParam @Valid Integer userId) { + return CommonResult.success(userService.getTopDetail(userId)); + } + + /** + * 操作积分 + */ + @PreAuthorize("hasAuthority('admin:user:operate:founds')") + @ApiOperation(value = "积分余额") + @RequestMapping(value = "/operate/founds", method = RequestMethod.GET) + public CommonResult founds(@Validated UserOperateIntegralMoneyRequest request) { + if (userService.updateIntegralMoney(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 会员分组 + * @param id String id + * @param groupId Integer 分组Id + */ + @PreAuthorize("hasAuthority('admin:user:group')") + @ApiOperation(value = "分组") + @RequestMapping(value = "/group", method = RequestMethod.POST) + public CommonResult group(@RequestParam String id, @RequestParam String groupId) { + if (userService.group(id, groupId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 会员标签 + * @param id String id + * @param tagId Integer 标签id + */ + @PreAuthorize("hasAuthority('admin:user:tag')") + @ApiOperation(value = "标签") + @RequestMapping(value = "/tag", method = RequestMethod.POST) + public CommonResult tag(@RequestParam String id, @RequestParam String tagId) { + if (userService.tag(id, tagId)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改上级推广人 + */ + @PreAuthorize("hasAuthority('admin:user:update:spread')") + @ApiOperation(value = "修改上级推广人") + @RequestMapping(value = "/update/spread", method = RequestMethod.POST) + public CommonResult editSpread(@Validated @RequestBody UserUpdateSpreadRequest request) { + if (userService.editSpread(request)) { + return CommonResult.success("修改成功"); + } + return CommonResult.failed("修改失败"); + } + + /** + * 更新用户会员等级 + */ + @PreAuthorize("hasAuthority('admin:user:update:level')") + @ApiOperation(value = "更新用户会员等级") + @RequestMapping(value = "/update/level", method = RequestMethod.POST) + public CommonResult updateUserLevel(@Validated @RequestBody UpdateUserLevelRequest request) { + if (userService.updateUserLevel(request)) { + return CommonResult.success("更新成功"); + } + return CommonResult.failed("更新失败"); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserExtractController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserExtractController.java new file mode 100644 index 0000000..a98f8eb --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserExtractController.java @@ -0,0 +1,122 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserExtractRequest; +import com.yzt.common.request.UserExtractSearchRequest; +import com.yzt.common.response.BalanceResponse; +import com.yzt.common.response.UserExtractDetailResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserExtractService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 用户提现表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/finance/apply") +@Api(tags = "财务 -- 提现申请") +public class UserExtractController { + + @Autowired + private UserExtractService userExtractService; + + /** + * 分页显示用户提现表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:finance:apply:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated UserExtractSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage userExtractCommonPage = CommonPage.restPage(userExtractService.getList(request, pageParamRequest)); + return CommonResult.success(userExtractCommonPage); + } + + /** + * 修改用户提现表 + * @param id integer id + * @param userExtractRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:finance:apply:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @Validated UserExtractRequest userExtractRequest){ + if (userExtractService.updateExtract(id, userExtractRequest)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 提现申请详情 + * @param id 提现申请记录id + */ + @PreAuthorize("hasAuthority('admin:finance:apply:list')") + @ApiOperation(value = "提现申请详情") + @RequestMapping(value = "/detail", method = RequestMethod.GET) + public CommonResult detail(@RequestParam Integer id) { + return CommonResult.success(userExtractService.getDetailById(id)); + } + + /** + * 提现统计 + * @Param dateLimit 时间限制 today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/ + */ + @PreAuthorize("hasAuthority('admin:finance:apply:balance')") + @ApiOperation(value = "提现统计") + @RequestMapping(value = "/balance", method = RequestMethod.POST) + public CommonResult balance(@RequestParam(value = "dateLimit", required = false,defaultValue = "") + String dateLimit){ + return CommonResult.success(userExtractService.getBalance(dateLimit)); + } + + /** + * 提现审核 + * @param id 提现id + * @param status 审核状态 -1 未通过 0 审核中 1 已提现 + * @param backMessage 驳回原因 + * @return 审核结果 + */ + @PreAuthorize("hasAuthority('admin:finance:apply:apply')") + @ApiOperation(value = "提现申请审核") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "提现申请记录ID", required = true, dataType = "int", paramType = "query"), + @ApiImplicitParam(name = "status", value = "审核状态:-1-未通过,0-审核中,1-已提现", required = true, dataType = "int", paramType = "query"), + @ApiImplicitParam(name = "backMessage", value = "驳回原因(status=-1 时必填)", required = false, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "auditRemark", value = "审核备注(记录本次审核说明)", required = false, dataType = "string", paramType = "query"), + @ApiImplicitParam(name = "transferVoucherUrl", value = "转账凭证地址(打款截图URL)", required = false, dataType = "string", paramType = "query") + }) + @RequestMapping(value = "/apply", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam(value = "id") Integer id, + @RequestParam(value = "status",defaultValue = "审核状态 -1 未通过 0 审核中 1 已提现") Integer status, + @RequestParam(value = "backMessage",defaultValue = "驳回原因", required = false) String backMessage, + @RequestParam(value = "auditRemark",required = false) String auditRemark, + @RequestParam(value = "transferVoucherUrl",required = false) String transferVoucherUrl){ + if(userExtractService.updateStatus(id, status, backMessage, auditRemark, transferVoucherUrl)){ + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserGroupController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserGroupController.java new file mode 100644 index 0000000..8743d6a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserGroupController.java @@ -0,0 +1,99 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.UserGroup; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserGroupRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserGroupService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 用户分组表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/group") +@Api(tags = "会员 -- 分组") +public class UserGroupController { + + @Autowired + private UserGroupService userGroupService; + + /** + * 分页显示用户分组表 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:user:group:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest) { + CommonPage userGroupCommonPage = CommonPage.restPage(userGroupService.getList(pageParamRequest)); + return CommonResult.success(userGroupCommonPage); + } + + /** + * 新增用户分组表 + * @param userGroupRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:user:group:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated UserGroupRequest userGroupRequest) { + if (userGroupService.create(userGroupRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除用户分组表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:user:group:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (userGroupService.removeById(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改用户分组表 + * @param id integer id + * @param userGroupRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:user:group:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated UserGroupRequest userGroupRequest) { + if (userGroupService.edit(id, userGroupRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询用户分组表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:user:group:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(userGroupService.getById(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserIntegralController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserIntegralController.java new file mode 100644 index 0000000..f0eedca --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserIntegralController.java @@ -0,0 +1,47 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.AdminIntegralSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserIntegralRecordResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserIntegralRecordService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用户积分管理控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/integral") +@Api(tags = "用户积分管理") +public class UserIntegralController { + + @Autowired + private UserIntegralRecordService integralRecordService; + + /** + * 积分分页列表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:user:integral:list')") + @ApiOperation(value = "积分分页列表") + @RequestMapping(value = "/list", method = RequestMethod.POST) + public CommonResult> getList(@RequestBody @Validated AdminIntegralSearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage restPage = CommonPage.restPage(integralRecordService.findAdminList(request, pageParamRequest)); + return CommonResult.success(restPage); + } + + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelController.java new file mode 100644 index 0000000..3f12101 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelController.java @@ -0,0 +1,46 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.UserLevel; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserLevelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 用户等级记录表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/level") +@Api(tags = "会员 -- 等级") +public class UserLevelController { + + @Autowired + private UserLevelService userLevelService; + + /** + * 分页显示用户等级记录表 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:user:level:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest) { + CommonPage userLevelCommonPage = CommonPage.restPage(userLevelService.getList(pageParamRequest)); + return CommonResult.success(userLevelCommonPage); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelUpgradeAuditController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelUpgradeAuditController.java new file mode 100644 index 0000000..03b22ee --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserLevelUpgradeAuditController.java @@ -0,0 +1,111 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserLevelUpgradeAudit; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemStoreStaffRequest; +import com.yzt.common.request.UserLevelUpgradeAuditQueryRequest; +import com.yzt.common.request.UserLevelUpgradeAuditRequest; +import com.yzt.common.response.UserLevelUpgradeAuditResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.service.service.UserLevelUpgradeAuditService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * @Author: pengsz + * @Date: 2025/11/22 + * @Description: + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/upgrade-audit") +@Api(tags = "会员 -- 等级审核") +public class UserLevelUpgradeAuditController { + + @Autowired + private UserLevelUpgradeAuditService userLevelUpgradeAuditService; + + /** + * 分页显示用户等级记录表 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest, UserLevelUpgradeAuditQueryRequest request) { + CommonPage userLevelUpgradeAuditCommonPage = CommonPage.restPage(userLevelUpgradeAuditService.getList(pageParamRequest,request)); + return CommonResult.success(userLevelUpgradeAuditCommonPage); + } + + /** + * 修改 + * @RequestBody UserLevelUpgradeAudit 新增参数 + */ + @ApiOperation(value = "修改") + @RequestMapping(value = "/edit", method = RequestMethod.POST) + public CommonResult edit(@RequestBody UserLevelUpgradeAudit request) { + if (userLevelUpgradeAuditService.edit(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 新增 + * @RequestBody UserLevelUpgradeAudit 新增参数 + */ + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody UserLevelUpgradeAudit request) { + if (userLevelUpgradeAuditService.create(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 用户详情 + * @param id Integer + */@ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(userLevelUpgradeAuditService.getInfoById(id)); + } + /** + * 审核通过 + */ + @ApiOperation(value = "审核通过") + @RequestMapping(value = "/approve", method = RequestMethod.POST) + public CommonResult approve(@Validated @RequestBody UserLevelUpgradeAuditRequest request) { + LoginUserVo loginUser = (LoginUserVo) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + SystemAdmin systemAdmin = loginUser.getUser(); + if (userLevelUpgradeAuditService.approve(request, systemAdmin.getId().longValue())) { + return CommonResult.success("审核通过成功"); + } + return CommonResult.failed("审核通过失败"); + } + + /** + * 审核拒绝 + */ + @ApiOperation(value = "审核拒绝") + @RequestMapping(value = "/reject", method = RequestMethod.POST) + public CommonResult reject(@Validated @RequestBody UserLevelUpgradeAuditRequest request) { + LoginUserVo loginUser = (LoginUserVo) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + SystemAdmin systemAdmin = loginUser.getUser(); + if (userLevelUpgradeAuditService.reject(request, systemAdmin.getId().longValue())) { + return CommonResult.success("审核拒绝成功"); + } + return CommonResult.failed("审核拒绝失败"); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeApplicationController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeApplicationController.java new file mode 100644 index 0000000..b83a2b7 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeApplicationController.java @@ -0,0 +1,90 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeApplicationRequest; +import com.yzt.common.request.UserRechargeApplicationSearchRequest; +import com.yzt.common.request.UserRechargeSearchRequest; +import com.yzt.common.response.UserRechargeApplicationResponse; +import com.yzt.common.response.UserRechargeResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserRechargeApplicationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: pengsz + * @Date: 2025/12/01 + * @Description: + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/recharge") +@Api(tags = "财务 -- 充值申请") +public class UserRechargeApplicationController { + + + @Autowired + private UserRechargeApplicationService userRechargeApplicationService; + + /** + * 分页显示用户充值表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated UserRechargeApplicationSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage userRechargeCommonPage = CommonPage.restPage(userRechargeApplicationService.getList(request, pageParamRequest)); + return CommonResult.success(userRechargeCommonPage); + } + +// /** +// * 用户充值审核 +// * @param status 充值状态userRechargeApprove +// * */ +// @ApiOperation(value = "用户充值审核") +// @RequestMapping(value = "/approve", method = RequestMethod.POST) +// public CommonResult approve(@Validated Integer status, Integer id){ +// return CommonResult.success(userRechargeApplicationService.approve(status,id)); +// } + + /** + * 用户充值审核 + * @param request 充值状态 + * */ + @ApiOperation(value = "用户充值审核") + @RequestMapping(value = "/approve", method = RequestMethod.POST) + public CommonResult userRechargeApprove(@Validated @RequestBody UserRechargeApplicationRequest request){ + return CommonResult.success(userRechargeApplicationService.approve(request)); + } + + /** + * 用户充值审核 + * @param request 充值状态 + * */ + @ApiOperation(value = "用户充值申请记录新增") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public CommonResult create(@Validated @RequestBody UserRechargeApplicationRequest request){ + return CommonResult.success(userRechargeApplicationService.create(request)); + } + + /** + * 用户充值申请信息 + * @param id 充值状态 + * */ + @ApiOperation(value = "用户充值申请记录信息") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@Validated Integer id){ + return CommonResult.success(userRechargeApplicationService.info(id)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeController.java new file mode 100644 index 0000000..24a33b1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserRechargeController.java @@ -0,0 +1,63 @@ +package com.yzt.admin.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeApplicationRequest; +import com.yzt.common.request.UserRechargeSearchRequest; +import com.yzt.common.response.UserRechargeResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserRechargeApplicationService; +import com.yzt.service.service.UserRechargeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.HashMap; + + +/** + * 用户充值表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/topUpLog") +@Api(tags = "财务 -- 充值") +public class UserRechargeController { + + @Autowired + private UserRechargeService userRechargeService; + + /** + * 分页显示用户充值表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:recharge:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated UserRechargeSearchRequest request, @Validated PageParamRequest pageParamRequest){ + CommonPage userRechargeCommonPage = CommonPage.restPage(userRechargeService.getList(request, pageParamRequest)); + return CommonResult.success(userRechargeCommonPage); + } + + /** + * 充值总金额 + */ + @PreAuthorize("hasAuthority('admin:recharge:balance')") + @ApiOperation(value = "提现总金额") + @RequestMapping(value = "/balance", method = RequestMethod.POST) + public CommonResult> balance(){ + return CommonResult.success(userRechargeService.getBalanceList()); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserStatisticsController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserStatisticsController.java new file mode 100644 index 0000000..b05ea18 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserStatisticsController.java @@ -0,0 +1,51 @@ +package com.yzt.admin.controller; + +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserStatisticsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 统计 -- 用户统计 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/statistics/user") +@Api(tags = "用户统计") +public class UserStatisticsController { + + @Autowired + private UserStatisticsService statisticsService; + + @PreAuthorize("hasAuthority('admin:statistics:user:overview')") + @ApiOperation(value = "用户概览") + @RequestMapping(value = "/overview", method = RequestMethod.GET) + public CommonResult getOverview(@RequestParam(value = "dateLimit", defaultValue = "") String dateLimit) { + return CommonResult.success(statisticsService.getOverview(dateLimit)); + } + + @PreAuthorize("hasAuthority('admin:statistics:user:channel')") + @ApiOperation(value = "用户渠道数据") + @RequestMapping(value = "/channel", method = RequestMethod.GET) + public CommonResult> getChannelData() { + return CommonResult.success(statisticsService.getChannelData()); + } + + @PreAuthorize("hasAuthority('admin:statistics:user:overview:list')") + @ApiOperation(value = "用户概览列表") + @RequestMapping(value = "/overview/list", method = RequestMethod.GET) + public CommonResult> getOverviewList(@RequestParam(value = "dateLimit", defaultValue = "") String dateLimit) { + return CommonResult.success(statisticsService.getOverviewList(dateLimit)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/UserTagController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserTagController.java new file mode 100644 index 0000000..19eaee9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/UserTagController.java @@ -0,0 +1,99 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.user.UserTag; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserTagRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserTagService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 用户标签 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/user/tag") +@Api(tags = "会员 -- 标签") //配合swagger使用 +public class UserTagController { + + @Autowired + private UserTagService userTagService; + + /** + * 分页显示用户分标签 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:user:tag:list')") + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest) { + CommonPage userTagCommonPage = CommonPage.restPage(userTagService.getList(pageParamRequest)); + return CommonResult.success(userTagCommonPage); + } + + /** + * 新增用户分标签 + * @param userTagRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:user:tag:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated UserTagRequest userTagRequest) { + if (userTagService.create(userTagRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除用户分标签 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:user:tag:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (userTagService.delete(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改用户标签 + * @param id integer id + * @param userTagRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:user:tag:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestBody @Validated UserTagRequest userTagRequest) { + if (userTagService.updateTag(id, userTagRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询用户标签 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:user:tag:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(userTagService.getById(id)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatAdminController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatAdminController.java new file mode 100644 index 0000000..ec128b6 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatAdminController.java @@ -0,0 +1,41 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.response.WeChatJsSdkConfigResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.WechatNewService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 微信 -- 开放平台 admin + * + */ +@Slf4j +@RestController("WeChatAdminController") +@RequestMapping("api/admin/wechat") +@Api(tags = "微信 -- 开放平台 admin") +public class WeChatAdminController { + + @Autowired + private WechatNewService wechatNewService; + + /** + * 获取微信公众号js配置 + */ + @PreAuthorize("hasAuthority('admin:wechat:config')") + @ApiOperation(value = "获取微信公众号js配置") + @RequestMapping(value = "/config", method = RequestMethod.GET) + @ApiImplicitParam(name = "url", value = "页面地址url") + public CommonResult configJs(@RequestParam(value = "url") String url) { + return CommonResult.success(wechatNewService.getJsSdkConfig(url)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatController.java new file mode 100644 index 0000000..bb00e92 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/WeChatController.java @@ -0,0 +1,71 @@ +package com.yzt.admin.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.WechatNewService; +import com.yzt.service.service.WechatPublicService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 微信缓存表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/wechat/menu") +@Api(tags = "微信开放平台 -- 菜单管理") +public class WeChatController { + + @Autowired + private WechatPublicService wechatPublicService; + @Autowired + private WechatNewService wechatNewService; + + /** + * 获取微信菜单 + */ + @PreAuthorize("hasAuthority('admin:wechat:menu:public:get')") + @ApiOperation(value = "获取自定义菜单") + @RequestMapping(value = "/public/get", method = RequestMethod.GET) + public CommonResult get() { + return CommonResult.success(wechatPublicService.getCustomizeMenus()); + } + + /** + * 创建微信菜单 + * @param data 菜单数据,具体json格式参考微信开放平台 + */ + @PreAuthorize("hasAuthority('admin:wechat:menu:public:create')") + @ApiOperation(value = "保存自定义菜单") + @RequestMapping(value = "/public/create", method = RequestMethod.POST) + public CommonResult create(@RequestBody String data) { + if (wechatPublicService.createMenus(data)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 删除微信菜单 + */ + @PreAuthorize("hasAuthority('admin:wechat:menu:public:delete')") + @ApiOperation(value = "删除自定义菜单") + @RequestMapping(value = "/public/delete", method = RequestMethod.GET) + public CommonResult delete() { + if (wechatPublicService.deleteMenus()) { + return CommonResult.success(); + } + return CommonResult.failed(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatCallbackController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatCallbackController.java new file mode 100644 index 0000000..a605a2d --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatCallbackController.java @@ -0,0 +1,70 @@ +package com.yzt.admin.controller; + +import com.yzt.service.service.WechatCallbackService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + + +/** + * 微信小程序回调 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/wechat/mini/callback") +@Api(tags = "微信开放平台 -- 小程序回调") +public class WechatCallbackController { + + @Autowired + private WechatCallbackService wechatCallbackService; + + /** + * 小程序回调-自己模拟 + */ + @ApiOperation(value = "小程序回调-自己模拟") + @RequestMapping(value = "/test", method = RequestMethod.POST) + public String test(@RequestBody String request) { + return wechatCallbackService.callback(request); + } + + /** + * 小程序回调 + * 目前只用于视频号直播 + */ + @ApiOperation(value = "小程序回调") + @RequestMapping(value = "/index", method = RequestMethod.POST) + public String webHook(@RequestBody String request) { + return wechatCallbackService.callback(request); + } + + /** + * 微信推送地址验证 + * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 + * @param timestamp 时间戳 + * @param nonce 随机数 + * @param echostr 随机字符串 + */ + @RequestMapping(value = { "/index" }, method = RequestMethod.GET) + private void webHook( + @RequestParam(value = "signature", required = false) String signature, + @RequestParam(value = "timestamp", required = false) String timestamp, + @RequestParam(value = "nonce", required = false) String nonce, + @RequestParam(value = "echostr") String echostr, + HttpServletResponse response) throws IOException { + System.out.println("微信小程序回调测试成功"); + PrintWriter writer = response.getWriter(); + writer.print(echostr); + writer.flush(); + writer.close(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatMediaController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatMediaController.java new file mode 100644 index 0000000..6833bc1 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatMediaController.java @@ -0,0 +1,48 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.WechatMediaService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + + +/** + * 微信回复表 前端控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/admin/wechat/media") +@Api(tags = "微信开放平台 -- 素材") +public class WechatMediaController { + + @Autowired + private WechatMediaService wechatMediaService; + + /** + * 上传 + */ + @PreAuthorize("hasAuthority('admin:wechat:media:upload')") + @ApiOperation(value = "上传") + @RequestMapping(value = "/upload", method = RequestMethod.POST) + public CommonResult> upload( + @RequestParam("media") @ApiParam(name = "media", value = "待上传素材图片文件", required = true) MultipartFile file, + @RequestParam("type") @ApiParam(name = "type", value = "媒体文件类型,分别有图片(image)、语音(voice", required = true, allowableValues = "range[image,voice]") String type + ) { + return CommonResult.success(wechatMediaService.upload(file, type)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatReplyController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatReplyController.java new file mode 100644 index 0000000..86a4bd9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/WechatReplyController.java @@ -0,0 +1,132 @@ +package com.yzt.admin.controller; + +import com.yzt.common.model.wechat.WechatReply; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.WechatReplyRequest; +import com.yzt.common.request.WechatReplySearchRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.WechatReplyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 微信关键字回复表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/wechat/keywords/reply") +@Api(tags = "微信开放平台 -- 微信关键字回复") +public class WechatReplyController { + + @Autowired + private WechatReplyService wechatReplyService; + + /** + * 分页显示微信关键字回复表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:list')") + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated WechatReplySearchRequest request, @Validated PageParamRequest pageParamRequest) { + CommonPage wechatReplyCommonPage = CommonPage.restPage(wechatReplyService.getList(request, pageParamRequest)); + return CommonResult.success(wechatReplyCommonPage); + } + + /** + * 新增微信关键字回复表 + * @param wechatReplyRequest 新增参数 + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:save')") + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated WechatReplyRequest wechatReplyRequest) { + WechatReply wechatReply = new WechatReply(); + BeanUtils.copyProperties(wechatReplyRequest, wechatReply); + if (wechatReplyService.create(wechatReply)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 删除微信关键字回复表 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:delete')") + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.GET) + public CommonResult delete(@RequestParam(value = "id") Integer id) { + if (wechatReplyService.removeById(id)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改微信关键字回复表 + * @param wechatReplyRequest 修改参数 + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:update')") + @ApiOperation(value = "修改") + @RequestMapping(value = "/update", method = RequestMethod.POST) + public CommonResult update(@RequestBody @Validated WechatReplyRequest wechatReplyRequest) { + if (wechatReplyService.updateReply(wechatReplyRequest)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改状态 + * @param id integer id + * @param status boolean 状态 + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:status')") + @ApiOperation(value = "状态") + @RequestMapping(value = "/status", method = RequestMethod.POST) + public CommonResult update(@RequestParam(value = "id") Integer id, @RequestParam(value = "status") Boolean status) { + if (wechatReplyService.updateStatus(id, status)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 查询微信关键字回复表信息 + * @param id Integer + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:info')") + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "id") Integer id) { + WechatReply wechatReply = wechatReplyService.getInfo(id); + return CommonResult.success(wechatReply); + } + + /** + * 根据关键字查询数据 + * @param keywords String 关键字 + */ + @PreAuthorize("hasAuthority('admin:wechat:keywords:reply:info:keywords')") + @ApiOperation(value = "根据关键字查询数据") + @RequestMapping(value = "/info/keywords", method = RequestMethod.GET) + public CommonResult info(@RequestParam(value = "keywords") String keywords) { + WechatReply wechatReply = wechatReplyService.getVoByKeywords(keywords); + return CommonResult.success(wechatReply); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/controller/YlyPrintController.java b/fightwine-admin/src/main/java/com/yzt/admin/controller/YlyPrintController.java new file mode 100644 index 0000000..70de82a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/controller/YlyPrintController.java @@ -0,0 +1,37 @@ +package com.yzt.admin.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.YlyPrintService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 易联云打印订单 + * + */ +@Slf4j +@RestController +@RequestMapping("api/admin/yly") +@Api(tags = "易联云 打印订单小票") //配合swagger使用 +public class YlyPrintController { + + + @Autowired + private YlyPrintService ylyPrintService; + + @PreAuthorize("hasAuthority('admin:yly:print')") + @ApiOperation(value = "打印小票") + @RequestMapping(value = "/print/{ordid}", method = RequestMethod.GET) + public CommonResult updateStatus(@PathVariable String ordid) { + ylyPrintService.YlyPrint(ordid,false); + return CommonResult.success(); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightInfoResponse.java b/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightInfoResponse.java new file mode 100644 index 0000000..61d5e29 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightInfoResponse.java @@ -0,0 +1,42 @@ +package com.yzt.admin.copyright; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 版权信息响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "CopyrightInfoResponse对象", description = "版权信息响应对象") +public class CopyrightInfoResponse { + + @ApiModelProperty(value = "管理端API域名") + private String domainUrl; + + @ApiModelProperty(value = "项目版本号") + private String version; + + @ApiModelProperty(value = "版权标签") + private Integer label; + + @ApiModelProperty(value = "授权码") + private String authCode; + + @ApiModelProperty(value = "版权状态:-2=API域名未配置 -1=未提交,0-待审核,1-授权成功,2-审核失败") + private Integer status; + + @ApiModelProperty(value = "公司信息") + private String companyName; + + @ApiModelProperty(value = "公司图片") + private String companyImage; + + @ApiModelProperty(value = "版权码") + private String copyright; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightUpdateInfoRequest.java b/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightUpdateInfoRequest.java new file mode 100644 index 0000000..d31948f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/copyright/CopyrightUpdateInfoRequest.java @@ -0,0 +1,28 @@ +package com.yzt.admin.copyright; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 编辑公司版权信息请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "CopyrightUpdateInfoRequest对象", description = "编辑公司版权信息请求对象") +public class CopyrightUpdateInfoRequest { + + @ApiModelProperty(value = "公司信息") + @NotBlank(message = "公司信息不能为空") + private String companyName; + + @ApiModelProperty(value = "公司图片") +// @NotBlank(message = "公司版权图片不能为空") + private String companyImage; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/filter/JwtAuthenticationTokenFilter.java b/fightwine-admin/src/main/java/com/yzt/admin/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..6f14293 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,45 @@ +package com.yzt.admin.filter; + +import cn.hutool.core.util.ObjectUtil; +import com.yzt.common.vo.LoginUserVo; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.annotation.Resource; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * token过滤器 验证token有效性 + */ +//@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + + @Resource + private TokenComponent tokenComponent; + + /** + * 过滤请求,验证token有效性 + * @param request HttpServletRequest 请求对象 + * response HttpServletResponse 响应对象 + * filterChain FilterChain 过滤器链 + */ + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException { + LoginUserVo loginUser = tokenComponent.getLoginUser( request); +// if (ObjectUtil.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { + if (ObjectUtil.isNotNull(loginUser)) { + tokenComponent.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + // 将authentication信息放入到上下文对象中 + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + filterChain.doFilter(request, response); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseFilter.java b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseFilter.java new file mode 100644 index 0000000..a262f77 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseFilter.java @@ -0,0 +1,64 @@ +package com.yzt.admin.filter; + + +import com.yzt.common.config.YztConfig; +import com.yzt.common.utils.RequestUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.security.web.FilterInvocation; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + + +/** + * + * 返回值输出过滤器 + */ +//@Component +public class ResponseFilter implements Filter { + + + @Autowired + YztConfig yztConfig; + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse) response);//转换成代理类 + FilterInvocation fi = new FilterInvocation(servletRequest, (ServletResponse) wrapperResponse, filterChain); + HttpServletRequest request = (HttpServletRequest) servletRequest; + + //OPTIONS请求直接放行 + if(request.getMethod().equals(HttpMethod.OPTIONS.toString())){ + fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); + return; + } + // 这里只拦截返回,直接让请求过去,如果在请求前有处理,可以在这里处理 + filterChain.doFilter(servletRequest, (ServletResponse) wrapperResponse); + byte[] content = wrapperResponse.getContent();//获取返回值 + //判断是否有值 + if (content.length > 0) { + String str = new String(content, StandardCharsets.UTF_8); + + try { + HttpServletRequest req = (HttpServletRequest) servletRequest; + str = new ResponseRouter().filter(str, RequestUtil.getUri((javax.servlet.http.HttpServletRequest) req), yztConfig); + } catch (Exception e) { + e.printStackTrace(); + } + //把返回值输出到客户端 + ServletOutputStream outputStream = response.getOutputStream(); + if (str.length() > 0) { + outputStream.write(str.getBytes()); + outputStream.flush(); + outputStream.close(); + //最后添加这一句,输出到客户端 + response.flushBuffer(); + } + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseRouter.java b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseRouter.java new file mode 100644 index 0000000..4114508 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseRouter.java @@ -0,0 +1,52 @@ +package com.yzt.admin.filter; + +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.utils.SpringUtil; +import com.yzt.service.service.SystemAttachmentService; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +/** + * response路径处理 + * + */ +public class ResponseRouter { + + public String filter(String data, String path, YztConfig yztConfig) { + boolean result = un().contains(path); + if (result) { + return data; + } + + //系统不用过滤的URL,针对数据而非token + PathMatcher pathMatcher = new AntPathMatcher(); + for (String configUrl : yztConfig.getIgnored()) { + if(pathMatcher.match(path, configUrl)){ + return data; + } + } + + if (!path.contains("api/admin/") && !path.contains("api/front/")) { + return data; + } + + //根据需要处理返回值 && !data.contains("data:image/png;base64") + if ((data.contains(UploadConstants.UPLOAD_FILE_KEYWORD + "/")) + || data.contains(UploadConstants.DOWNLOAD_FILE_KEYWORD) || data.contains(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD)) { + if (data.contains(UploadConstants.DOWNLOAD_FILE_KEYWORD + "/" + UploadConstants.UPLOAD_MODEL_PATH_EXCEL)) { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixFile(data); + } else if (data.contains(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD + "/")) { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixUploadf(data); + } else { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixImage(data); + } + } + + return data; + } + + public static String un() { + return ""; + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseWrapper.java b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseWrapper.java new file mode 100644 index 0000000..c649d06 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/filter/ResponseWrapper.java @@ -0,0 +1,69 @@ +package com.yzt.admin.filter; + + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * Response包装类 + * + */ +public class ResponseWrapper extends HttpServletResponseWrapper { + + private ByteArrayOutputStream buffer; + + private ServletOutputStream out; + + public ResponseWrapper(HttpServletResponse httpServletResponse) { + super(httpServletResponse); + buffer = new ByteArrayOutputStream(); + out = new WrapperOutputStream(buffer); + } + + @Override + public ServletOutputStream getOutputStream() { + return out; + } + + @Override + public void flushBuffer() + throws IOException { + if (out != null) { + out.flush(); + } + } + + public byte[] getContent() + throws IOException { + flushBuffer(); + return buffer.toByteArray(); + } + + static class WrapperOutputStream extends ServletOutputStream { + private ByteArrayOutputStream bos; + + public WrapperOutputStream(ByteArrayOutputStream bos) { + this.bos = bos; + } + + @Override + public void write(int b) { + bos.write(b); + } + + @Override + public boolean isReady() { + return false; + + } + + @Override + public void setWriteListener(WriteListener arg0) { + + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/filter/TokenComponent.java b/fightwine-admin/src/main/java/com/yzt/admin/filter/TokenComponent.java new file mode 100644 index 0000000..a9de30a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/filter/TokenComponent.java @@ -0,0 +1,129 @@ +package com.yzt.admin.filter; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.LoginUserVo; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * token验证处理 + * + */ +@Component +public class TokenComponent { + + @Resource + private RedisUtil redisUtil; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + private static final Long MILLIS_MINUTE = 60 * 1000L; + + // 令牌有效期(默认30分钟) todo 调试期改为5小时 +// private static final int expireTime = 30; + private static final int expireTime = 5 * 60; + + // Redis 存储的key + private static final String TOKEN_REDIS = "TOKEN:ADMIN:"; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUserVo getLoginUser(HttpServletRequest request) { + // 获取请求携带的令牌 + String token = getToken(request); + if (StrUtil.isNotEmpty(token)) { + String userKey = getTokenKey(token); + return redisUtil.get(userKey); + } + return null; + } + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUserVo loginUser) { + if (ObjectUtil.isNotNull(loginUser) && StrUtil.isNotEmpty(loginUser.getToken())) { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) { + if (StrUtil.isNotEmpty(token)) { + String userKey = getTokenKey(token); + redisUtil.delete(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUserVo loginUser) { + String token = UUID.randomUUID().toString().replace("-", ""); + loginUser.setToken(token); +// setUserAgent(loginUser); + refreshToken(loginUser); + return token; + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser LoginUserVo + */ + public void verifyToken(LoginUserVo loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUserVo loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisUtil.set(userKey, loginUser, (long) expireTime, TimeUnit.MINUTES); + } + + /** + * 获取请求token + * + * @param request HttpServletRequest + * @return token + */ + private String getToken(HttpServletRequest request) { + String token = request.getHeader(Constants.HEADER_AUTHORIZATION_KEY); + if (StrUtil.isNotEmpty(token) && token.startsWith(TOKEN_REDIS)) { + token = token.replace(TOKEN_REDIS, ""); + } + return token; + } + + private String getTokenKey(String uuid) { + return TOKEN_REDIS + uuid; + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/manager/AuthenticationEntryPointImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/manager/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..eb46b0a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/manager/AuthenticationEntryPointImpl.java @@ -0,0 +1,36 @@ +package com.yzt.admin.manager; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.result.CommonResultCode; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Serializable; + +/** + * 认证失败处理类 返回未授权 + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { + + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) { +// String msg = StrUtil.format("请求访问:{},认证失败,无法访问系统资源", httpServletRequest.getRequestURI()); + httpServletResponse.setStatus(200); + httpServletResponse.setContentType("application/json"); + httpServletResponse.setCharacterEncoding("utf-8"); + try { + httpServletResponse.getWriter().print(JSONObject.toJSONString(CommonResult.failed(CommonResultCode.UNAUTHORIZED))); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/manager/CusAuthenticationManager.java b/fightwine-admin/src/main/java/com/yzt/admin/manager/CusAuthenticationManager.java new file mode 100644 index 0000000..5e82029 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/manager/CusAuthenticationManager.java @@ -0,0 +1,33 @@ +package com.yzt.admin.manager; + +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.ProviderNotFoundException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +import java.util.Objects; + +/** + * 自定义认证管理器 + * + */ +@Component +public class CusAuthenticationManager implements AuthenticationManager { + +// private final CustomAuthenticationProvider customAuthenticationProvider = new CustomAuthenticationProvider(); + private final CustomAuthenticationProvider customAuthenticationProvider; + + public CusAuthenticationManager(CustomAuthenticationProvider customAuthenticationProvider) { + this.customAuthenticationProvider = customAuthenticationProvider; + } + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + Authentication result = customAuthenticationProvider.authenticate(authentication); + if (Objects.nonNull(result)) { + return result; + } + throw new ProviderNotFoundException("Authentication failed!"); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAccessDeniedHandler.java b/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAccessDeniedHandler.java new file mode 100644 index 0000000..d10e6d5 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAccessDeniedHandler.java @@ -0,0 +1,36 @@ +package com.yzt.admin.manager; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.result.CommonResultCode; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Serializable; + +/** + * 自定义权限不足处理程序 + * + */ +@Component +public class CustomAccessDeniedHandler implements AccessDeniedHandler, Serializable { + + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException { + httpServletResponse.setStatus(200); + httpServletResponse.setContentType("application/json"); + httpServletResponse.setCharacterEncoding("utf-8"); + try { + httpServletResponse.getWriter().print(JSONObject.toJSONString(CommonResult.failed(CommonResultCode.FORBIDDEN))); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAuthenticationProvider.java b/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAuthenticationProvider.java new file mode 100644 index 0000000..0e82053 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/manager/CustomAuthenticationProvider.java @@ -0,0 +1,52 @@ +package com.yzt.admin.manager; + +import cn.hutool.core.util.ObjectUtil; +import com.yzt.common.exception.YztException; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.service.service.impl.UserDetailServiceImpl; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +/** + * 自定义验证(admin登录) + */ +@Component +public class CustomAuthenticationProvider implements AuthenticationProvider { + + private UserDetailServiceImpl userDetailsService; + + public CustomAuthenticationProvider(UserDetailServiceImpl userDetailsService) { + this.userDetailsService = userDetailsService; + } + +// private final UserDetailServiceImpl userDetailsService = new UserDetailServiceImpl(); + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String name = authentication.getPrincipal().toString(); + String password = authentication.getCredentials().toString(); + + //以下自定义方法,判断是否登录成功 + LoginUserVo userDetails = (LoginUserVo) userDetailsService.loadUserByUsername(name); + if (ObjectUtil.isNull(userDetails)) { + throw new YztException("用户名不存在"); + } + // base64加密获取真正密码 + String encryptPassword = YztUtil.encryptPassword(password, name); + if (!userDetails.getUser().getPwd().equals(encryptPassword)) { + throw new YztException("账号或者密码不正确"); + } + return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); + } + + @Override + public boolean supports(Class authentication) { + //确保authentication能转成该类 + return authentication.equals(UsernamePasswordAuthenticationToken.class); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobLogMapper.java b/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobLogMapper.java new file mode 100644 index 0000000..a548379 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobLogMapper.java @@ -0,0 +1,14 @@ +package com.yzt.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.admin.model.ScheduleJobLog; + +/** + *

+ * 定时任务日志 Mapper 接口 + *

+ * + */ +public interface ScheduleJobLogMapper extends BaseMapper { + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobMapper.java b/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobMapper.java new file mode 100644 index 0000000..4caee44 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/mapper/ScheduleJobMapper.java @@ -0,0 +1,14 @@ +package com.yzt.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.admin.model.ScheduleJob; + +/** + *

+ * 定时任务 Mapper 接口 + *

+ * + */ +public interface ScheduleJobMapper extends BaseMapper { + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJob.java b/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJob.java new file mode 100644 index 0000000..a350ab0 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJob.java @@ -0,0 +1,59 @@ +package com.yzt.admin.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 定时任务 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_schedule_job") +@ApiModel(value="ScheduleJob对象", description="定时任务") +public class ScheduleJob implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "任务id") + @TableId(value = "job_id", type = IdType.AUTO) + private Integer jobId; + + @ApiModelProperty(value = "spring bean名称") + private String beanName; + + @ApiModelProperty(value = "方法名") + private String methodName; + + @ApiModelProperty(value = "参数") + private String params; + + @ApiModelProperty(value = "cron表达式") + private String cronExpression; + + @ApiModelProperty(value = "任务状态 0:正常 1:暂停") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "是否删除") + private Boolean isDelte; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJobLog.java b/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJobLog.java new file mode 100644 index 0000000..2bd0a71 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/model/ScheduleJobLog.java @@ -0,0 +1,59 @@ +package com.yzt.admin.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 定时任务日志 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_schedule_job_log") +@ApiModel(value="ScheduleJobLog对象", description="定时任务日志") +public class ScheduleJobLog implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "任务日志id") + @TableId(value = "log_id", type = IdType.AUTO) + private Integer logId; + + @ApiModelProperty(value = "任务id") + private Integer jobId; + + @ApiModelProperty(value = "spring bean名称") + private String beanName; + + @ApiModelProperty(value = "方法名") + private String methodName; + + @ApiModelProperty(value = "参数") + private String params; + + @ApiModelProperty(value = "任务状态 0:成功 1:失败") + private Integer status; + + @ApiModelProperty(value = "失败信息") + private String error; + + @ApiModelProperty(value = "耗时(单位:毫秒)") + private Integer times; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/pub/GetJSConfig.java b/fightwine-admin/src/main/java/com/yzt/admin/pub/GetJSConfig.java new file mode 100644 index 0000000..0b47e8b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/pub/GetJSConfig.java @@ -0,0 +1,45 @@ +package com.yzt.admin.pub; + +import com.yzt.common.constants.Constants; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * + **/ +@Slf4j +@RestController +@RequestMapping("api/public/jsconfig") +@Api(tags = "公共JS配置") +public class GetJSConfig { + + @Autowired + private SystemConfigService systemConfigService; + + @PreAuthorize("hasAuthority('public:jsconfig:getcrmebchatconfig')") + @ApiOperation(value = "YZT-chat客服统计") + @RequestMapping(value = "/getyztbchatconfig", method = RequestMethod.GET) + public String set(){ + return systemConfigService.getValueByKey(Constants.JS_CONFIG_YZT_CHAT_TONGJI); + } + + @ApiOperation(value = "获取移动端域名") + @RequestMapping(value = "/get/front/domain", method = RequestMethod.GET) + public CommonResult getFrontDomain() { + return CommonResult.success(systemConfigService.getFrontDomain()); + } + + @ApiOperation(value = "获取平台当前的素材地址") + @RequestMapping(value = "/get/admin/mediadomain", method = RequestMethod.GET) + public CommonResult getMediaDomain() { + return CommonResult.success(systemConfigService.getMediaDomain()); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/pub/SafetyController.java b/fightwine-admin/src/main/java/com/yzt/admin/pub/SafetyController.java new file mode 100644 index 0000000..7afd947 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/pub/SafetyController.java @@ -0,0 +1,47 @@ +package com.yzt.admin.pub; + +import com.anji.captcha.model.common.ResponseModel; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SafetyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * 安全验证控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/safety") +@Api(tags = "安全验证控制器") +public class SafetyController { + + @Autowired + private SafetyService safetyService; + + @ApiOperation(value = "获取行为验证码") + @RequestMapping(value = "/get", method = RequestMethod.POST) + public CommonResult getSafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.getSafetyCode(data, request)); + } + + @ApiOperation(value = "验证行为验证码") + @RequestMapping(value = "/check", method = RequestMethod.POST) + public CommonResult checkSafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.checkSafetyCode(data, request)); + } + + @ApiOperation(value = "行为验证码二次校验") + @RequestMapping(value = "/verify", method = RequestMethod.POST) + public CommonResult verifySafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.verifySafetyCode(data)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatMessageController.java b/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatMessageController.java new file mode 100644 index 0000000..d037540 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatMessageController.java @@ -0,0 +1,66 @@ +package com.yzt.admin.pub; + +import com.yzt.admin.service.WeChatMessageService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + + +/** + * 微信缓存表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/wechat/message") +@Api(tags = "微信开放平台 -- 消息") +public class WeChatMessageController { + + @Autowired + private WeChatMessageService weChatMessageService; + + /** + * 微信关键字回复 + * + */ + @ApiOperation(value = "接受微信推送过来的消息") + @RequestMapping(value = "/webHook", method = RequestMethod.POST) + public String webHook(HttpServletRequest request){ + return weChatMessageService.init(request); + } + + /** + * 微信推送地址验证 + * @param signature + * @param timestamp + * @param nonce + * @param echostr + * @param response + * @throws IOException + */ + @RequestMapping(value = { "/webHook" }, method = RequestMethod.GET) + private void webHook( + @RequestParam(value = "signature", required = false) String signature, + @RequestParam(value = "timestamp", required = false) String timestamp, + @RequestParam(value = "nonce", required = false) String nonce, + @RequestParam(value = "echostr") String echostr, + HttpServletResponse response) throws IOException { + PrintWriter writer = response.getWriter(); + writer.print(echostr); + writer.flush(); + writer.close(); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatPushController.java b/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatPushController.java new file mode 100644 index 0000000..adcc652 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/pub/WeChatPushController.java @@ -0,0 +1,141 @@ +package com.yzt.admin.pub; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.RestTemplateUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + + +/** + * 后台管理员表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/wechat") +@Api(tags = "企业微信消息推送") +public class WeChatPushController { + + private static String url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="; + + @Resource + private RestTemplateUtil restTemplateUtil; + + + /** + * 新增后台管理员表 + * @param message string message + */ + @ApiOperation(value = "gitlab钩子") + @RequestMapping(value = "/gitlab", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name="message", value="推送消息内容"), + @ApiImplicitParam(name="token", value="企业微信群token"), + }) + public CommonResult gitlab(@RequestBody String message, + @RequestParam(name = "token", required = true) String token){ + + Map map = new HashMap<>(); + map.put("msgtype", "text"); + + Map text = new HashMap<>(); + + //需要@的人 + ArrayList people = new ArrayList<>(); + people.add("@all"); + text.put("mentioned_list", people); + + //gitlab 动作标签 + JSONObject jsonObject = JSONObject.parseObject(message); + String action = jsonObject.getString("object_kind"); + String content; + switch(action){ + case "push": + content = jsonObject.getJSONArray("commits").getJSONObject(0).getJSONObject("author").getString("name") + " " + + action + " " + + jsonObject.getString("ref").replace("refs/heads/", "") + + "\n 备注:\n" + + jsonObject.getJSONArray("commits").getJSONObject(0).getString("message"); + break; + case "tag_push": + content = jsonObject.getString("user_name") + " " + + action + " " + + jsonObject.getString("ref").replace("refs/heads/", "") + + "\n 备注:\n" + + jsonObject.getJSONArray("commits").getJSONObject(0).getString("message"); + break; + case "note": + String author = "未知用户"; + if(jsonObject.containsKey("commit")){ + author = jsonObject.getJSONObject("commit").getJSONObject("author").getString("name"); + } + + if(jsonObject.containsKey("last_commit")){ + author = jsonObject.getJSONObject("last_commit").getJSONObject("author").getString("name"); + } + + content = author + + " 提交代码到 " + + jsonObject.getJSONObject("project").getString("default_branch") + + "\n 备注:\n" + + jsonObject.getJSONObject("object_attributes").getString("note"); + break; + case "merge_request": + content = jsonObject.getJSONObject("object_attributes").getJSONObject("assignee").getString("name") + " " + + "合并代码, 从 " + + jsonObject.getJSONObject("object_attributes").getString("source_branch") + " ---> " + + jsonObject.getJSONObject("object_attributes").getString("target_branch") + + "\n 备注:\n" + + jsonObject.getJSONObject("object_attributes").getJSONObject("last_commit").getString("message"); + break; + default: + content = "gitlab 项目有更新"; + } + + text.put("content", content); + map.put("text", text); + String result = restTemplateUtil.postMapData(url + token, map); + return CommonResult.success(JSONObject.parseObject(result)); + } + + /** + * 新增后台管理员表 + * @param message string message + */ + @ApiOperation(value = "消息推送") + @RequestMapping(value = "/push", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="message", value="推送消息内容"), + @ApiImplicitParam(name="token", value="企业微信群token"), + }) + public CommonResult push(@RequestParam(name = "message") String message, + @RequestParam(name = "token") String token){ + + Map map = new HashMap<>(); + map.put("msgtype", "text"); + + Map text = new HashMap<>(); + + //需要@的人 + ArrayList people = new ArrayList<>(); + people.add("@all"); + text.put("mentioned_list", people); + text.put("content", message); + map.put("text", text); + String result = restTemplateUtil.postMapData(url + token, map); + return CommonResult.success(JSONObject.parseObject(result)); + } +} + + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/pub/WechatMiniCommonController.java b/fightwine-admin/src/main/java/com/yzt/admin/pub/WechatMiniCommonController.java new file mode 100644 index 0000000..6630865 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/pub/WechatMiniCommonController.java @@ -0,0 +1,40 @@ +package com.yzt.admin.pub; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.QrCodeVo; +import com.yzt.service.service.QrCodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 类的详细说明 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/wechat/mini") +@Api(tags = "微信小程序公共控制器") +public class WechatMiniCommonController { + + @Autowired + private QrCodeService qrCodeService; + + @ApiOperation(value = "获取微信二维码") + @RequestMapping(value = "/get/qrcode", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "data", value = "生成小程序码 path 和 scene 不能为空 可查看具体参数https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html#%E8%B0%83%E7%94%A8%E6%96%B9%E5%BC%8F", dataType = "JSONObject", required = true, paramType = "body") + }) + public CommonResult getWecahtQrCode(@RequestBody JSONObject data) { + return CommonResult.success(qrCodeService.getWecahtQrCode(data)); + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/quartz/QuartzJob.java b/fightwine-admin/src/main/java/com/yzt/admin/quartz/QuartzJob.java new file mode 100644 index 0000000..c7ed26a --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/quartz/QuartzJob.java @@ -0,0 +1,33 @@ +package com.yzt.admin.quartz; + +import com.yzt.admin.model.ScheduleJob; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; + +/** + * 该类将会被org.springframework.scheduling.quartz.SpringBeanJobFactory 实例化 + * 并使@Autowired 生效 + * + */ +@Slf4j +@DisallowConcurrentExecution +public class QuartzJob implements Job { + + @Autowired + private ApplicationEventPublisher publisher; + + /** + * 任务调度参数key + */ + public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY"; + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap(); + Object o = mergedJobDataMap.get(JOB_PARAM_KEY); + ScheduleJob sysJob = (ScheduleJob) o; + publisher.publishEvent(new ScheduleJobEvent(sysJob)); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleConstants.java b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleConstants.java new file mode 100644 index 0000000..f0e3796 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleConstants.java @@ -0,0 +1,11 @@ +package com.yzt.admin.quartz; + +/** + * 定时任务状态 + */ +public class ScheduleConstants { + + public static final Integer NORMAL = 0;// 正常 + + public static final Integer PAUSE = 1;// 暂停 +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleJobEvent.java b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleJobEvent.java new file mode 100644 index 0000000..94cd531 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleJobEvent.java @@ -0,0 +1,15 @@ +package com.yzt.admin.quartz; + +import com.yzt.admin.model.ScheduleJob; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 定时任务事件 + */ +@Getter +@AllArgsConstructor +public class ScheduleJobEvent { + + private final ScheduleJob scheduleJob; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleManager.java b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleManager.java new file mode 100644 index 0000000..21acbf7 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/quartz/ScheduleManager.java @@ -0,0 +1,163 @@ +package com.yzt.admin.quartz; + +import com.yzt.admin.model.ScheduleJob; +import lombok.AllArgsConstructor; +import org.quartz.*; +import org.springframework.stereotype.Component; + +/** + * 定时任务工具类 + * + */ +@Component +@AllArgsConstructor +public class ScheduleManager { + + private final static String JOB_NAME = "TASK_"; + + private final Scheduler scheduler; + + /** + * 获取触发器key + */ + private TriggerKey getTriggerKey(ScheduleJob scheduleJob) { + return TriggerKey.triggerKey(JOB_NAME + scheduleJob.getJobId()); + } + + /** + * 获取jobKey + */ + private JobKey getJobKey(ScheduleJob scheduleJob) { + return JobKey.jobKey(JOB_NAME + scheduleJob.getJobId()); + } + + /** + * 获取表达式触发器 + */ + public CronTrigger getCronTrigger(ScheduleJob scheduleJob) { + try { + return (CronTrigger) scheduler.getTrigger(getTriggerKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("获取定时任务CronTrigger出现异常", e); + } + } + + /** + * 创建定时任务 + */ + public void createScheduleJob(ScheduleJob scheduleJob) { + try { + //构建job信息 + JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity(getJobKey(scheduleJob)).build(); + + //表达式调度构建器,可以根据scheduleJob修改withMisfireHandling方法,但是使用异步执行定时任务,没必要 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) + .withMisfireHandlingInstructionFireAndProceed(); + + //按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob)).withSchedule(scheduleBuilder).build(); + + //放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.scheduleJob(jobDetail, trigger); + + //暂停任务 + if (scheduleJob.getStatus().equals(ScheduleConstants.PAUSE)) { + pauseJob(scheduleJob); + } + } catch (SchedulerException e) { + throw new RuntimeException("创建定时任务失败", e); + } + } + + /** + * 更新定时任务 + */ + public void updateScheduleJob(ScheduleJob scheduleJob) { + try { + TriggerKey triggerKey = getTriggerKey(scheduleJob); + + //表达式调度构建器 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()).withMisfireHandlingInstructionFireAndProceed(); + + CronTrigger trigger = getCronTrigger(scheduleJob); + + // 如果定时任务不存在,则创建定时任务 + if (trigger == null) { + createScheduleJob(scheduleJob); + return; + } + + //按新的cronExpression表达式重新构建trigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + + //参数 + trigger.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.rescheduleJob(triggerKey, trigger); + + //暂停任务 + if (scheduleJob.getStatus().equals(ScheduleConstants.PAUSE)) { + pauseJob(scheduleJob); + } + + } catch (SchedulerException e) { + throw new RuntimeException("更新定时任务失败", e); + } + } + + /** + * 立即执行任务 + */ + public void run(ScheduleJob scheduleJob) { + try { + //参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(QuartzJob.JOB_PARAM_KEY, scheduleJob); + + scheduler.triggerJob(getJobKey(scheduleJob), dataMap); + } catch (SchedulerException e) { + throw new RuntimeException("立即执行定时任务失败", e); + } + } + + /** + * 暂停任务 + */ + public void pauseJob(ScheduleJob scheduleJob) { + try { + scheduler.pauseJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("暂停定时任务失败", e); + } + } + + /** + * 恢复任务 + */ + public void resumeJob(ScheduleJob scheduleJob) { + try { + scheduler.resumeJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("恢复定时任务失败", e); + } + } + + /** + * 删除定时任务 + */ + public void deleteScheduleJob(ScheduleJob scheduleJob) { + try { + // 停止触发器 + scheduler.pauseTrigger(getTriggerKey(scheduleJob)); + //移除触发器 + scheduler.unscheduleJob(getTriggerKey(scheduleJob)); + //删除任务 + scheduler.deleteJob(getJobKey(scheduleJob)); + } catch (SchedulerException e) { + throw new RuntimeException("删除定时任务失败", e); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/quartz/SysJobListener.java b/fightwine-admin/src/main/java/com/yzt/admin/quartz/SysJobListener.java new file mode 100644 index 0000000..b88fb87 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/quartz/SysJobListener.java @@ -0,0 +1,72 @@ +package com.yzt.admin.quartz; + +import cn.hutool.core.date.SystemClock; +import cn.hutool.core.util.StrUtil; +import com.yzt.admin.model.ScheduleJob; +import com.yzt.admin.model.ScheduleJobLog; +import com.yzt.admin.service.ScheduleJobLogService; +import com.yzt.admin.util.SpringBeanTaskUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Component; + +import java.util.Date; + + +/** + * 异步监听定时任务事件,解决job线程无故丢失的问题 + * + */ +@Slf4j +@Component +@EnableAsync +@AllArgsConstructor +public class SysJobListener { + + private final ScheduleJobLogService scheduleJobLogService; + + @Async + @EventListener(ScheduleJobEvent.class) + public void scheduleJobEventListener(ScheduleJobEvent event) { + ScheduleJob scheduleJob = event.getScheduleJob(); + //数据库保存执行记录 + ScheduleJobLog jobLog = new ScheduleJobLog(); + jobLog.setJobId(scheduleJob.getJobId()); + jobLog.setBeanName(scheduleJob.getBeanName()); + jobLog.setMethodName(scheduleJob.getMethodName()); + jobLog.setParams(scheduleJob.getParams()); + jobLog.setCreateTime(new Date()); + + //任务开始时间 + long startTime = SystemClock.now(); + + try { + //执行任务 + log.info("任务准备执行,任务ID:" + scheduleJob.getJobId()); + + SpringBeanTaskUtil.invokeMethod(scheduleJob); + + //任务执行总时长 + long times = SystemClock.now() - startTime; + jobLog.setTimes((int)times); + jobLog.setStatus(1); + StringBuilder sb = new StringBuilder(); + + log.info(sb.append("任务执行完毕,任务ID:").append(jobLog.getJobId()).append(" 总共耗时:").append(times).append("毫秒").toString()); + } catch (Exception e) { + log.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e); + + //任务执行总时长 + long times = SystemClock.now() - startTime; + jobLog.setTimes((int)times); + jobLog.setStatus(0); + jobLog.setError(StrUtil.sub(e.toString(), 0, 2000)); + } finally { + scheduleJobLogService.save(jobLog); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/AdminLoginService.java b/fightwine-admin/src/main/java/com/yzt/admin/service/AdminLoginService.java new file mode 100644 index 0000000..0dabdc7 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/AdminLoginService.java @@ -0,0 +1,66 @@ +package com.yzt.admin.service; + +import com.yzt.common.request.LoginAdminUpdatePasswordRequest; +import com.yzt.common.request.LoginAdminUpdateRequest; +import com.yzt.common.request.SystemAdminLoginRequest; +import com.yzt.common.response.MenusResponse; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.response.SystemLoginResponse; + +import java.util.List; +import java.util.Map; + +/** + * 管理端登录服务 + * + */ +public interface AdminLoginService { + + /** + * PC登录 + */ + SystemLoginResponse login(SystemAdminLoginRequest request, String ip); + + /** + * 用户登出 + */ + Boolean logout(); + + /** + * 获取登录页图片 + * @return Map + */ + Map getLoginPic(); + + /** + * 获取管理员可访问目录 + * @return List + */ + List getMenus(); + + /** + * 根据Token获取对应用户信息 + */ + SystemAdminResponse getInfoByToken(); + + /** + * 账号登录检测 + * @param account 账号 + * @return 账号错误登录次数 + */ + Integer accountDetection(String account); + + /** + * 修改登录用户信息 + * + * @param request 请求参数 + * @return Boolean + */ + Boolean loginAdminUpdate(LoginAdminUpdateRequest request); + + + /** + * 修改登录用户密码 + */ + Boolean loginAdminUpdatePwd(LoginAdminUpdatePasswordRequest request); +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/CopyrightService.java b/fightwine-admin/src/main/java/com/yzt/admin/service/CopyrightService.java new file mode 100644 index 0000000..9c66a16 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/CopyrightService.java @@ -0,0 +1,16 @@ +package com.yzt.admin.service; + +import com.yzt.admin.copyright.CopyrightInfoResponse; + +/** + * 版权服务 + * + */ +public interface CopyrightService { + + /** + * 获取版权信息 + */ + CopyrightInfoResponse getInfo(); + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobLogService.java b/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobLogService.java new file mode 100644 index 0000000..820f680 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobLogService.java @@ -0,0 +1,28 @@ +package com.yzt.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.admin.model.ScheduleJobLog; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ScheduleJobLogSearchRequest; + +/** + * ScheduleJobLogService 接口 + * + */ +public interface ScheduleJobLogService extends IService { + + /** + * 自动删除日志 + */ + void autoDeleteLog(); + + /** + * 日志分页列表 + * + * @param request 搜索参数 + * @param pageRequest 分页参数 + * @return PageInfo + */ + PageInfo findLogPageList(ScheduleJobLogSearchRequest request, PageParamRequest pageRequest); +} \ No newline at end of file diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobService.java b/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobService.java new file mode 100644 index 0000000..5f15073 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/ScheduleJobService.java @@ -0,0 +1,61 @@ +package com.yzt.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.admin.model.ScheduleJob; +import com.yzt.common.request.ScheduleJobRequest; + +import java.util.List; + +/** + * ScheduleJobService 接口 + * + */ +public interface ScheduleJobService extends IService { + + /** + * 所有定时任务列表 + */ + List getAll(); + + /** + * 添加定时任务 + * + * @param request 参数 + */ + Boolean add(ScheduleJobRequest request); + + /** + * 定时任务编辑 + * + * @param request 编辑参数 + */ + Boolean edit(ScheduleJobRequest request); + + /** + * 暂停定时任务 + * + * @param jobId 定时任务ID + */ + Boolean suspend(Integer jobId); + + /** + * 启动定时任务 + * + * @param jobId 定时任务ID + */ + Boolean start(Integer jobId); + + /** + * 删除定时任务 + * + * @param jobId 定时任务ID + */ + Boolean delete(Integer jobId); + + /** + * 立即触发定时任务(一次) + * + * @param jobId 定时任务ID + */ + Boolean trig(Integer jobId); +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/WeChatMessageService.java b/fightwine-admin/src/main/java/com/yzt/admin/service/WeChatMessageService.java new file mode 100644 index 0000000..b758ad3 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/WeChatMessageService.java @@ -0,0 +1,11 @@ +package com.yzt.admin.service; + +import javax.servlet.http.HttpServletRequest; + +/** + * 用户中心 服务类 + * + */ +public interface WeChatMessageService{ + String init(HttpServletRequest request); +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/AdminLoginServiceImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/AdminLoginServiceImpl.java new file mode 100644 index 0000000..b34bdd9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/AdminLoginServiceImpl.java @@ -0,0 +1,271 @@ +package com.yzt.admin.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.anji.captcha.model.common.ResponseModel; +import com.yzt.admin.filter.TokenComponent; +import com.yzt.admin.service.AdminLoginService; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.constants.SysGroupDataConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.model.system.SystemPermissions; +import com.yzt.common.request.LoginAdminUpdatePasswordRequest; +import com.yzt.common.request.LoginAdminUpdateRequest; +import com.yzt.common.request.SystemAdminLoginRequest; +import com.yzt.common.response.MenusResponse; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.response.SystemGroupDataAdminLoginBannerResponse; +import com.yzt.common.response.SystemLoginResponse; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.common.vo.MenuTree; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 管理端登录服务实现类 + * + */ +@Service +public class AdminLoginServiceImpl implements AdminLoginService { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Resource + private TokenComponent tokenComponent; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private SystemMenuService systemMenuService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SafetyService safetyService; + /** + * PC登录 + */ + @Override + public SystemLoginResponse login(SystemAdminLoginRequest systemAdminLoginRequest, String ip) { + Integer errorNum = accountDetection(systemAdminLoginRequest.getAccount()); + if (errorNum > 3) { + if (ObjectUtil.isNull(systemAdminLoginRequest.getCaptchaVO())) { + throw new YztException("验证码信息不存在"); + } + // 校验验证码 + ResponseModel responseModel = safetyService.verifySafetyCode(systemAdminLoginRequest.getCaptchaVO()); + if (!responseModel.getRepCode().equals("0000")) { + logger.error("验证码登录失败,repCode = {}, repMsg = {}", responseModel.getRepCode(), responseModel.getRepMsg()); + accountErrorNumAdd(systemAdminLoginRequest.getAccount()); + throw new YztException("验证码校验失败"); + } + } + // 用户验证 + Authentication authentication = null; + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + try { +// CusAuthenticationManager authenticationManager = new CusAuthenticationManager(new CustomAuthenticationProvider()); + authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(systemAdminLoginRequest.getAccount(), systemAdminLoginRequest.getPwd())); + } catch (AuthenticationException e) { + accountErrorNumAdd(systemAdminLoginRequest.getAccount()); + if (e instanceof BadCredentialsException) { + throw new YztException("用户不存在或密码错误"); + } + throw new YztException(e.getMessage()); + }catch (YztException e){ + accountErrorNumAdd(systemAdminLoginRequest.getAccount()); + throw new YztException("账号或密码不正确"); + } + LoginUserVo loginUser = (LoginUserVo) authentication.getPrincipal(); + SystemAdmin systemAdmin = loginUser.getUser(); + + String token = tokenComponent.createToken(loginUser); + SystemLoginResponse systemAdminResponse = new SystemLoginResponse(); + systemAdminResponse.setToken(token); + BeanUtils.copyProperties(systemAdmin, systemAdminResponse); + + //更新最后登录信息 + systemAdmin.setUpdateTime(DateUtil.date()); + systemAdmin.setLoginCount(systemAdmin.getLoginCount() + 1); + systemAdmin.setLastIp(ip); + systemAdminService.updateById(systemAdmin); + accountErrorNumClear(systemAdminLoginRequest.getAccount()); + return systemAdminResponse; + } + + + /** + * 用户登出 + */ + @Override + public Boolean logout() { + LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); + if (ObjectUtil.isNotNull(loginUserVo)) { + // 删除用户缓存记录 + tokenComponent.delLoginUser(loginUserVo.getToken()); + } + return true; + } + + /** + * 获取登录页图片 + * + * @return Map + */ + @Override + public Map getLoginPic() { + Map map = new HashMap<>(); + //背景图 + map.put("backgroundImage", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE)); + //logo + map.put("logo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP)); + map.put("loginLogo", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LOGIN)); + //轮播图 + List bannerList = systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST, SystemGroupDataAdminLoginBannerResponse.class); + map.put("banner", bannerList); + + map.put("siteName", systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_SITE_NAME)); + return map; + } + + /** + * 获取管理员可访问目录 + * + * @return List + */ + @Override + public List getMenus() { + LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); + List roleList = Stream.of(loginUserVo.getUser().getRoles().split(",")).collect(Collectors.toList()); + List menuList; + if (roleList.contains("1")) {// 超管 + menuList = systemMenuService.findAllCatalogue(); + } else { + menuList = systemMenuService.getMenusByUserId(loginUserVo.getUser().getId()); + } + // 组装前端对象 + List responseList = menuList.stream().map(e -> { + MenusResponse response = new MenusResponse(); + BeanUtils.copyProperties(e, response); + return response; + }).collect(Collectors.toList()); + + MenuTree menuTree = new MenuTree(responseList); + return menuTree.buildTree(); + } + + /** + * 根据Token获取对应用户信息 + */ + @Override + public SystemAdminResponse getInfoByToken() { + LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); + SystemAdmin systemAdmin = loginUserVo.getUser(); + SystemAdminResponse systemAdminResponse = new SystemAdminResponse(); + BeanUtils.copyProperties(systemAdmin, systemAdminResponse); + List roleList = Stream.of(systemAdmin.getRoles().split(",")).collect(Collectors.toList()); + List permList = CollUtil.newArrayList(); + if (roleList.contains("1")) { + permList.add("*:*:*"); + } else { + permList = loginUserVo.getPermissions().stream().map(SystemPermissions::getPath).collect(Collectors.toList()); + } + systemAdminResponse.setPermissionsList(permList); + return systemAdminResponse; + } + + @Override + public Integer accountDetection(String account) { + SystemAdmin admin = systemAdminService.selectUserByUserName(account); + if (ObjectUtil.isNull(admin)) { + return 0; + } + String key = StrUtil.format(Constants.ADMIN_ACCOUNT_LOGIN_ERROR_NUM_KEY, account); + if (!redisUtil.exists(key)) { + return 0; + } + Integer num = redisUtil.get(key); + return num; + } + + /** + * 修改登录用户信息 + * + * @param request 请求参数 + * @return Boolean + */ + @Override + public Boolean loginAdminUpdate(LoginAdminUpdateRequest request) { + SystemAdmin admin = SecurityUtil.getLoginUserVo().getUser(); + SystemAdmin systemAdmin = new SystemAdmin(); + systemAdmin.setId(admin.getId()); + systemAdmin.setRealName(request.getRealName()); + systemAdmin.setUpdateTime(DateUtil.date()); + return systemAdminService.updateById(systemAdmin); + } + + /** + * 修改登录用户密码 + */ + @Override + public Boolean loginAdminUpdatePwd(LoginAdminUpdatePasswordRequest request) { + SystemAdmin admin = SecurityUtil.getLoginUserVo().getUser(); + SystemAdmin systemAdmin = systemAdminService.getById(admin.getId()); + String encryptPassword = YztUtil.encryptPassword(request.getOldPassword(), systemAdmin.getAccount()); + if (!systemAdmin.getPwd().equals(encryptPassword)) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "原密码不正确"); + } + SystemAdmin newAdmin = new SystemAdmin(); + newAdmin.setId(admin.getId()); + String pwd = YztUtil.encryptPassword(request.getPassword(), admin.getAccount()); + newAdmin.setPwd(pwd); + newAdmin.setUpdateTime(DateUtil.date()); + return systemAdminService.updateById(newAdmin); + } + + private void accountErrorNumAdd(String account) { + redisUtil.incr(StrUtil.format(Constants.ADMIN_ACCOUNT_LOGIN_ERROR_NUM_KEY, account), 1); + } + + private void accountErrorNumClear(String account) { + String key = StrUtil.format(Constants.ADMIN_ACCOUNT_LOGIN_ERROR_NUM_KEY, account); + if (redisUtil.exists(key)) { + redisUtil.delete(StrUtil.format(Constants.ADMIN_ACCOUNT_LOGIN_ERROR_NUM_KEY, account)); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CaptchaCacheServiceRedisImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CaptchaCacheServiceRedisImpl.java new file mode 100644 index 0000000..a610a6b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CaptchaCacheServiceRedisImpl.java @@ -0,0 +1,53 @@ +package com.yzt.admin.service.impl; + +import com.anji.captcha.service.CaptchaCacheService; +import com.yzt.common.utils.RedisUtil; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis,参考service/spring-boot代码示例。 + * 如果应用是单点的,也没有使用redis,那默认使用内存。 + * 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。 + * + * ☆☆☆ SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。 + * + */ +public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService { + + @Resource + private RedisUtil redisUtil; + + + @Override + public String type() { + return "redis"; + } + + + @Override + public void set(String key, String value, long expiresInSeconds) { + redisUtil.getRedisTemplate().opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS); + } + + @Override + public boolean exists(String key) { + return Boolean.TRUE.equals(redisUtil.getRedisTemplate().hasKey(key)); + } + + @Override + public void delete(String key) { + redisUtil.getRedisTemplate().delete(key); + } + + @Override + public String get(String key) { + return (String) redisUtil.getRedisTemplate().opsForValue().get(key); + } + + @Override + public Long increment(String key, long val) { + return redisUtil.getRedisTemplate().opsForValue().increment(key,val); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CopyrightServiceImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CopyrightServiceImpl.java new file mode 100644 index 0000000..f69ae54 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/CopyrightServiceImpl.java @@ -0,0 +1,77 @@ +package com.yzt.admin.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.admin.copyright.CopyrightInfoResponse; +import com.yzt.admin.service.CopyrightService; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.service.service.SystemConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 版权服务实现类 + * + */ +@Service +public class CopyrightServiceImpl implements CopyrightService { + + @Autowired + private SystemConfigService systemConfigService; + @Autowired + private YztConfig yztConfig; + @Autowired + private RestTemplateUtil restTemplateUtil; + + + private static final String YZT_COPYRIGHT_URL = "https://authorize.yzt.net/api/auth_cert_query?domain_name={}&label={}&version={}"; + private static final String YZT_COPYRIGHT_URL_DATA = "data"; + private static final String YZT_COPYRIGHT_URL_STATUS = "status"; + private static final String YZT_COPYRIGHT_URL_COPYRIGHT = "copyright"; + private static final String YZT_COPYRIGHT_URL_AUTHCODE = "auth_code"; + + + /** + * 获取版权信息 + */ + @Override + public CopyrightInfoResponse getInfo() { + CopyrightInfoResponse response = new CopyrightInfoResponse(); + String domainName = systemConfigService.getValueByKey(Constants.CONFIG_KEY_API_URL); + if (StrUtil.isBlank(domainName)) { + response.setStatus(-2); + return response; + } + String label = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_COPYRIGHT_LABEL); + String version = yztConfig.getVersion(); + if (StrUtil.isBlank(version)) { + throw new YztException("请先在yml中配置版本号"); + } + response.setDomainUrl(domainName); + response.setLabel(Integer.parseInt(label)); + response.setVersion(version); + + JSONObject jsonObject = restTemplateUtil.post(StrUtil.format(YZT_COPYRIGHT_URL, domainName, label, version)); + if (ObjectUtil.isNull(jsonObject.getInteger("status")) || !jsonObject.getInteger("status").equals(200)) { + throw new YztException("YZT版权接口调用失败," + jsonObject); + } + System.out.println("==================================== " + jsonObject.toString()); + JSONObject dataJson = jsonObject.getJSONObject(YZT_COPYRIGHT_URL_DATA); + + response.setStatus(dataJson.getInteger(YZT_COPYRIGHT_URL_STATUS)); + response.setCopyright(dataJson.getString(YZT_COPYRIGHT_URL_COPYRIGHT)); + if (!dataJson.getInteger(YZT_COPYRIGHT_URL_STATUS).equals(1)) { + return response; + } + response.setAuthCode(dataJson.getString(YZT_COPYRIGHT_URL_AUTHCODE)); + response.setCompanyName(systemConfigService.getValueByKey(SysConfigConstants.CONFIG_COPYRIGHT_COMPANY_INFO)); + response.setCompanyImage(systemConfigService.getValueByKey(SysConfigConstants.CONFIG_COPYRIGHT_COMPANY_IMAGE)); + return response; + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobLogServiceImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobLogServiceImpl.java new file mode 100644 index 0000000..469d6d4 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobLogServiceImpl.java @@ -0,0 +1,74 @@ +package com.yzt.admin.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.admin.mapper.ScheduleJobLogMapper; +import com.yzt.admin.model.ScheduleJobLog; +import com.yzt.admin.service.ScheduleJobLogService; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ScheduleJobLogSearchRequest; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * ScheduleJobLogServiceImpl 接口实现 + * + */ +@Service +public class ScheduleJobLogServiceImpl extends ServiceImpl implements ScheduleJobLogService { + + @Resource + private ScheduleJobLogMapper mapper; + + /** + * 自动删除日志 + */ + @Override + public void autoDeleteLog() { + String beforeDate = DateUtil.offsetDay(new Date(), -9).toString("yyyy-MM-dd"); + UpdateWrapper wrapper = Wrappers.update(); + wrapper.lt("create_time", beforeDate); + mapper.delete(wrapper); + } + + /** + * 日志分页列表 + * + * @param request 搜索参数 + * @param pageRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo findLogPageList(ScheduleJobLogSearchRequest request, PageParamRequest pageRequest) { + Page page = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (ObjectUtil.isNotNull(request.getJobId())) { + lqw.eq(ScheduleJobLog::getJobId, request.getJobId()); + } + if (StrUtil.isNotBlank(request.getBeanName())) { + lqw.eq(ScheduleJobLog::getBeanName, request.getBeanName()); + } + if (StrUtil.isNotBlank(request.getMethodName())) { + lqw.eq(ScheduleJobLog::getMethodName, request.getMethodName()); + } + if (ObjectUtil.isNotNull(request.getStatus())) { + lqw.eq(ScheduleJobLog::getStatus, request.getStatus()); + } + lqw.orderByDesc(ScheduleJobLog::getLogId); + List list = mapper.selectList(lqw); + return CommonPage.copyPageInfo(page, list); + } +} + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobServiceImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobServiceImpl.java new file mode 100644 index 0000000..31e8f61 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/ScheduleJobServiceImpl.java @@ -0,0 +1,186 @@ +package com.yzt.admin.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.admin.mapper.ScheduleJobMapper; +import com.yzt.admin.model.ScheduleJob; +import com.yzt.admin.quartz.ScheduleConstants; +import com.yzt.admin.quartz.ScheduleManager; +import com.yzt.admin.service.ScheduleJobService; +import com.yzt.common.exception.YztException; +import com.yzt.common.request.ScheduleJobRequest; +import javax.annotation.PostConstruct; +import org.quartz.CronTrigger; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * ScheduleJobServiceImpl 接口实现 + * + */ +@Service +public class ScheduleJobServiceImpl extends ServiceImpl implements ScheduleJobService { + + @Resource + private ScheduleJobMapper mapper; + + @Autowired + private ScheduleManager scheduleManager; + + /** + * 项目启动时,初始化定时器 + */ + @PostConstruct + public void init() { + getAll().forEach(scheduleJob -> { + CronTrigger trigger = scheduleManager.getCronTrigger(scheduleJob); + // 如果定时任务不存在,则创建定时任务 + if (trigger == null) { + scheduleManager.createScheduleJob(scheduleJob); + } else if (ScheduleConstants.NORMAL.equals(scheduleJob.getStatus())) { + scheduleManager.resumeJob(scheduleJob); + } else if (ScheduleConstants.PAUSE.equals(scheduleJob.getStatus())) { + scheduleManager.pauseJob(scheduleJob); + } + }); + } + + /** + * 获取所有的job + * + * @return List + */ + @Order + public List getAll() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(ScheduleJob::getIsDelte, false); + lqw.orderByDesc(ScheduleJob::getJobId); + return mapper.selectList(lqw); + } + + /** + * 添加定时任务 + * + * @param request 参数 + */ + @Override + public Boolean add(ScheduleJobRequest request) { + ScheduleJob scheduleJob = new ScheduleJob(); + BeanUtils.copyProperties(request, scheduleJob); + scheduleJob.setJobId(null); + scheduleJob.setStatus(ScheduleConstants.PAUSE); + scheduleJob.setIsDelte(false); + boolean save = save(scheduleJob); + if (save) { + scheduleManager.createScheduleJob(scheduleJob); + } + return save; + } + + /** + * 定时任务编辑 + * + * @param request 编辑参数 + */ + @Override + public Boolean edit(ScheduleJobRequest request) { + if (ObjectUtil.isNull(request.getJobId())) { + throw new YztException("定时任务ID不能为空"); + } + ScheduleJob scheduleJob = getByIdException(request.getJobId()); + if (scheduleJob.getStatus().equals(ScheduleConstants.NORMAL)) { + throw new YztException("请先暂停定时任务"); + } + BeanUtils.copyProperties(request, scheduleJob); + boolean update = updateById(scheduleJob); + if (update) { + scheduleManager.updateScheduleJob(scheduleJob); + } + return update; + } + + /** + * 暂停定时任务 + * + * @param jobId 定时任务ID + */ + @Override + public Boolean suspend(Integer jobId) { + ScheduleJob scheduleJob = getByIdException(jobId); + if (scheduleJob.getStatus().equals(ScheduleConstants.PAUSE)) { + throw new YztException("定时任务已暂停,请勿重复操作"); + } + scheduleJob.setStatus(ScheduleConstants.PAUSE); + boolean update = updateById(scheduleJob); + if (update) { + scheduleManager.pauseJob(scheduleJob); + } + return update; + } + + /** + * 启动定时任务 + * + * @param jobId 定时任务ID + */ + @Override + public Boolean start(Integer jobId) { + ScheduleJob scheduleJob = getByIdException(jobId); + if (scheduleJob.getStatus().equals(ScheduleConstants.NORMAL)) { + throw new YztException("定时任务已启动,请勿重复操作"); + } + scheduleJob.setStatus(ScheduleConstants.NORMAL); + boolean update = updateById(scheduleJob); + if (update) { + scheduleManager.resumeJob(scheduleJob); + } + return update; + } + + /** + * 删除定时任务 + * + * @param jobId 定时任务ID + */ + @Override + public Boolean delete(Integer jobId) { + ScheduleJob scheduleJob = getByIdException(jobId); + if (scheduleJob.getStatus().equals(ScheduleConstants.NORMAL)) { + throw new YztException("请先暂停定时任务"); + } + scheduleJob.setIsDelte(true); + boolean delete = updateById(scheduleJob); + if (delete) { + scheduleManager.deleteScheduleJob(scheduleJob); + } + return delete; + } + + /** + * 立即触发定时任务(一次) + * + * @param jobId 定时任务ID + */ + @Override + public Boolean trig(Integer jobId) { + ScheduleJob scheduleJob = getByIdException(jobId); + scheduleManager.run(scheduleJob); + return Boolean.TRUE; + } + + private ScheduleJob getByIdException(Integer jobId) { + ScheduleJob scheduleJob = getById(jobId); + if (ObjectUtil.isNull(scheduleJob) || scheduleJob.getIsDelte()) { + throw new YztException("定时任务不存在"); + } + return scheduleJob; + } +} + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/service/impl/WeChatMessageServiceImpl.java b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/WeChatMessageServiceImpl.java new file mode 100644 index 0000000..833e035 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/service/impl/WeChatMessageServiceImpl.java @@ -0,0 +1,215 @@ +package com.yzt.admin.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.admin.service.WeChatMessageService; +import com.yzt.admin.vo.*; +import com.yzt.common.constants.WeChatConstants; +import com.yzt.common.model.article.Article; +import com.yzt.common.model.wechat.WechatReply; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.XmlUtil; +import com.yzt.service.service.ArticleService; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.UserTokenService; +import com.yzt.service.service.WechatReplyService; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + + +/** + * 用户中心 服务实现类 + * + */ +@Data +@Service +public class WeChatMessageServiceImpl implements WeChatMessageService { + private static final Logger logger = LoggerFactory.getLogger(WeChatMessageServiceImpl.class); + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private WechatReplyService wechatReplyService; + + @Autowired + private ArticleService articleService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + //接收人,被动回复消息的时候为发送人 + private String toUserName; + + //发送人,被动回复消息的时候为接收人 + private String fromUserName; + + //接收消息类型 + private String msgType; + + //接收消息内容 + private String content; + + //消息事件 + private String event; + + //事件key + private String eventKey; + + //关键字回复对象 + private WechatReply wechatReply; + + + /** + * 处理微信推送过来的消息,并且组装成需要发送的数据,二次处理 + * @param request HttpServletRequest request请求 + * @author Mr.Zhang + * @since 2020-06-03 + * @return String + */ + @Override + public String init(HttpServletRequest request) { + Map map = XmlUtil.xmlToMap(request); + + setToUserName(map.get("ToUserName")); + setFromUserName(map.get("FromUserName")); + setMsgType(map.getOrDefault("MsgType", "text")); //如果没有类型,则按默认处理 + setContent(map.getOrDefault("Content", "default")); //如果没有内容,则按默认处理 + setEvent(map.getOrDefault("Event", "")); + setEventKey(map.getOrDefault("EventKey", "")); + + + + //处理内容 + getReplyByContent(); + + if(null == getWechatReply()){ + return ""; + } + + //设置需要回复的内容 + String response = setXml(); + + logger.info("微信被动回复消息" + response); + return response; + } + + /** + * 匹配关键字并且组装xml数据 + * @author Mr.Zhang + * @since 2020-06-03 + * @return String + */ + private String setXml() { + if(StringUtils.isBlank(getWechatReply().getType())){ + return ""; + } + String type = getWechatReply().getType().toLowerCase(); + MessageReplyDataVo messageReplyDataVo = JSONObject.toJavaObject(JSONObject.parseObject(wechatReply.getData()), MessageReplyDataVo.class); + + switch (type){ + case WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_TEXT: + MessageTextVo messageTextVo = new MessageTextVo(getFromUserName(), getToUserName(), messageReplyDataVo.getContent()); + return XmlUtil.objectToXml(messageTextVo); + case WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_VOICE: + return XmlUtil.objectToXml(new MessageVoiceVo(getFromUserName(), getToUserName(), new MessageVoiceItemVo(messageReplyDataVo.getMediaId()))); + case WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_IMAGE: + return XmlUtil.objectToXml(new MessageImageVo(getFromUserName(), getToUserName(), new MessageImageItemVo(messageReplyDataVo.getMediaId()))); + case WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_NEWS: + //文章 + return getNews(messageReplyDataVo.getArticleId()); + default: + return ""; + } + } + + /** + * 组装文章消息 + * @param articleId Integer 文章id + * @author Mr.Zhang + * @since 2020-06-03 + * @return MessageVoiceVo + */ + private String getNews(Integer articleId) { + Article article = articleService.getById(articleId); + if(null == article || article.getStatus() || article.getHide()){ + return ""; + } + + return "\n" + + " \n" + + " \n" + + " "+ YztDateUtil.getNowTime() +"\n" + + " \n" + + " 1\n" + + " \n" + + " \n" + + " <![CDATA["+article.getTitle()+"]]>\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "\n"; + } + + + /** + * 处理不同的消息类型 + * @author Mr.Zhang + * @since 2020-06-03 + */ + private void getReplyByContent() { + WechatReply wp = new WechatReply(); + switch (getMsgType()){ + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_EVENT: + if(StringUtils.isBlank(getEvent())){ + break; + } + switch (getEvent().toLowerCase()){ + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_UNSUBSCRIBE: + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_SCAN: + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_LOCATION: + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_VIEW: + //暂时不处理 + break; + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_SUBSCRIBE: + wp = wechatReplyService.getVoByKeywords(WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_SUBSCRIBE.toLowerCase()); + break; + case WeChatConstants.WE_CHAT_MESSAGE_EVENT_TYPE_CLICK: + wp = wechatReplyService.getVoByKeywords(eventKey); + break; + + } + break; + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_TEXT: + wp = wechatReplyService.getVoByKeywords(getContent()); + break; + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_IMAGE: + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_VOICE: + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_VIDEO: + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_LOCATION: + case WeChatConstants.WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_LINK: + //不需要处理 + break; + default: + break; + } + + if(null == wp){ + //无效关键字回复 + wp = wechatReplyService.getVoByKeywords(WeChatConstants.WE_CHAT_MESSAGE_DEFAULT_CONTENT_KEY); + } + setWechatReply(wp); + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/bargain/BargainStopChangeTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/bargain/BargainStopChangeTask.java new file mode 100644 index 0000000..f06d72f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/bargain/BargainStopChangeTask.java @@ -0,0 +1,37 @@ +package com.yzt.admin.task.bargain; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.StoreBargainService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 砍价活动结束状态变化定时任务 + * + */ +@Component("BargainStopChangeTask") +public class BargainStopChangeTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(BargainStopChangeTask.class); + + @Autowired + private StoreBargainService storeBargainService; + + /** + * 每天0点执行 + */ + public void bargainStopChange() { + // cron : 0 0 0 */1 * ? + logger.info("---BargainStopChangeTask------bargain stop status change task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + storeBargainService.stopAfterChange(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("BargainStopChangeTask" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageFrozenTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageFrozenTask.java new file mode 100644 index 0000000..9d5eb48 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageFrozenTask.java @@ -0,0 +1,39 @@ +package com.yzt.admin.task.brokerage; + + +import com.yzt.admin.task.order.OrderReceiptTask; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.UserBrokerageRecordService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 佣金冻结期解冻task + * + */ +@Component("BrokerageFrozenTask") +public class BrokerageFrozenTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderReceiptTask.class); + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + /** + * 1小时同步一次数据 + */ + public void brokerageFrozen() { + // cron : 0 0 */1 * * ? + logger.info("---BrokerageFrozenTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + userBrokerageRecordService.brokerageThaw(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("BrokerageFrozenTask.task" + " | msg : " + e.getMessage()); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageReleaseTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageReleaseTask.java new file mode 100644 index 0000000..5c1513c --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/brokerage/BrokerageReleaseTask.java @@ -0,0 +1,36 @@ +package com.yzt.admin.task.brokerage; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.UserBrokerageRecordService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 每日释放超过7天的佣金记录任务 + * + */ +@Component("BrokerageReleaseTask") +public class BrokerageReleaseTask { + + private static final Logger logger = LoggerFactory.getLogger(BrokerageReleaseTask.class); + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + /** + * 调度入口(与 fw_schedule_job 表中 method_name 对应) + */ + public void brokerageRelease() { + logger.info("---BrokerageReleaseTask------release overdue brokerage: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + userBrokerageRecordService.brokerageRelease(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("BrokerageReleaseTask.task" + " | msg : " + e.getMessage()); + } + } +} + + diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/coupon/CouponOverdueTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/coupon/CouponOverdueTask.java new file mode 100644 index 0000000..3ed567e --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/coupon/CouponOverdueTask.java @@ -0,0 +1,37 @@ +package com.yzt.admin.task.coupon; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.StoreCouponUserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 优惠券过期定时任务 + * + */ +@Component("CouponOverdueTask") +public class CouponOverdueTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(CouponOverdueTask.class); + + @Autowired + private StoreCouponUserService couponUserService; + + /** + * 1分钟同步一次数据 + */ + public void couponOverdue() { + // cron : 0 */1 * * * ? + logger.info("---CouponOverdueTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + couponUserService.overdueTask(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("CouponOverdueTask.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/integral/IntegralFrozenTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/integral/IntegralFrozenTask.java new file mode 100644 index 0000000..7c85d14 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/integral/IntegralFrozenTask.java @@ -0,0 +1,38 @@ +package com.yzt.admin.task.integral; + + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.UserIntegralRecordService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 积分冻结期解冻task + * + */ +@Component("IntegralFrozenTask") +public class IntegralFrozenTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(IntegralFrozenTask.class); + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + /** + * 1分钟同步一次数据 + */ + public void integralFrozen() { + // cron : 0 */1 * * * ? + logger.info("---IntegralFrozenTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + userIntegralRecordService.integralThaw(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("IntegralFrozenTask.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/log/AutoDeleteLogTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/log/AutoDeleteLogTask.java new file mode 100644 index 0000000..f154c9d --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/log/AutoDeleteLogTask.java @@ -0,0 +1,41 @@ +package com.yzt.admin.task.log; + +import com.yzt.admin.service.ScheduleJobLogService; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.WechatExceptionsService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 自动删除不需要的历史日志 + * + */ +@Component("AutoDeleteLogTask") +public class AutoDeleteLogTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(AutoDeleteLogTask.class); + + @Autowired + private ScheduleJobLogService scheduleJobLogService; + @Autowired + private WechatExceptionsService wechatExceptionsService; + + /** + * 每天0点执行 + */ + public void autoDeleteLog() { + // cron : 0 0 0 */1 * ? + logger.info("---BargainStopChangeTask------bargain stop status change task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + scheduleJobLogService.autoDeleteLog(); + wechatExceptionsService.autoDeleteLog(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("BargainStopChangeTask" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCancelTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCancelTask.java new file mode 100644 index 0000000..f273916 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCancelTask.java @@ -0,0 +1,36 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 系统自动取消未支付订单task任务 + * + */ +@Component("OrderAutoCancelTask") +public class OrderAutoCancelTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderAutoCancelTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void autoCancel() { + // cron : 0 */1 * * * ? + logger.info("---OrderAutoCancelTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.autoCancel(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderAutoCancelTask.task" + " | msg : " + e.getMessage()); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCompleteTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCompleteTask.java new file mode 100644 index 0000000..2af9b9b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoCompleteTask.java @@ -0,0 +1,37 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 订单自动完成Task + * + */ +@Component("OrderAutoCompleteTask") +public class OrderAutoCompleteTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderCompleteTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 每小时同步一次数据 + */ + public void autoComplete() { + // cron : 0 0 */1 * * ? + logger.info("---OrderAutoCompleteTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.autoComplete(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderAutoCompleteTask.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoReceiptTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoReceiptTask.java new file mode 100644 index 0000000..4ebb01d --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderAutoReceiptTask.java @@ -0,0 +1,33 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 系统自动确认收货Task + * + */ +@Component("OrderAutoReceiptTask") +public class OrderAutoReceiptTask { + + private static final Logger LOGGER = LoggerFactory.getLogger(OrderAutoReceiptTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + public void autoTakeDelivery() { + // cron : 0 0 0 */1 * ? + LOGGER.info("---OrderAutoReceiptTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.autoTakeDelivery(); + } catch (Exception e) { + e.printStackTrace(); + LOGGER.error("OrderAutoReceiptTask.exception" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCancelTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCancelTask.java new file mode 100644 index 0000000..05e9d5b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCancelTask.java @@ -0,0 +1,36 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户取消订单task任务 + * + */ +@Component("OrderCancelTask") +public class OrderCancelTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderCancelTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void userCancel() { + // cron : 0 */1 * * * ? + logger.info("---OrderCancelTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.cancelByUser(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderCancelTask.task" + " | msg : " + e.getMessage()); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCompleteTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCompleteTask.java new file mode 100644 index 0000000..594a9f9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderCompleteTask.java @@ -0,0 +1,36 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 用户订单完成task任务 + * + */ +@Component("OrderCompleteTask") +public class OrderCompleteTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderCompleteTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void orderComplete() { + // cron : 0 */1 * * * ? + logger.info("---OrderCompleteTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.complete(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderCompleteTask.task" + " | msg : " + e.getMessage()); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderPaySuccessTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderPaySuccessTask.java new file mode 100644 index 0000000..a00808b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderPaySuccessTask.java @@ -0,0 +1,37 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 订单支付成功后置task任务 + * + */ +@Component("OrderPaySuccessTask") +public class OrderPaySuccessTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderPaySuccessTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void orderPayAfter() { + // cron : 0 */1 * * * ? + logger.info("---OrderPaySuccessTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.orderPaySuccessAfter(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderPaySuccessTask.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderReceiptTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderReceiptTask.java new file mode 100644 index 0000000..fb7cded --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderReceiptTask.java @@ -0,0 +1,36 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** 用户确认收货Task + * + */ +@Component("OrderReceiptTask") +public class OrderReceiptTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderReceiptTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void orderReceipt() { + //cron : 0 */1 * * * ? + logger.info("---OrderReceiptTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.orderReceiving(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderReceiptTask.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderRefundTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderRefundTask.java new file mode 100644 index 0000000..a50d24b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/order/OrderRefundTask.java @@ -0,0 +1,44 @@ +package com.yzt.admin.task.order; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.OrderTaskService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 账单退款操作 + * + */ +@Component("OrderRefundTask") +public class OrderRefundTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderRefundTask.class); + + @Autowired + private OrderTaskService orderTaskService; + + /** + * 1分钟同步一次数据 + */ + public void orderRefund() { + // cron : 0 */1 * * * ? + logger.info("---OrderRefundTask task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + orderTaskService.refundApply(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderRefundTask.task" + " | msg : " + e.getMessage()); + } + } + + + @Scheduled(fixedDelay = 1000 * 60L) // + public void init(){ + + + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/pink/PinkStatusChangeTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/pink/PinkStatusChangeTask.java new file mode 100644 index 0000000..09deaa5 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/pink/PinkStatusChangeTask.java @@ -0,0 +1,35 @@ +package com.yzt.admin.task.pink; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.StorePinkService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 拼团状态变化Task + * + */ +@Component("PinkStatusChangeTask") +public class PinkStatusChangeTask { + + //日志 + private static final Logger logger = LoggerFactory.getLogger(PinkStatusChangeTask.class); + + @Autowired + private StorePinkService storePinkService; + + /** + * 每分钟执行一次 + */ + public void pinkStatusChage() { + // cron : 0 */1 * * * ? + logger.info("---PinkStatusChange------bargain stop status change task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + storePinkService.detectionStatus(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("PinkStatusChange" + " | msg : " + e.getMessage()); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/product/ProductStockTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/product/ProductStockTask.java new file mode 100644 index 0000000..616584c --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/product/ProductStockTask.java @@ -0,0 +1,51 @@ +package com.yzt.admin.task.product; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.StoreBargainService; +import com.yzt.service.service.StoreCombinationService; +import com.yzt.service.service.StoreProductService; +import com.yzt.service.service.StoreSeckillService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** 操作商品库存 + * + */ + +@Component("ProductStockTask") +public class ProductStockTask { + //日志 + private static final Logger logger = LoggerFactory.getLogger(ProductStockTask.class); + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreSeckillService storeSeckillService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreCombinationService storeCombinationService; + + /** + * 1分钟同步一次数据 + */ + public void stockOperation() { + // cron : 0 */1 * * * ? + logger.info("---OrderTakeByUser task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDateTime()); + try { + storeProductService.consumeProductStock(); // 商品本身库存任务 + storeSeckillService.consumeProductStock(); // 秒杀本身库存任务 + storeBargainService.consumeProductStock(); // 砍价本身库存任务 + storeCombinationService.consumeProductStock(); // 拼团本身库存任务 + } catch (Exception e) { + e.printStackTrace(); + logger.error("OrderTakeByUser.task" + " | msg : " + e.getMessage()); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/statistics/SubsidyRewardTask.java b/fightwine-admin/src/main/java/com/yzt/admin/task/statistics/SubsidyRewardTask.java new file mode 100644 index 0000000..e2d36c9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/statistics/SubsidyRewardTask.java @@ -0,0 +1,32 @@ +package com.yzt.admin.task.statistics; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.SubsidyRewardService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 每周补贴奖励任务 + */ +@Component("SubsidyRewardTask") +public class SubsidyRewardTask { + + private static final Logger logger = LoggerFactory.getLogger(SubsidyRewardTask.class); + + @Autowired + private SubsidyRewardService subsidyRewardService; + + /** + * 每周一凌晨3点执行(通过调度表配置 cron 表达式:0 0 3 ? * MON) + */ + public void weeklySubsidyReward() { + logger.info("---SubsidyRewardTask.weeklySubsidyReward start, time={}---", YztDateUtil.nowDateTime()); + try { + subsidyRewardService.weeklySubsidyReward(); + } catch (Exception e) { + logger.error("SubsidyRewardTask.weeklySubsidyReward error", e); + } + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatProgramTempMessage.java b/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatProgramTempMessage.java new file mode 100644 index 0000000..3fe1d30 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatProgramTempMessage.java @@ -0,0 +1,33 @@ +package com.yzt.admin.task.wechat; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.TemplateMessageService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 小程序消费队列消费 + * + */ +@Component("AsyncWeChatProgramTempMessage") +public class AsyncWeChatProgramTempMessage { + //日志 + private static final Logger logger = LoggerFactory.getLogger(AsyncWeChatProgramTempMessage.class); + + @Autowired + private TemplateMessageService templateMessageService; + + //1分钟同步一次数据 + public void init(){ + logger.info("---AsyncWeChatProgramTempMessage task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDate()); + try { + templateMessageService.consumeProgram(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("AsyncWeChatProgramTempMessage.task" + " | msg : " + e.getMessage()); + } + + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatPublicTempMessage.java b/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatPublicTempMessage.java new file mode 100644 index 0000000..6f49a4b --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/task/wechat/AsyncWeChatPublicTempMessage.java @@ -0,0 +1,34 @@ +package com.yzt.admin.task.wechat; + +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.TemplateMessageService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 公众号消费队列消费 + * + */ +@Component("AsyncWeChatPublicTempMessage") +public class AsyncWeChatPublicTempMessage { + //日志 + private static final Logger logger = LoggerFactory.getLogger(AsyncWeChatPublicTempMessage.class); + + @Autowired + private TemplateMessageService templateMessageService; + + //1分钟同步一次数据 + public void init() { + logger.info("---AsyncWeChatPublicTempMessage task------produce Data with fixed rate task: Execution Time - {}", YztDateUtil.nowDate()); + try { + templateMessageService.consumePublic(); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("AsyncWeChatPublicTempMessage.task" + " | msg : " + e.getMessage()); + } + + } +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/util/SpringBeanTaskUtil.java b/fightwine-admin/src/main/java/com/yzt/admin/util/SpringBeanTaskUtil.java new file mode 100644 index 0000000..9714a9f --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/util/SpringBeanTaskUtil.java @@ -0,0 +1,34 @@ +package com.yzt.admin.util; + +import cn.hutool.core.util.StrUtil; +import com.yzt.admin.model.ScheduleJob; +import com.yzt.common.utils.SpringUtil; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Method; + +/** + * 定时任务spring bean 执行定时任务 + * + */ +public class SpringBeanTaskUtil { + + public static void invokeMethod(ScheduleJob scheduleJob) { + Object target = SpringUtil.getBean(scheduleJob.getBeanName()); + try { + if (StrUtil.isNotEmpty(scheduleJob.getParams())) { + Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName(), String.class); + ReflectionUtils.makeAccessible(method); + method.invoke(target, scheduleJob.getParams()); + } else { + Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName()); + ReflectionUtils.makeAccessible(method); + method.invoke(target); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("执行定时任务失败", e); + } + } + +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/BaseMessageVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/BaseMessageVo.java new file mode 100644 index 0000000..66407ef --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/BaseMessageVo.java @@ -0,0 +1,30 @@ +package com.yzt.admin.vo; + +import com.yzt.common.utils.YztDateUtil; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息基础模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BaseMessageVo对象", description="微信消息基础模板") +public class BaseMessageVo{ + @ApiModelProperty(value = "开发者微信号") + protected String ToUserName; + + @ApiModelProperty(value = "发送方帐号(一个OpenID)") + protected String FromUserName; + + @ApiModelProperty(value = "消息创建时间 (整型)") + protected Long CreateTime = YztDateUtil.getTime(); + + @ApiModelProperty(value = "消息类型,文本为text") + protected String MsgType = "text"; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageItemVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageItemVo.java new file mode 100644 index 0000000..4c66942 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageItemVo.java @@ -0,0 +1,25 @@ +package com.yzt.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息 图片/语音 模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageImageItemVo对象", description="微信消息 图片/语音 模板") +public class MessageImageItemVo{ + public MessageImageItemVo() {} + public MessageImageItemVo(String mediaId) { + MediaId = mediaId; + } + + @ApiModelProperty(value = "通过素材管理中的接口上传多媒体文件,得到的id。") + private String MediaId; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageVo.java new file mode 100644 index 0000000..c8adb88 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageImageVo.java @@ -0,0 +1,30 @@ +package com.yzt.admin.vo; + +import com.yzt.common.constants.WeChatConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息 图片/语音 模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageMediaVo对象", description="微信消息 图片/语音 模板") +public class MessageImageVo extends BaseMessageVo { + public MessageImageVo() {} + public MessageImageVo(String toUserName, String fromUserName, MessageImageItemVo image) { + super(); + ToUserName = toUserName; + FromUserName = fromUserName; + MsgType = WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_IMAGE; + Image = image; + } + + @ApiModelProperty(value = "通过素材管理中的接口上传多媒体文件,得到的id。") + private MessageImageItemVo Image; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageReplyDataVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageReplyDataVo.java new file mode 100644 index 0000000..075f947 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageReplyDataVo.java @@ -0,0 +1,30 @@ +package com.yzt.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 数据存储回复消息内容对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageReplyDataVo对象", description="数据存储回复消息内容对象") +public class MessageReplyDataVo{ + + @ApiModelProperty(value = "文本消息内容") + private String Content; + + @ApiModelProperty(value = "图片/音频链接") + private String src; + + @ApiModelProperty(value = "图片/音频媒体ID") + private String mediaId; + + @ApiModelProperty(value = "文本消息内容") + private Integer articleId; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageTextVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageTextVo.java new file mode 100644 index 0000000..c984a40 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageTextVo.java @@ -0,0 +1,28 @@ +package com.yzt.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息文本模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageTextVo对象", description="微信消息文本模板") +public class MessageTextVo extends BaseMessageVo { + public MessageTextVo() {} + public MessageTextVo(String toUserName, String fromUserName, String content) { + super(); + ToUserName = toUserName; + FromUserName = fromUserName; + Content = content; + } + + @ApiModelProperty(value = "文本消息内容") + private String Content; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceItemVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceItemVo.java new file mode 100644 index 0000000..fcb63f9 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceItemVo.java @@ -0,0 +1,25 @@ +package com.yzt.admin.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息 图片/语音 模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageVoiceItemVo对象", description="微信消息 图片/语音 模板") +public class MessageVoiceItemVo{ + public MessageVoiceItemVo() {} + public MessageVoiceItemVo(String mediaId) { + MediaId = mediaId; + } + + @ApiModelProperty(value = "通过素材管理中的接口上传多媒体文件,得到的id。") + private String MediaId; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceVo.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceVo.java new file mode 100644 index 0000000..d9c1842 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/MessageVoiceVo.java @@ -0,0 +1,30 @@ +package com.yzt.admin.vo; + +import com.yzt.common.constants.WeChatConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信消息 图片/语音 模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MessageMediaVo对象", description="微信消息 图片/语音 模板") +public class MessageVoiceVo extends BaseMessageVo { + public MessageVoiceVo() {} + public MessageVoiceVo(String toUserName, String fromUserName, MessageVoiceItemVo voice) { + super(); + ToUserName = toUserName; + FromUserName = fromUserName; + MsgType = WeChatConstants.WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_VOICE; + Voice = voice; + } + + @ApiModelProperty(value = "通过素材管理中的接口上传多媒体文件,得到的id。") + private MessageVoiceItemVo Voice; +} diff --git a/fightwine-admin/src/main/java/com/yzt/admin/vo/ValidateCode.java b/fightwine-admin/src/main/java/com/yzt/admin/vo/ValidateCode.java new file mode 100644 index 0000000..678f712 --- /dev/null +++ b/fightwine-admin/src/main/java/com/yzt/admin/vo/ValidateCode.java @@ -0,0 +1,33 @@ +package com.yzt.admin.vo; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 验证码类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ValidateCode对象", description="验证码类") +public class ValidateCode implements Serializable { + + public ValidateCode(String key, String code) { + this.key = key; + this.code = code; + } + + @ApiModelProperty(value = "key", required = true) + private String key; + + @ApiModelProperty(value = "code", required = true) + private String code; + +} diff --git a/fightwine-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/fightwine-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..d732dd5 --- /dev/null +++ b/fightwine-admin/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "properties": [ + { + "name": "wx.miniapp.configs", + "type": "java.util.List", + "description": "Description for wx.miniapp.configs." + } + ] +} diff --git a/fightwine-admin/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService b/fightwine-admin/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService new file mode 100644 index 0000000..6a7b5ef --- /dev/null +++ b/fightwine-admin/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService @@ -0,0 +1 @@ +com.yzt.admin.service.impl.CaptchaCacheServiceRedisImpl \ No newline at end of file diff --git a/fightwine-admin/src/main/resources/application.yml b/fightwine-admin/src/main/resources/application.yml new file mode 100644 index 0000000..2a8de4e --- /dev/null +++ b/fightwine-admin/src/main/resources/application.yml @@ -0,0 +1,174 @@ +# YZT 相关配置 +yzt: + version: YZT-JAVA # 当前代码版本 + domain: #配合swagger使用 # 待部署域名 + wechat-api-url: #请求微信接口中专服务器 + wechat-js-api-debug: false #微信js api系列是否开启调试模式 + wechat-js-api-beta: true #微信js api是否是beta版本 + asyncConfig: true #是否同步config表数据到redis + asyncWeChatProgramTempList: false #是否同步小程序公共模板库 + imagePath: /opt/fightwine/images/ # 服务器图片路径配置 斜杠结尾 + demoSite: true # 是否演示站点 所有手机号码都会掩码 + activityStyleCachedTime: 10 #活动边框缓存周期 秒为单位,生产环境适当5-10分钟即可 + ignored: #安全路径白名单 + - swagger-ui/ + - swagger-resources/** + - /**/v2/api-docs + - /**/*.html + - /**/*.js + - /**/*.css + - /**/*.png + - /**/*.map + - /favicon.ico + - /actuator/** + - /druid/** + - api/admin/pagediy/info + - api/public/** + +# 配置端口 +server: + port: 10086 + servlet: + context-path: / # 访问path + tomcat: + uri-encoding: UTF-8 # 默认编码格式 + max-threads: 1000 # 最大线程数量 默认200 + min-spare-threads: 30 # 初始化启动线程数量 + +spring: + main: + allow-circular-references: true + mvc: + path match: + matching-strategy: ant_path_matcher + profiles: + # 配置的环境 +# active: #spring.profiles.active# + active: + servlet: + multipart: + max-file-size: 50MB #设置单个文件大小 + max-request-size: 50MB #设置单次请求文件的总大小 + application: + name: fightwine-admin #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name + jackson: + locale: zh_CN + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + # 数据库配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://183.6.65.90:5001/fight_wine?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: Yizhitong@2024 + # quartz + quartz: + properties: + org: + quartz: + scheduler: + instanceName: quartzScheduler + instanceId: AUTO + jobStore: + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ + isClustered: false + clusterCheckinInterval: 10000 + useProperties: false + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + #数据库方式 + job-store-type: JDBC + + redis: + host: 183.6.65.90 #地址 + port: 5004 #端口 + password: Cbms@dev + timeout: 30000 # 连接超时时间(毫秒) + database: 6 #默认数据库 + jedis: + pool: + max-active: 200 # 连接池最大连接数(使用负值表示没有限制) + max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-idle: 10 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + time-between-eviction-runs: -1 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 + second: + database: 14 # 微信accessToken存储库 + +debug: true +logging: + level: + io.swagger.*: error + org.springframework.boot.autoconfigure: debug + config: classpath:logback-spring.xml + file: + path: ./yzt_log/admin/ + +# mybatis 配置 +mybatis-plus: + mapper-locations: classpath*:mapper/*/*Mapper.xml #xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置) + typeAliasesPackage: com.yzt.**.model + # 配置slq打印日志 + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: +# logic-delete-field: isDel #全局逻辑删除字段值 3.3.0开始支持,详情看下面。 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + + +#swagger 配置 +swagger: + basic: + enable: true #是否开启 + check: false #是否打开验证 + username: #访问swagger的账号 + password: #访问swagger的密码 + +# 行为验证码 +aj: + captcha: + type: default # 验证码类型 + water-mark: YZT # 水印 + slip-offset: 15 # 校验滑动拼图允许误差偏移量(默认5像素) + aes-status: true # aes加密坐标开启或者禁用(true|false) + interference-options: 2 # 滑动干扰项(0/1/2) + font-style: 1 # 点选字体样式 默认Font.BOLD + font-size: 25 # 点选字体字体大小 + req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false + req-get-lock-limit: 5 # 验证失败5次,get接口锁定 + req-get-lock-seconds: 360 # 验证失败后,锁定时间间隔,s + req-get-minute-limit: 30 # get接口一分钟内请求数限制 + req-check-minute-limit: 60 # check接口一分钟内请求数限制 + req-verify-minute-limit: 60 # verify接口一分钟内请求数限制 + + # 滑动验证,底图路径,不配置将使用默认图片 + # 支持全路径 + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/jigsaw + jigsaw: classpath:images/jigsaw + #滑动验证,底图路径,不配置将使用默认图片 + ##支持全路径 + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/pic-click + pic-click: classpath:images/pic-click + # 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis或者memcache, + # 参考CaptchaCacheServiceRedisImpl.java + # 如果应用是单点的,也没有使用redis,那默认使用内存。 + # 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。 + # !!! 注意啦,如果应用有使用spring-boot-starter-data-redis, + # 请打开CaptchaCacheServiceRedisImpl.java注释。 + # redis -----> SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。 + # 缓存local/redis... + cache-type: redis + # local缓存的阈值,达到这个值,清除缓存 + cache-number: 1000 + # local定时清除过期缓存(单位秒),设置为0代表不执行 + timing-clear: 3600 + + history-data-clear-enable: false \ No newline at end of file diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg1.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg1.png new file mode 100644 index 0000000..f2a58b7 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg1.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg2.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg2.png new file mode 100644 index 0000000..78a1a3c Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg2.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg3.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg3.png new file mode 100644 index 0000000..5d2fc68 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg3.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg4.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg4.png new file mode 100644 index 0000000..992e8ff Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg4.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg5.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg5.png new file mode 100644 index 0000000..4f91e82 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg5.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/original/bg6.png b/fightwine-admin/src/main/resources/images/jigsaw/original/bg6.png new file mode 100644 index 0000000..ae10126 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/original/bg6.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/1.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/1.png new file mode 100644 index 0000000..1905026 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/1.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/10.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/10.png new file mode 100644 index 0000000..e651cf4 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/10.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/11.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/11.png new file mode 100644 index 0000000..5a33509 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/11.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/2.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/2.png new file mode 100644 index 0000000..b1482d4 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/2.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/3.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/3.png new file mode 100644 index 0000000..cdbb0b1 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/3.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/4.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/4.png new file mode 100644 index 0000000..bc69c96 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/4.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/5.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/5.png new file mode 100644 index 0000000..0080a54 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/5.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/6.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/6.png new file mode 100644 index 0000000..b07c3b4 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/6.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/7.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/7.png new file mode 100644 index 0000000..3be019a Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/7.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/8.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/8.png new file mode 100644 index 0000000..96d3c76 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/8.png differ diff --git a/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/9.png b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/9.png new file mode 100644 index 0000000..524c940 Binary files /dev/null and b/fightwine-admin/src/main/resources/images/jigsaw/slidingBlock/9.png differ diff --git a/fightwine-admin/src/main/resources/images/pic-click/bg6.png b/fightwine-admin/src/main/resources/images/pic-click/bg6.png new file mode 100644 index 0000000..4cd9cbb Binary files /dev/null and b/fightwine-admin/src/main/resources/images/pic-click/bg6.png differ diff --git a/fightwine-admin/src/main/resources/images/pic-click/bg8.png b/fightwine-admin/src/main/resources/images/pic-click/bg8.png new file mode 100644 index 0000000..1721aea Binary files /dev/null and b/fightwine-admin/src/main/resources/images/pic-click/bg8.png differ diff --git a/fightwine-admin/src/main/resources/images/pic-click/bg9.png b/fightwine-admin/src/main/resources/images/pic-click/bg9.png new file mode 100644 index 0000000..8d5060a Binary files /dev/null and b/fightwine-admin/src/main/resources/images/pic-click/bg9.png differ diff --git a/fightwine-admin/src/main/resources/logback-spring.xml b/fightwine-admin/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..c0d28a8 --- /dev/null +++ b/fightwine-admin/src/main/resources/logback-spring.xml @@ -0,0 +1,129 @@ + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/sys-console.log + + + ${log.path}/sys-console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fightwine-admin/src/main/resources/mapper/ScheduleJobLogMapper.xml b/fightwine-admin/src/main/resources/mapper/ScheduleJobLogMapper.xml new file mode 100644 index 0000000..3f8cb99 --- /dev/null +++ b/fightwine-admin/src/main/resources/mapper/ScheduleJobLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-admin/src/main/resources/mapper/ScheduleJobMapper.xml b/fightwine-admin/src/main/resources/mapper/ScheduleJobMapper.xml new file mode 100644 index 0000000..6a74869 --- /dev/null +++ b/fightwine-admin/src/main/resources/mapper/ScheduleJobMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-common/pom.xml b/fightwine-common/pom.xml new file mode 100644 index 0000000..ce6cae4 --- /dev/null +++ b/fightwine-common/pom.xml @@ -0,0 +1,329 @@ + + + 4.0.0 + + com.yzt.fightwine + yzt-fightwine + 1.0-SNAPSHOT + + + fightwine-common + fightwine-common + + + 21 + 21 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + javax.servlet + jstl + 1.2 + + + + + com.alibaba + fastjson + + + + + com.alibaba + druid + + + + + + mysql + mysql-connector-java + + + + + org.projectlombok + lombok + + + + com.baomidou + mybatis-plus-boot-starter + + + + + org.springframework.boot + spring-boot-test + + + junit + junit + 4.12 + + + org.springframework + spring-test + + + + com.baomidou + mybatis-plus + + + + + com.baomidou + mybatis-plus-generator + + + + io.swagger + swagger-annotations + + + + + io.springfox + springfox-swagger2 + + + io.swagger + swagger-models + + + com.github.xiaoymin + swagger-bootstrap-ui + + + + + org.springframework.boot + spring-boot-autoconfigure + + + + + ch.qos.logback + logback-classic + + + + net.logstash.logback + logstash-logback-encoder + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + redis.clients + jedis + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + javax.validation + validation-api + + + org.hibernate.validator + hibernate-validator + + + + org.springframework.data + spring-data-commons + + + cn.hutool + hutool-all + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.apache.httpcomponents + httpclient + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.apache.commons + commons-lang3 + + + + + org.apache.poi + poi + + + org.apache.poi + poi-ooxml + + + + + commons-fileupload + commons-fileupload + + + + commons-io + commons-io + + + + net.coobird + thumbnailator + + + + + com.aliyun.oss + aliyun-sdk-oss + + + + + com.qcloud + cos_api + + + + com.tencentcloudapi + tencentcloud-sdk-java + + + + + com.qiniu + qiniu-java-sdk + + + + + com.amazonaws + aws-java-sdk-s3 + 1.12.99 + + + + + dom4j + dom4j + + + + com.thoughtworks.xstream + xstream + 1.4.20 + + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + + + + org.apache.httpcomponents + httpmime + 4.5.10 + + + + + com.google.zxing + core + + + com.google.zxing + javase + + + + + + io.jsonwebtoken + jjwt + + + com.auth0 + jwks-rsa + 0.9.0 + + + + + com.alipay.sdk + alipay-sdk-java + 4.15.20.ALL + + + + + org.springframework.boot + spring-boot-starter-security + 2.7.7 + + + + + com.anji-plus + spring-boot-starter-captcha + 1.3.0 + + + \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/acpect/ControllerAspect.java b/fightwine-common/src/main/java/com/yzt/common/acpect/ControllerAspect.java new file mode 100644 index 0000000..ccb78ab --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/acpect/ControllerAspect.java @@ -0,0 +1,45 @@ +package com.yzt.common.acpect; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + + +/** + * + * 所有的前端controller层的拦截业务,方法的执行时间长度, + */ +@Aspect +@Component +public class ControllerAspect { + + Logger logger = LoggerFactory.getLogger(ControllerAspect.class); + + @Pointcut("execution(* com.yzt.fightwine.system.controller.*.*(..))") + private void pointCutMethodController() { + + } + + @Around("pointCutMethodController()") + public Object doAroundService(ProceedingJoinPoint pjp) throws Throwable { + + long begin = System.nanoTime(); + + Object obj = pjp.proceed(); + + long end = System.nanoTime(); + + logger.info("Controller method:{},prams:{},cost time:{} ns,cost:{} ms", + + pjp.getSignature().toString(), Arrays.toString(pjp.getArgs()), (end - begin), (end - begin) / 1000000); + + return obj; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/annotation/CustomResponseAnnotation.java b/fightwine-common/src/main/java/com/yzt/common/annotation/CustomResponseAnnotation.java new file mode 100644 index 0000000..802a33c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/annotation/CustomResponseAnnotation.java @@ -0,0 +1,15 @@ +package com.yzt.common.annotation; + +import java.lang.annotation.*; + +/** + * 业务异常断言 + * + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) //作用于方法和类(接口)上 +@Documented +public @interface CustomResponseAnnotation { + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/annotation/StringContains.java b/fightwine-common/src/main/java/com/yzt/common/annotation/StringContains.java new file mode 100644 index 0000000..db8dd08 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/annotation/StringContains.java @@ -0,0 +1,27 @@ +package com.yzt.common.annotation; + + +import com.yzt.common.validation.StringContainsValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +/** + * 校验一个字符串是否包含在指定字符数组内 + * fw_ + */ +@Documented +@Constraint(validatedBy = StringContainsValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface StringContains { + + String message() default "字符串不符合规则"; + + String[] limitValues() default {}; + + Class[] groups() default { }; + + Class[] payload() default { }; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/config/RedisConfig.java b/fightwine-common/src/main/java/com/yzt/common/config/RedisConfig.java new file mode 100644 index 0000000..c41ae0d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/config/RedisConfig.java @@ -0,0 +1,116 @@ +package com.yzt.common.config; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.jedis.JedisClientConfiguration; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import redis.clients.jedis.JedisPoolConfig; + +import java.time.Duration; + +/** + * Redis配置组件 + * + */ +@Configuration +public class RedisConfig { + + @Value("${spring.redis.host}") + private String redisHost; + + @Value("${spring.redis.port}") + private int redisPort; + + @Value("${spring.redis.password}") + private String redisPass; + + @Value("${spring.redis.database}") + private int redisDb; + + @Value("${spring.redis.timeout}") + private String timeout; + + @Value("${spring.redis.jedis.pool.max-active}") + private int maxTotal; + + @Value("${spring.redis.jedis.pool.max-idle}") + private int maxIdle; + + @Value("${spring.redis.jedis.pool.min-idle}") + private int minIdle; + + @Value("${spring.redis.jedis.pool.max-wait}") + private int maxWaitMillis; + + @Value("${spring.redis.jedis.pool.time-between-eviction-runs}") + private String timeBetweenEvictionRunsMillis; + + @Value("${spring.redis.second.database}") + private int redisSecondDatabase; + + @Bean(name = "redisConnectionFactory") + @Primary //默认选择这个数据源进行执行 + @Qualifier("redisConnectionFactory") + public RedisConnectionFactory redisConnectionFactory() { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); + config.setPort(redisPort); + config.setHostName(redisHost); + config.setDatabase(redisDb); + config.setPassword(redisPass); + //获得默认的连接池构造 + //这里需要注意的是,RedisConnectionFactoryJ对于Standalone模式的没有(RedisStandaloneConfiguration,jedisPoolConfig)的构造函数,对此 + //我们用JedisClientConfiguration接口的builder方法实例化一个构造器,还得类型转换 + JedisClientConfiguration.DefaultJedisClientConfigurationBuilder jpConfigBuilder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration.builder(); + //修改我们的连接池配置 + jpConfigBuilder.usePooling(); + jpConfigBuilder.poolConfig(jedisPoolConfig()); + jpConfigBuilder.readTimeout(Duration.ofMillis(Integer.parseInt(timeout))); + jpConfigBuilder.connectTimeout(Duration.ofMillis(Integer.parseInt(timeout))); + //通过构造器来构造jedis客户端配置 + JedisClientConfiguration jedisClientConfiguration = jpConfigBuilder.build(); + //配置连接池属性 + return new JedisConnectionFactory(config, jedisClientConfiguration); + } + + @Bean(name = "secondRedisConnectionFactory") + @Qualifier("secondRedisConnectionFactory") + public RedisConnectionFactory secondRedisConnectionFactory() { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(); + config.setPort(redisPort); + config.setHostName(redisHost); + config.setDatabase(redisSecondDatabase); + config.setPassword(redisPass); + //获得默认的连接池构造 + //这里需要注意的是,RedisConnectionFactoryJ对于Standalone模式的没有(RedisStandaloneConfiguration,jedisPoolConfig)的构造函数,对此 + //我们用JedisClientConfiguration接口的builder方法实例化一个构造器,还得类型转换 + JedisClientConfiguration.DefaultJedisClientConfigurationBuilder jpConfigBuilder = (JedisClientConfiguration.DefaultJedisClientConfigurationBuilder) JedisClientConfiguration.builder(); + //修改我们的连接池配置 + jpConfigBuilder.usePooling(); + jpConfigBuilder.poolConfig(jedisPoolConfig()); + jpConfigBuilder.readTimeout(Duration.ofMillis(Integer.parseInt(timeout))); + jpConfigBuilder.connectTimeout(Duration.ofMillis(Integer.parseInt(timeout))); + //通过构造器来构造jedis客户端配置 + JedisClientConfiguration jedisClientConfiguration = jpConfigBuilder.build(); + //配置连接池属性 + return new JedisConnectionFactory(config, jedisClientConfiguration); + } + + @Bean + public JedisPoolConfig jedisPoolConfig() { + JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); + jedisPoolConfig.setMaxIdle(maxIdle); + jedisPoolConfig.setMaxTotal(maxTotal); + jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); + jedisPoolConfig.setMinIdle(minIdle); + jedisPoolConfig.setTimeBetweenEvictionRunsMillis(Integer.parseInt(timeBetweenEvictionRunsMillis)); + return jedisPoolConfig; + } + +} + + diff --git a/fightwine-common/src/main/java/com/yzt/common/config/YztConfig.java b/fightwine-common/src/main/java/com/yzt/common/config/YztConfig.java new file mode 100644 index 0000000..aeaf8cd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/config/YztConfig.java @@ -0,0 +1,151 @@ +package com.yzt.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * yzt 拼酒基础配置 + * + */ +@Configuration +@ConfigurationProperties(prefix = "yzt") +public class YztConfig { + // 当前代码版本 + private String version; + // 待部署域名 + private String domain; + // #请求微信接口中专服务器 + private String wechatApiUrl; + // #微信js api系列是否开启调试模式 + private boolean wechatJsApiDebug; + // #微信js api是否是beta版本 + private boolean wechatJsApiBeta; + // #是否同步config表数据到redis + private boolean asyncConfig; + // #是否同步小程序公共模板库 + private boolean asyncWeChatProgramTempList; + // 本地图片路径配置 + private String imagePath; + // 是否演示站点 所有手机号码都会掩码 + private Boolean demoSite; + // 活动边框缓存周期 + private Integer activityStyleCachedTime; + // 活动边框参加 指定商品参加上限 + private Integer selectProductLimit; + + // 不过滤任何数据的url配置 + private List ignored; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getWechatApiUrl() { + return wechatApiUrl; + } + + public void setWechatApiUrl(String wechatApiUrl) { + this.wechatApiUrl = wechatApiUrl; + } + + public boolean isWechatJsApiDebug() { + return wechatJsApiDebug; + } + + public void setWechatJsApiDebug(boolean wechatJsApiDebug) { + this.wechatJsApiDebug = wechatJsApiDebug; + } + + public boolean isWechatJsApiBeta() { + return wechatJsApiBeta; + } + + public void setWechatJsApiBeta(boolean wechatJsApiBeta) { + this.wechatJsApiBeta = wechatJsApiBeta; + } + + public boolean isAsyncConfig() { + return asyncConfig; + } + + public void setAsyncConfig(boolean asyncConfig) { + this.asyncConfig = asyncConfig; + } + + public boolean isAsyncWeChatProgramTempList() { + return asyncWeChatProgramTempList; + } + + public void setAsyncWeChatProgramTempList(boolean asyncWeChatProgramTempList) { + this.asyncWeChatProgramTempList = asyncWeChatProgramTempList; + } + + public String getImagePath() { + return imagePath; + } + + public void setImagePath(String imagePath) { + this.imagePath = imagePath; + } + + + public Boolean getDemoSite() { + return demoSite; + } + + public void setDemoSite(Boolean demoSite) { + this.demoSite = demoSite; + } + + public List getIgnored() { + return ignored; + } + + public void setIgnored(List ignored) { + this.ignored = ignored; + } + + public Integer getActivityStyleCachedTime() { + return activityStyleCachedTime; + } + + public void setActivityStyleCachedTime(Integer activityStyleCachedTime) { + this.activityStyleCachedTime = activityStyleCachedTime; + } + + public Integer getSelectProductLimit() { + return selectProductLimit; + } + + public void setSelectProductLimit(Integer selectProductLimit) { + this.selectProductLimit = selectProductLimit; + } + + @Override + public String toString() { + return "YztConfig{" + + "version='" + version + '\'' + + ", domain='" + domain + '\'' + + ", wechatApiUrl='" + wechatApiUrl + '\'' + + ", asyncConfig=" + asyncConfig + + ", imagePath='" + imagePath + '\'' + + ", activityStyleCachedTime=" + activityStyleCachedTime + + ", selectProductLimit=" + selectProductLimit + + ", ignored=" + ignored + + '}'; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/BargainConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/BargainConstants.java new file mode 100644 index 0000000..4724f83 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/BargainConstants.java @@ -0,0 +1,16 @@ +package com.yzt.common.constants; + +/** + * 砍价常量类 + * fw_ + */ +public class BargainConstants { + + /** 用户砍价状态-参与中 */ + public static final Integer BARGAIN_USER_STATUS_PARTICIPATE = 1; + /** 用户砍价状态-活动结束参与失败 */ + public static final Integer BARGAIN_USER_STATUS_FAIL = 2; + /** 用户砍价状态-活动结束参与成功 */ + public static final Integer BARGAIN_USER_STATUS_SUCCESS = 3; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/BrokerageRecordConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/BrokerageRecordConstants.java new file mode 100644 index 0000000..42bbad4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/BrokerageRecordConstants.java @@ -0,0 +1,53 @@ +package com.yzt.common.constants; + +/** + * 佣金记录常量类 + * + */ +public class BrokerageRecordConstants { + + /** 佣金记录类型—增加 */ + public static final Integer BROKERAGE_RECORD_TYPE_ADD = 1; + + /** 佣金记录类型—扣减 */ + public static final Integer BROKERAGE_RECORD_TYPE_SUB = 2; + + /** 佣金记录状态—创建 */ + public static final Integer BROKERAGE_RECORD_STATUS_CREATE = 1; + + /** 佣金记录状态—冻结期 */ + public static final Integer BROKERAGE_RECORD_STATUS_FROZEN = 2; + + /** 佣金记录状态—完成 */ + public static final Integer BROKERAGE_RECORD_STATUS_COMPLETE = 3; + + /** 佣金记录状态—失效(订单退款) */ + public static final Integer BROKERAGE_RECORD_STATUS_INVALIDATION = 4; + + /** 佣金记录状态—提现申请 */ + public static final Integer BROKERAGE_RECORD_STATUS_WITHDRAW = 5; + + /** 佣金记录关联类型—订单 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_ORDER = "order"; + + /** 佣金记录关联类型—提现 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_WITHDRAW = "withdraw"; + + /** 佣金记录关联类型—转余额 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_YUE = "yue"; + + /** 佣金记录关联类型—管理奖孵化奖 */ + public static final String BROKERAGE_RECORD_LINK_TYPE_MANAGE_INCUBATOR_REWARD = "manage_incubator_reward"; + + /** 佣金记录标题—订单获得佣金 */ + public static final String BROKERAGE_RECORD_TITLE_ORDER = "获得推广佣金"; + + /** 佣金记录标题—提现申请 */ + public static final String BROKERAGE_RECORD_TITLE_WITHDRAW_APPLY = "提现申请"; + + /** 佣金记录标题—提现拒绝 */ + public static final String BROKERAGE_RECORD_TITLE_WITHDRAW_FAIL = "提现申请拒绝"; + + /** 佣金记录标题—提现拒绝 */ + public static final String BROKERAGE_RECORD_TITLE_BROKERAGE_YUE = "佣金转余额"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/CategoryConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/CategoryConstants.java new file mode 100644 index 0000000..febeb58 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/CategoryConstants.java @@ -0,0 +1,29 @@ +package com.yzt.common.constants; + +/** + * 分类常量类 + * fw_ + */ +public class CategoryConstants { + + /** 分类状态-正常 */ + public static final Integer CATEGORY_STATUS_NORMAL = 1; + /** 分类状态-失效 */ + public static final Integer CATEGORY_STATUS_INVALID = 0; + + /** 分类类型-产品分类 */ + public static final Integer CATEGORY_TYPE_PRODUCT = 1; + /** 分类类型-附件分类 */ + public static final Integer CATEGORY_TYPE_ATTACHMENT = 2; + /** 分类类型-文章分类 */ + public static final Integer CATEGORY_TYPE_ARTICLE = 3; + /** 分类类型-设置分类 */ + public static final Integer CATEGORY_TYPE_SETTING = 4; + /** 分类类型-菜单分类 */ + public static final Integer CATEGORY_TYPE_MENU = 5; + /** 分类类型-配置分类 */ + public static final Integer CATEGORY_TYPE_CONFIG = 6; + /** 分类类型-秒杀配置 */ + public static final Integer CATEGORY_TYPE_SECKILL = 7; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/Constants.java b/fightwine-common/src/main/java/com/yzt/common/constants/Constants.java new file mode 100644 index 0000000..885158b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/Constants.java @@ -0,0 +1,602 @@ +package com.yzt.common.constants; + +/** + * 配置类 + * fw_ + */ +public class Constants { + public static final long TOKEN_EXPRESS_MINUTES = (60 * 24); //3小时 + + public static final int HTTPSTATUS_CODE_SUCCESS = 200; + + public static final int NUM_ZERO = 0; + public static final int NUM_ONE = 1; + public static final int NUM_TWO = 2; + public static final int NUM_THREE = 3; + public static final int NUM_FIVE = 5; + public static final int NUM_SEVEN = 7; + public static final int NUM_TEN = 10; + public static final int NUM_ONE_HUNDRED = 100; + //头部 token令牌key + public static final String HEADER_AUTHORIZATION_KEY = "Authori-zation"; + + //验证码redis key前缀 + public static final String VALIDATE_REDIS_KEY_PREFIX = "validate_code_"; + + + public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String DATE_FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + public static final String DATE_FORMAT_DATE = "yyyy-MM-dd"; + public static final String DATE_FORMAT_YEAR = "yyyy"; + public static final String DATE_FORMAT_MONTH_DATE = "MM-dd"; + public static final String DATE_FORMAT_MONTH = "yyyy-MM"; + public static final String DATE_TIME_FORMAT_NUM = "yyyyMMddHHmmss"; + public static final String DATE_FORMAT_NUM = "yyyyMMdd"; + public static final String DATE_FORMAT_START = "yyyy-MM-dd 00:00:00"; + public static final String DATE_FORMAT_END = "yyyy-MM-dd 23:59:59"; + public static final String DATE_FORMAT_MONTH_START = "yyyy-MM-01 00:00:00"; + public static final String DATE_FORMAT_YEAR_START = "yyyy-01-01 00:00:00"; + public static final String DATE_FORMAT_YEAR_END = "yyyy-12-31 23:59:59"; + public static final String DATE_FORMAT_HHMMSS = "HH:mm:ss"; + public static final String DATE_FORMAT_START_PEREND = "00:00:00"; + public static final String DATE_FORMAT_END_PEREND = "23:59:59"; + public static final String DATE_FORMAT_HHMM = "yyyy-MM-dd HH:mm"; + public static final String DATE_FORMAT_RFC_3339 = "yyyy-MM-dd'T'HH:mm:ssXXX"; + + //后台管理员操作资金mark + public static final String USER_BILL_OPERATE_LOG_TITLE = "{$title}{$operate}了{$value}{$founds}"; + + //用户等级升级 + public static final String USER_LEVEL_OPERATE_LOG_MARK = "尊敬的用户 【{$userName}】, 在{$date}赠送会员等级成为{$levelName}会员"; + public static final String USER_LEVEL_UP_LOG_MARK = "尊敬的用户 【{$userName}】, 在{$date}您升级为为{$levelName}会员"; + + + //用户登录密码加密混淆字符串 + public static final String USER_LOGIN_PASSWORD_MD5_KEYWORDS = "yzt"; + + //用户登token redis存储前缀 + public static final String USER_TOKEN_REDIS_KEY_PREFIX = "TOKEN_USER:"; + + + //用户登录方式 h5 + public static final String USER_LOGIN_TYPE_H5 = "h5"; + + //用户登录方式 公众号 + public static final String USER_LOGIN_TYPE_PUBLIC = "wechat"; + + //用户登录方式 小程序 + public static final String USER_LOGIN_TYPE_PROGRAM = "routine"; + + // 用户登录方式 App + public static final String USER_LOGIN_TYPE_IOS_WX = "iosWx"; + public static final String USER_LOGIN_TYPE_ANDROID_WX = "androidWx"; + + // 用户登录方式 App + public static final String USER_LOGIN_TYPE_IOS = "ios"; + + + //用户默认头像 + public static final String USER_DEFAULT_AVATAR_CONFIG_KEY = "h5_avatar"; + + //用户默认推广人id + public static final Integer USER_DEFAULT_SPREAD_ID = 0; + + //默认分页 + public static final int DEFAULT_PAGE = 1; + + //默认分页 + public static final int DEFAULT_LIMIT = 20; + + //升序排序 + public static final String SORT_ASC = "asc"; + + //降序排序 + public static final String SORT_DESC = "desc"; + + //导出最大数值 + public static final Integer EXPORT_MAX_LIMIT = 99999; + + //商品最多选择的分类数量 + public static final Integer PRODUCT_SELECT_CATEGORY_NUM_MAX = 10; + + + //上传类型 + public static final String UPLOAD_MODEL_PATH_EXCEL = "excel";// excel + + //图片上传 + public static final String UPLOAD_IMAGE_EXT_STR_CONFIG_KEY = "image_ext_str";//图片上传 + public static final String UPLOAD_IMAGE_MAX_SIZE_CONFIG_KEY = "image_max_size"; + + //文件上传 + public static final String UPLOAD_FILE_EXT_STR_CONFIG_KEY = "file_ext_str"; + //最大上传文件 + public static final String UPLOAD_FILE_MAX_SIZE_CONFIG_KEY = "file_max_size"; + + public static final int UPLOAD_TYPE_USER = 7; //用户上传 + + // 移动端文章顶部的banner图最大数量 配置数据最小3最大10 + public static final String ARTICLE_BANNER_LIMIT = "news_slides_limit"; + + //城市数据 redis key + public static final String CITY_LIST = "city_list"; + //城市数据 tree redis key + public static final String CITY_LIST_TREE = "city_list_tree"; + //城市数据 tree redis key + public static final String CITY_LIST_LEVEL_1 = "city_list_level_1"; + + //商品库存变动队列key + public static final String PRODUCT_STOCK_UPDATE = "product_stock_update"; + // 商品秒杀库存队列Key + public static final String PRODUCT_SECKILL_STOCK_UPDATE = "product_seckill_stock_update"; + // 商品砍价库存队列Key + public static final String PRODUCT_BARGAIN_STOCK_UPDATE = "product_bargain_stock_update"; + // 商品拼团库存队列Key + public static final String PRODUCT_COMBINATION_STOCK_UPDATE = "product_combination_stock_update"; + //商品库存redis key + public static final String PRODUCT_STOCK_LIST = "product_stock_list"; + + + //sku库存变动队列key +// public static final String SKU_STOCK_UPDATE = "product_stock_update"; + //sku库存redis key +// public static final String SKU_STOCK_LIST = "product_stock_list"; + + //消息模板队列key + public static final String WE_CHAT_MESSAGE_KEY_PUBLIC = "we_chat_public_message_list"; + public static final String WE_CHAT_MESSAGE_KEY_PROGRAM = "we_chat_program_message_list"; + public static final String WE_CHAT_MESSAGE_INDUSTRY_KEY = "we_chat_message_industry"; + + //config表数据redis + public static final String CONFIG_LIST = "config_list"; //配置列表 + + + //快递信息缓存 + public static final String LOGISTICS_KEY = "logistics_"; + + //config配置的key + public static final String CONFIG_KEY_SITE_URL = "site_url"; //域名 + public static final String CONFIG_KEY_API_URL = "api_url"; //admin接口地址 + public static final String CONFIG_KEY_FRONT_API_URL = "front_api_url"; //移动商城接口地址 + public static final String CONFIG_KEY_SITE_LOGO = "mobile_top_logo"; //logo地址 + public static final String CONFIG_KEY_MOBILE_LOGIN_LOGO = "mobile_login_logo"; // 移动端登录 logo + public static final String CONFIG_KEY_SITE_NAME = "site_name"; //网站名称 +// public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; //腾讯地图key + public static final String CONFIG_BANK_LIST = "user_extract_bank"; //可提现银行 + public static final String CONFIG_EXTRACT_FREEZING_TIME = "extract_time"; //提现冻结时间 + public static final String CONFIG_EXTRACT_MIN_PRICE = "user_extract_min_price"; //提现最低金额 + public static final String CONFIG_RECHARGE_ATTENTION = "recharge_attention"; //充值注意事项 + + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_ID = "pay_weixin_appid"; //公众号appId + public static final String CONFIG_KEY_PAY_WE_CHAT_MCH_ID = "pay_weixin_mchid"; //公众号配的商户号 + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_SECRET = "pay_weixin_appsecret"; //公众号秘钥 + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_KEY = "pay_weixin_key"; //公众号支付key + public static final String CONFIG_KEY_PAY_ROUTINE_APP_ID = "pay_routine_appid"; //小程序appId + public static final String CONFIG_KEY_PAY_ROUTINE_MCH_ID = "pay_routine_mchid"; //小程序分配的商户号 + public static final String CONFIG_KEY_PAY_ROUTINE_APP_SECRET = "pay_routine_appsecret"; //小程序秘钥 + public static final String CONFIG_KEY_PAY_ROUTINE_APP_KEY = "pay_routine_key"; //小程序支付key + + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_APP_ID = "pay_weixin_app_appid"; //公众号appId + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_MCH_ID = "pay_weixin_app_mchid"; //公众号配的商户号 + public static final String CONFIG_KEY_PAY_WE_CHAT_APP_APP_KEY = "pay_weixin_app_key"; //公众号支付key + + public static final String CONFIG_KEY_RECHARGE_MIN_AMOUNT = "store_user_min_recharge"; //最小充值金额 + /** 底部导航—是否自定义 */ + public static final String CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM = "bottom_navigation_is_custom"; +// public static final String CONFIG_KEY_PROGRAM_LOGO = "routine_logo"; //小程序logo +// public static final String CONFIG_KEY_PUBLIC_LOGO = "wechat_avatar"; //公众号logo + + public static final String CONFIG_KEY_LOGISTICS_APP_CODE = "system_express_app_code"; //快递查询密钥 + + //云智服 小程序插件 + public static final String CONFIG_KEY_YZF_H5_URL = "yzf_h5_url"; //云智服H5 url + // 客服电话 + public static final String CONFIG_KEY_CONSUMER_HOTLINE = "consumer_hotline"; + // 客服电话服务开关 + public static final String CONFIG_KEY_TELEPHONE_SERVICE_SWITCH = "telephone_service_switch"; + // 微信客服额外开关 + public static final String CONFIG_KEY_WX_CHAT_INDEPENDENT = "wx_chat_independent"; + //商品分类页配置 + public static final String CONFIG_CATEGORY_CONFIG = "category_page_config"; //商品分类页配置 + public static final String CONFIG_IS_SHOW_CATEGORY = "is_show_category"; //是否隐藏一级分类 + public static final String CONFIG_IS_PRODUCT_LIST_STYLE = "homePageSaleListStyle"; //首页商品列表模板配置 + // app 版本号 + public static final String CONFIG_APP_VERSION = "app_version"; + // android版本地址 + public static final String CONFIG_APP_ANDROID_ADDRESS = "android_address"; + // ios版本地址 + public static final String CONFIG_APP_IOS_ADDRESS = "ios_address"; + // 开放式升级 + public static final String CONFIG_APP_OPEN_UPGRADE = "open_upgrade"; + + + + //分销 + public static final String CONFIG_KEY_STORE_BROKERAGE_LEVEL = "store_brokerage_rate_num"; //返佣比例前缀 + public static final String CONFIG_KEY_STORE_BROKERAGE_RATE_ONE = "store_brokerage_ratio"; //一级返佣比例前缀 + public static final String CONFIG_KEY_STORE_BROKERAGE_RATE_TWO = "store_brokerage_two"; //二级返佣比例前缀 + public static final String CONFIG_KEY_STORE_BROKERAGE_USER_EXTRACT_MIN_PRICE = "user_extract_min_price"; //提现最低金额 + public static final String CONFIG_KEY_STORE_BROKERAGE_MODEL = "store_brokerage_status"; //分销模式1-指定分销2-人人分销 + public static final String CONFIG_KEY_STORE_BROKERAGE_USER_EXTRACT_BANK = "user_extract_bank"; //提现银行卡 + public static final String CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME = "extract_time"; //佣金冻结时间 + public static final String CONFIG_KEY_STORE_INTEGRAL_EXTRACT_TIME = "freeze_integral_day"; //积分冻结时间 + public static final String CONFIG_KEY_STORE_BROKERAGE_PERSON_PRICE = "store_brokerage_price"; //人人分销满足金额 + public static final String CONFIG_KEY_STORE_BROKERAGE_IS_OPEN = "brokerage_func_status"; //分销启用 + public static final String CONFIG_KEY_STORE_BROKERAGE_BIND_TYPE = "brokerageBindind"; //分销关系绑定0-所有游湖,2-新用户 + + //积分 + public static final String CONFIG_KEY_INTEGRAL_RATE = "integral_ratio"; //积分抵用比例(1积分抵多少金额 + public static final String CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE = "order_give_integral"; //下单支付金额按比例赠送积分(实际支付1元赠送多少积分 + + //分销 + public static final String CONFIG_KEY_DISTRIBUTION_TYPE = "brokerage_bindind"; + + //验证码过期时间 + public static final String CONFIG_KEY_SMS_CODE_EXPIRE = "sms_code_expire"; + + + //config配置的formId + public static final int CONFIG_FORM_ID_INDEX = 133; //首页配置 + public static final int CONFIG_FORM_ID_PUBLIC = 65; //公众号配置 + + + //第三方登录token类型 + public static final int THIRD_LOGIN_TOKEN_TYPE_PUBLIC = 1; //公众号 + public static final int THIRD_LOGIN_TOKEN_TYPE_PROGRAM = 2; //小程序 + public static final int THIRD_LOGIN_TOKEN_TYPE_UNION_ID = 3; //unionid + public static final int THIRD_ADMIN_LOGIN_TOKEN_TYPE_PUBLIC = 4; //后台登录公众号 + public static final int THIRD_LOGIN_TOKEN_TYPE_IOS_WX = 5; //ios 微信 + public static final int THIRD_LOGIN_TOKEN_TYPE_ANDROID_WX = 6; //android微信 + public static final int THIRD_LOGIN_TOKEN_TYPE_IOS = 7; //ios + + + // 商品类型 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 attrResult表用到 + public static final Integer PRODUCT_TYPE_NORMAL = 0; + public static final String PRODUCT_TYPE_NORMAL_STR = "默认"; + public static final Integer PRODUCT_TYPE_SECKILL = 1; + public static final String PRODUCT_TYPE_SECKILL_STR = "秒杀"; + public static final Integer PRODUCT_TYPE_BARGAIN = 2; + public static final String PRODUCT_TYPE_BARGAIN_STR = "砍价"; + public static final Integer PRODUCT_TYPE_PINGTUAN= 3; + public static final String PRODUCT_TYPE_PINGTUAN_STR= "拼团"; + public static final Integer PRODUCT_TYPE_COMPONENT= 4; + public static final String PRODUCT_TYPE_COMPONENT_STR= "组件"; + public static final Integer PRODUCT_TYPE_GROUP = 0; + + + + + //group gid + public static final Integer GROUP_DATA_ID_INDEX_BEST_BANNER = 37; //中部推荐banner图 + public static final Integer GROUP_DATA_ID_INDEX_BANNER = 48; //首页banner滚动图 + public static final Integer GROUP_DATA_ID_INDEX_RECOMMEND_BANNER = 52; //首页精品推荐Banner图片 + public static final Integer GROUP_DATA_ID_ORDER_STATUS_PIC = 53; //订单详情状态图 + public static final Integer GROUP_DATA_ID_USER_CENTER_MENU = 54; //个人中心菜单 + public static final Integer GROUP_DATA_ID_SIGN = 55; //签到配置 + public static final Integer GROUP_DATA_ID_HOT_SEARCH = 56; //热门搜索 + public static final Integer GROUP_DATA_ID_INDEX_HOT_BANNER = 57; //热门榜单推荐Banner图片 + public static final Integer GROUP_DATA_ID_INDEX_NEW_BANNER = 58; //首发新品推荐Banner图片 + public static final Integer GROUP_DATA_ID_INDEX_BENEFIT_BANNER = 59; //首页促销单品推荐Banner图片 + public static final Integer GROUP_DATA_ID_SPREAD_BANNER_LIST = 60; //推广海报图 + public static final Integer GROUP_DATA_ID_RECHARGE_LIST = 62; //充值金额设置 + public static final Integer GROUP_DATA_ID_USER_CENTER_BANNER = 65; //个人中心轮播图 + public static final Integer GROUP_DATA_ID_INDEX_MENU = 67; //导航模块 + public static final Integer GROUP_DATA_ID_INDEX_NEWS_BANNER = 68; //首页滚动新闻 + public static final Integer GROUP_DATA_ID_INDEX_ACTIVITY_BANNER = 69; //首页活动区域图片 + public static final Integer GROUP_DATA_ID_INDEX_EX_BANNER = 70; //首页超值爆款 + public static final Integer GROUP_DATA_ID_INDEX_KEYWORDS = 71; //热门搜索 + public static final Integer GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST = 72; //后台登录页面轮播图 + public static final Integer GROUP_DATA_ID_COMBINATION_LIST_BANNNER = 73; //拼团列表banner + public static final Integer GROUP_DATA_ID_BOTTOM_NAVIGATION = 74; //首页自定义导航 + + + + //签到 + public static final Integer SIGN_TYPE_INTEGRAL = 1; //积分 + public static final Integer SIGN_TYPE_EXPERIENCE = 2; //经验 + public static final String SIGN_TYPE_INTEGRAL_TITLE = "签到积分奖励"; //积分 + public static final String SIGN_TYPE_EXPERIENCE_TITLE = "签到经验奖励"; //经验 + + + //会员搜索日期类型 + public static final String SEARCH_DATE_DAY = "today"; //今天 + public static final String SEARCH_DATE_YESTERDAY = "yesterday"; //昨天 + public static final String SEARCH_DATE_LATELY_7 = "lately7"; //最近7天 + public static final String SEARCH_DATE_LATELY_30 = "lately30"; //最近30天 + public static final String SEARCH_DATE_WEEK = "week"; //本周 + public static final String SEARCH_DATE_PRE_WEEK = "preWeek"; //上周 + public static final String SEARCH_DATE_MONTH = "month"; //本月 + public static final String SEARCH_DATE_PRE_MONTH = "preMonth"; //上月 + public static final String SEARCH_DATE_YEAR = "year"; //年 + public static final String SEARCH_DATE_PRE_YEAR = "preYear"; //上一年 + + //分类服务类型 类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置 + public static final int CATEGORY_TYPE_PRODUCT = 1; //产品 + public static final int CATEGORY_TYPE_ATTACHMENT = 2; //附件分类 + public static final int CATEGORY_TYPE_ARTICLE = 3; //文章分类 + public static final int CATEGORY_TYPE_SET = 4; //设置分类 + public static final int CATEGORY_TYPE_MENU = 5; //菜单分类 + public static final int CATEGORY_TYPE_CONFIG = 6; //配置分类 + public static final int CATEGORY_TYPE_SKILL = 7; //秒杀配置 + + //首页Banner图片 + public static final int INDEX_RECOMMEND_BANNER = 1; //首页精品推荐Banner图片 + public static final int INDEX_HOT_BANNER = 2; //热门榜单推荐Banner图片 + public static final int INDEX_NEW_BANNER = 3; //首页首发新品推荐Banner图片 + public static final int INDEX_BENEFIT_BANNER = 4; //首页促销单品推荐Banner图片 + public static final int INDEX_LIMIT_DEFAULT = 3; //首页默认list分页条数 + public static final int INDEX_GOOD_BANNER = 5; //优选推荐 + + public static final String INDEX_BAST_LIMIT = "bastNumber"; //精品推荐个数 + public static final String INDEX_FIRST_LIMIT = "firstNumber"; //首发新品个数 + public static final String INDEX_SALES_LIMIT = "promotionNumber"; //促销单品个数 + public static final String INDEX_HOT_LIMIT = "hotNumber"; //热门推荐个数 + + + //用户资金 + public static final String USER_BILL_CATEGORY_MONEY = "now_money"; //用户余额 + public static final String USER_BILL_CATEGORY_INTEGRAL = "integral"; //积分 + public static final String USER_BILL_CATEGORY_SHARE = "share"; //分享 + public static final String USER_BILL_CATEGORY_EXPERIENCE = "experience"; //经验 + public static final String USER_BILL_CATEGORY_BROKERAGE_PRICE = "brokerage_price"; //佣金金额 + public static final String USER_BILL_CATEGORY_SIGN_NUM = "sign_num"; //签到天数 + + public static final String USER_BILL_TYPE_BROKERAGE = "brokerage"; //推广佣金 + public static final String USER_BILL_TYPE_DEDUCTION = "deduction"; //抵扣 + public static final String USER_BILL_TYPE_EXTRACT = "extract"; //提现 + public static final String USER_BILL_TYPE_TRANSFER_IN = "transferIn"; //佣金转入余额 + public static final String USER_BILL_TYPE_GAIN = "gain"; //购买商品赠送 + public static final String USER_BILL_TYPE_PAY_MONEY = "pay_money"; //购买 + public static final String USER_BILL_TYPE_PAY_PRODUCT = "pay_product"; //购买商品 + public static final String USER_BILL_TYPE_PAY_PRODUCT_INTEGRAL_BACK = "pay_product_integral_back"; //商品退积分 + public static final String USER_BILL_TYPE_PAY_PRODUCT_REFUND = "pay_product_refund"; //商品退款 + public static final String USER_BILL_TYPE_RECHARGE = "recharge"; //佣金转入 + public static final String USER_BILL_TYPE_PAY_RECHARGE = "pay_recharge"; //充值 + public static final String USER_BILL_TYPE_SHARE = "share"; //用户分享记录 + public static final String USER_BILL_TYPE_SIGN = "sign"; //签到 + public static final String USER_BILL_TYPE_ORDER = "order"; //订单 + public static final String USER_BILL_TYPE_PAY_ORDER = "pay_order"; //订单支付 + public static final String USER_BILL_TYPE_SYSTEM_ADD = "system_add"; //系统增加 + public static final String USER_BILL_TYPE_SYSTEM_SUB = "system_sub"; //系统减少 + public static final String USER_BILL_TYPE_PAY_MEMBER = "pay_member";// 会员支付 + public static final String USER_BILL_TYPE_OFFLINE_SCAN = "offline_scan";// 线下支付 + public static final String USER_BILL_TYPE_USER_RECHARGE_REFUND = "user_recharge_refund";// 用户充值退款 + + // 用户账单关联类型 linkType + public static final String USER_BILL_LINK_TYPE_PERSONAL_RECHARGE = "personal_recharge"; // 1-个人充值 + public static final String USER_BILL_LINK_TYPE_TRANSFER_IN = "transfer_in"; // 2-他人转账 + public static final String USER_BILL_LINK_TYPE_QUEUE_REWARD = "queue_reward"; // 3-免单奖励 + public static final String USER_BILL_LINK_TYPE_SALE_REWARD = "sale_reward"; // 4-销售奖励 + public static final String USER_BILL_LINK_TYPE_INCUBATOR_REWARD = "incubator_reward"; // 5-孵化奖励 + public static final String USER_BILL_LINK_TYPE_MANAGE_REWARD = "manage_reward"; // 6-管理奖励 + public static final String USER_BILL_LINK_TYPE_SUBSIDY_REWARD = "subsidy_reward"; // 7-补贴奖励 + public static final String USER_BILL_LINK_TYPE_ORDER_REFUND = "order_refund"; // 8-订单退款 + public static final String USER_BILL_LINK_TYPE_EXTRACT_FAIL = "extract_fail"; // 9-提现不通过,退回 + public static final String USER_BILL_LINK_TYPE_SYSTEM_ADD = "system_add"; // 10-后台增加 + public static final String USER_BILL_LINK_TYPE_ORDER_PAY = "order_pay"; // 11-下单支付 + public static final String USER_BILL_LINK_TYPE_TRANSFER_OUT = "transfer_out"; // 12-个人转账 + public static final String USER_BILL_LINK_TYPE_EXTRACT = "extract"; // 13-个人提现 + public static final String USER_BILL_LINK_TYPE_SYSTEM_SUB = "system_sub"; // 14-后台划扣 + + //订单状态 + public static final String ORDER_STATUS_ALL = "all"; //所有 + public static final String ORDER_STATUS_UNPAID = "unPaid"; //未支付 + public static final String ORDER_STATUS_NOT_SHIPPED = "notShipped"; //未发货 + public static final String ORDER_STATUS_SPIKE = "spike"; //待收货 + public static final String ORDER_STATUS_BARGAIN = "bargain"; //已收货待评价 + public static final String ORDER_STATUS_COMPLETE = "complete"; //交易完成 + public static final String ORDER_STATUS_TOBE_WRITTEN_OFF = "toBeWrittenOff"; //待核销 + public static final String ORDER_STATUS_APPLY_REFUNDING = "applyRefund"; //申请退款 + public static final String ORDER_STATUS_REFUNDING = "refunding"; //退款中 + public static final String ORDER_STATUS_REFUNDED = "refunded"; //已退款 + public static final String ORDER_STATUS_DELETED = "deleted"; //已删除 + + public static final String ORDER_STATUS_STR_UNPAID = "未支付"; //未支付 + public static final String ORDER_STATUS_STR_NOT_SHIPPED = "未发货"; //未发货 + public static final String ORDER_STATUS_STR_SPIKE = "待收货"; //待收货 + public static final String ORDER_STATUS_STR_BARGAIN = "待评价"; //已收货待评价 + public static final String ORDER_STATUS_STR_TAKE = "用户已收货"; //用户已收货 + public static final String ORDER_STATUS_STR_COMPLETE = "交易完成"; //交易完成 + public static final String ORDER_STATUS_STR_TOBE_WRITTEN_OFF = "待核销"; //待核销 + public static final String ORDER_STATUS_STR_APPLY_REFUNDING = "申请退款"; //申请退款 + public static final String ORDER_STATUS_STR_REFUNDING = "退款中"; //退款中 + public static final String ORDER_STATUS_STR_REFUNDED = "已退款"; //已退款 + public static final String ORDER_STATUS_STR_DELETED = "已删除"; //已删除 + + // H5 端订单状态 + public static final int ORDER_STATUS_H5_UNPAID = 0; // 未支付 + public static final int ORDER_STATUS_H5_NOT_SHIPPED = 1; // 待发货 + public static final int ORDER_STATUS_H5_SPIKE = 2; // 待收货 + public static final int ORDER_STATUS_H5_JUDGE = 3; // 待评价 + public static final int ORDER_STATUS_H5_COMPLETE = 4; // 已完成 + public static final int ORDER_STATUS_H5_VERIFICATION = 5; // 待核销 + public static final int ORDER_STATUS_H5_REFUNDING = -1; // 退款中 + public static final int ORDER_STATUS_H5_REFUNDED = -2; // 已退款 + public static final int ORDER_STATUS_H5_REFUND = -3; // 退款 + + public static final int ORDER_STATUS_INT_PAID = 0; //已支付 + public static final int ORDER_STATUS_INT_SPIKE = 1; //待收货 + public static final int ORDER_STATUS_INT_BARGAIN = 2; //已收货,待评价 + public static final int ORDER_STATUS_INT_COMPLETE = 3; //已完成 + + + //订单操作redis队列 + public static final String ORDER_TASK_REDIS_KEY_AFTER_DELETE_BY_USER = "alterOrderDeleteByUser"; // 用户删除订单后续操作 + public static final String ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER = "alterOrderCompleteByUser"; // 用户完成订单后续操作 + public static final String ORDER_TASK_REDIS_KEY_AFTER_CANCEL_BY_USER = "alterOrderCancelByUser"; // 用户取消订单后续操作 + public static final String ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER = "alterOrderRefundByUser"; // 用户订单退款后续操作 + + public static final String ORDER_STATUS_CACHE_CREATE_ORDER = "cache_key_create_order"; + + //支付方式 + public static final String PAY_TYPE_WE_CHAT = "weixin"; //微信支付 + public static final String PAY_TYPE_YUE = "yue"; //余额支付 + public static final String PAY_TYPE_OFFLINE = "offline"; //线下支付 + public static final String PAY_TYPE_ALI_PAY = "alipay"; //支付宝 + + //支付客户端类型 + public static final String PAY_TYPE_WE_CHAT_FROM_H5 = "weixinh5"; //H5唤起微信支付 + public static final String PAY_TYPE_WE_CHAT_FROM_PUBLIC = "public"; //公众号 + public static final String PAY_TYPE_WE_CHAT_FROM_PROGRAM = "routine"; //小程序 + + //后台微信登录类型 + public static final String ADMIN_LOGIN_TYPE_WE_CHAT_FROM_PUBLIC = "admin_public"; //公众号 + + + + //支付方式 + public static final String PAY_TYPE_STR_WE_CHAT = "微信支付"; //微信支付 + public static final String PAY_TYPE_STR_YUE = "余额支付"; //余额支付 + public static final String PAY_TYPE_STR_OFFLINE = "线下支付"; //线下支付 + public static final String PAY_TYPE_STR_ALI_PAY = "支付宝支付"; //支付宝 + public static final String PAY_TYPE_STR_OTHER = "其他支付"; //其他支付 + + //需要支付的业务类型 + public static final String SERVICE_PAY_TYPE_ORDER = "order"; //订单 + public static final String SERVICE_PAY_TYPE_RECHARGE = "recharge"; //充值 + + + + //订单操作类型 + public static final String ORDER_STATUS_STR_SPIKE_KEY = "send"; //待收货 KEY + public static final String ORDER_LOG_REFUND_PRICE = "refund_price"; //退款 + public static final String ORDER_LOG_EXPRESS = "express"; //快递 + public static final String ORDER_LOG_SHIPMENT = "shipment"; //一号通商家发货 + public static final String ORDER_LOG_DELIVERY = "delivery"; //送货 + public static final String ORDER_LOG_DELIVERY_GOODS = "delivery_goods"; //送货 + public static final String ORDER_LOG_REFUND_REFUSE = "refund_refuse"; //不退款 + public static final String ORDER_LOG_REFUND_APPLY = "apply_refund"; // + public static final String ORDER_LOG_PAY_SUCCESS = "pay_success"; //支付成功 + public static final String ORDER_LOG_DELIVERY_VI = "delivery_fictitious"; //虚拟发货 + public static final String ORDER_LOG_EDIT = "order_edit"; //编辑订单 + public static final String ORDER_LOG_PAY_OFFLINE = "offline"; //线下付款订单 + + + // 订单缓存 + public static final long ORDER_CASH_CONFIRM = (60); + public static final String ORDER_CACHE_PER = "ORDER_CACHE:"; // redis缓存订单前缀 + + //订单操作类型 -> 消息 + public static final String ORDER_LOG_MESSAGE_REFUND_PRICE = "退款给用户{amount}元"; //退款 + public static final String ORDER_LOG_MESSAGE_EXPRESS = "已发货 快递公司:{deliveryName}, 快递单号:{deliveryCode}"; //快递 + public static final String ORDER_LOG_MESSAGE_DELIVERY = "已配送 发货人:{deliveryName}, 发货人电话:{deliveryCode}"; //送货 + public static final String ORDER_LOG_MESSAGE_DELIVERY_FICTITIOUS = "已虚拟发货"; //已虚拟发货 + public static final String ORDER_LOG_MESSAGE_REFUND_REFUSE = "不退款款因:{reason}"; //不退款款因 + public static final String ORDER_LOG_MESSAGE_PAY_SUCCESS = "用户付款成功"; //用户付款成功 + + public static final String ORDER_NO_PREFIX_WE_CHAT = "wx"; //微信平台下单订单号前缀 + public static final String ORDER_NO_PREFIX_H5 = "h5"; //微信平台下单订单号前缀 + + //支付渠道 订单表 + public static final int ORDER_PAY_CHANNEL_PUBLIC = 0; //公众号 + public static final int ORDER_PAY_CHANNEL_PROGRAM = 1; //小程序 + public static final int ORDER_PAY_CHANNEL_H5 = 2; //H5 + public static final int ORDER_PAY_CHANNEL_YUE = 3; //余额 + public static final int ORDER_PAY_CHANNEL_APP_IOS = 4; //app-ios + public static final int ORDER_PAY_CHANNEL_APP_ANDROID = 5; //app-android + + //微信消息模板 tempKey + public static final String WE_CHAT_TEMP_KEY_FIRST = "first"; + public static final String WE_CHAT_TEMP_KEY_END = "remark"; + // 公众号模板消息 + public static final String WE_CHAT_TEMP_KEY_COMBINATION_SUCCESS = "OPENTM407456411";// 拼团成功 + public static final String WE_CHAT_TEMP_KEY_BARGAIN_SUCCESS = "OPENTM410292733";// 砍价成功 + public static final String WE_CHAT_TEMP_KEY_EXPRESS = "OPENTM200565259";// 订单发货提醒 + public static final String WE_CHAT_TEMP_KEY_DELIVERY = "OPENTM207707249";// 订单配送通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_PAY = "OPENTM207791277";// 订单支付成功通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_RECEIVING = "OPENTM413386489";// 订单收货通知 + public static final String WE_CHAT_TEMP_KEY_ORDER_REFUND = "OPENTM207791277";// 退款进度通知 + public static final String WE_CHAT_PUBLIC_TEMP_KEY_RECHARGE = "OPENTM200565260";// 充值成功 + + // 小程序服务通知 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_COMBINATION_SUCCESS = "5164";// 拼团成功 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_BARGAIN_SUCCESS = "2920";// 砍价成功 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_EXPRESS = "467";// 订单发货提醒 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_DELIVERY = "14198";// 订单配送通知 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_ORDER_PAY = "516";// 订单支付成功通知 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_ORDER_RECEIVING = "9283";// 订单收货通知 + public static final String WE_CHAT_PROGRAM_TEMP_KEY_RECHARGE = "OPENTM200565260"; + + + + //CND URL测试用 + public static String CND_URL = "https://wuht-1300909283.cos.ap-chengdu.myqcloud.com"; + + //物流 https://market.aliyun.com/products/56928004/cmapi021863.html#sku=yuncode15863000015 + public static String LOGISTICS_API_URL = "https://wuliu.market.alicloudapi.com/kdi"; + + // 订单 基本 操作字样 + public static String RESULT_ORDER_NOTFOUND = "订单号 ${orderCode} 未找到"; + public static String RESULT_ORDER_NOTFOUND_IN_ID = "订单id ${orderId} 未找到"; + public static String RESULT_ORDER_PAYED = "订单号 ${orderCode} 已支付"; + public static String RESULT_ORDER_EDIT_PRICE_SAME = "修改价格不能和支付价格相同 原价 ${oldPrice} 修改价 ${editPrice}"; + public static String RESULT_ORDER_EDIT_PRICE_SUCCESS = "订单号 ${orderNo} 修改价格 ${price} 成功"; + public static String RESULT_ORDER_EDIT_PRICE_LOGS = "订单价格 ${orderPrice} 修改实际支付金额为 ${price} 元"; + + // 订单 支付 操作字样 + public static String RESULT_ORDER_PAY_OFFLINE = "订单号 ${orderNo} 现在付款 ${price} 成功"; + + // 订单核销 返回字样 Order response text info + public static String RESULT_VERIFICATION_ORDER_NOT_FUND = "核销码 ${vCode} 的订单未找到"; + public static String RESULT_VERIFICATION_ORDER_VED = "核销码 ${vCode} 的订单已核销"; + public static String RESULT_VERIFICATION_NOTAUTH = "没有核销权限"; + public static String RESULT_VERIFICATION_USER_EXIST = "当前用户已经是核销员"; + + + // QRcode Response text info + public static String RESULT_QRCODE_PRAMERROR = "生成二维码参数不合法"; + + // 砍价计算比例下行 + public static String BARGAIN_TATIO_DOWN = "0.2"; + // 砍价计算比例上行 + public static String BARGAIN_TATIO_UP = "0.8"; + + // 时间类型开始时间 + public static String DATE_TIME_TYPE_BEGIN = "begin"; + + // 时间类型结束时间 + public static String DATE_TIME_TYPE_END = "end"; + + // 商品评论类型——普通商品 + public static String STORE_REPLY_TYPE_PRODUCT = "product"; + // 商品评论类型——秒杀 + public static String STORE_REPLY_TYPE_SECKILL = "seckill"; + // 商品评论类型——拼团 + public static String STORE_REPLY_TYPE_PINTUAN = "pintuan"; + // 商品评论类型——砍价 + public static String STORE_REPLY_TYPE_BARGAIN = "bargain"; + + // 商品记录Key(pv、uv)用 + public static String PRODUCT_LOG_KEY = "visit_log_key"; + + public static final String FAIL = "FAIL"; + public static final String SUCCESS = "SUCCESS"; + + // 订单取消Key + public static final String ORDER_AUTO_CANCEL_KEY = "order_auto_cancel_key"; + + /** 公共开关:0关闭 */ + public static final String COMMON_SWITCH_CLOSE = "0"; + /** 公共开关:1开启 */ + public static final String COMMON_SWITCH_OPEN = "1"; + + /** 自定义表单开关:关闭 */ + public static final String CONFIG_FORM_SWITCH_CLOSE = "'0'"; + /** 自定义表单开关:开启 */ + public static final String CONFIG_FORM_SWITCH_OPEN = "'1'"; + + /** 公共JS配置 */ + // YZT chat 统计 + public static final String JS_CONFIG_YZT_CHAT_TONGJI = "yzt_tongji_js"; + + /** 小程序源码包文件名 */ + public static final String WECHAT_SOURCE_CODE_FILE_NAME = "/mp-weixin-target.zip"; + + /** 小程序手机号授权验证类型 */ + public static final String WECHAT_ROUTINE_PHONE_VERIFICATION = "routine_phone_verification"; + + /** 公众号登录方式 */ + public static final String WECHAT_PUBLIC_LOGIN_TYPE = "wechat_public_login_type"; + + /** 管理后台账号登录错误数量keu **/ + public static final String ADMIN_ACCOUNT_LOGIN_ERROR_NUM_KEY = "admin:account:login:error:{}"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/CopyrightConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/CopyrightConstants.java new file mode 100644 index 0000000..276026f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/CopyrightConstants.java @@ -0,0 +1,18 @@ +package com.yzt.common.constants; + +/** + * 版权常量 + */ + +public class CopyrightConstants { + + + // 备案号 + public static final String COPYRIGHT_ICP_NUMBER = "copyright_icp_number"; + // 备案号连接 + public static final String COPYRIGHT_ICP_NUMBER_URL = "copyright_icp_number_url"; + // 网安备案 + public static final String COPYRIGHT_INTERNET_RECORD = "copyright_internet_record"; + // 网安备案连接 + public static final String COPYRIGHT_INTERNET_RECORD_URL = "copyright_internet_record_url"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/CouponConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/CouponConstants.java new file mode 100644 index 0000000..2e6f683 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/CouponConstants.java @@ -0,0 +1,63 @@ +package com.yzt.common.constants; + +/** + * 优惠券常量类 + * + */ +public class CouponConstants { + + /** + * --------------------------------------- + * --------优惠券常量---------------------- + * --------------------------------------- + */ + + /** 优惠券类型—手动领取 */ + public static final Integer COUPON_TYPE_RECEIVE = 1; + + /** 优惠券类型—新人券 */ + public static final Integer COUPON_TYPE_NEW_PEOPLE = 2; + + /** 优惠券类型—赠送券 */ + public static final Integer COUPON_TYPE_GIVE_AWAY = 3; + + /** 优惠券使用类型-通用 */ + public static final Integer COUPON_USE_TYPE_COMMON = 1; + + /** 优惠券使用类型-商品 */ + public static final Integer COUPON_USE_TYPE_PRODUCT = 2; + + /** 优惠券使用类型-品类 */ + public static final Integer COUPON_USE_TYPE_CATEGORY = 3; + + + /** + * --------------------------------------- + * --------用户优惠券常量------------------- + * --------------------------------------- + */ + + /** 用户优惠券领取类型—用户注册 */ + public static final String STORE_COUPON_USER_TYPE_REGISTER = "new"; + + /** 用户优惠券领取类型—用户领取 */ + public static final String STORE_COUPON_USER_TYPE_GET = "receive"; + + /** 用户优惠券领取类型—后台发放 */ + public static final String STORE_COUPON_USER_TYPE_SEND = "send"; + + /** 用户优惠券领取类型—买赠送 */ + public static final String STORE_COUPON_USER_TYPE_BUY = "buy"; + + /** 用户优惠券状态—未使用 */ + public static final Integer STORE_COUPON_USER_STATUS_USABLE = 0; + + /** 用户优惠券状态—已使用 */ + public static final Integer STORE_COUPON_USER_STATUS_USED = 1; + + /** 用户优惠券状态—已失效 */ + public static final Integer STORE_COUPON_USER_STATUS_LAPSED = 2; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/DateConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/DateConstants.java new file mode 100644 index 0000000..9e78e59 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/DateConstants.java @@ -0,0 +1,78 @@ +package com.yzt.common.constants; + +/** + * Config配置常量类 + * fw_ + */ +public class DateConstants { + + /** 日期格式:年-月-日 时:分:秒 */ + public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static final String DATE_FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; + + /** 日期格式:年-月-日 */ + public static final String DATE_FORMAT_DATE = "yyyy-MM-dd"; + /** 日期格式:年 */ + public static final String DATE_FORMAT_YEAR = "yyyy"; + /** 日期格式:月日- */ + public static final String DATE_FORMAT_MONTH_DATE = "MM-dd"; + /** 日期格式:年-月 */ + public static final String DATE_FORMAT_MONTH = "yyyy-MM"; + /** 日期格式:年月日时分秒 */ + public static final String DATE_TIME_FORMAT_NUM = "yyyyMMddHHmmss"; + /** 日期格式:年月日 */ + public static final String DATE_FORMAT_NUM = "yyyyMMdd"; + /** 日期格式:年月日 开始时间 */ + public static final String DATE_FORMAT_START = "yyyy-MM-dd 00:00:00"; + /** 日期格式:年月日 结束时间 */ + public static final String DATE_FORMAT_END = "yyyy-MM-dd 23:59:59"; + /** 日期格式:每个月的开始时间 */ + public static final String DATE_FORMAT_MONTH_START = "yyyy-MM-01 00:00:00"; + /** 日期格式:每年的开始时间 */ + public static final String DATE_FORMAT_YEAR_START = "yyyy-01-01 00:00:00"; + /** 日期格式:每年的结束时间 */ + public static final String DATE_FORMAT_YEAR_END = "yyyy-12-31 23:59:59"; + /** 日期格式:时:分:秒 */ + public static final String DATE_FORMAT_HHMMSS = "HH:mm:ss"; + /** 每天开始时间 */ + public static final String DATE_FORMAT_START_PEREND = "00:00:00"; + /** 每日结束时间 */ + public static final String DATE_FORMAT_END_PEREND = "23:59:59"; + /** 日期格式:年-月-日 时:分 */ + public static final String DATE_FORMAT_HHMM = "yyyy-MM-dd HH:mm"; + /** 日期格式:时分 */ + public static final String DATE_FORMAT_TIME_HHMM = "HHmm"; + /** 日期格式:rfc3339标准格式 2015-05-20T13:29:35.120+08:00 */ + public static final String DATE_FORMAT_RFC_3339 = "yyyy-MM-dd'T'HH:mm:ssXXX"; + + /** 搜索日期-今天 */ + public static final String SEARCH_DATE_DAY = "today"; + /** 搜索日期-昨天 */ + public static final String SEARCH_DATE_YESTERDAY = "yesterday"; + /** 搜索日期-最近7天 */ + public static final String SEARCH_DATE_LATELY_7 = "lately7"; + /** 搜索日期-最近30天 */ + public static final String SEARCH_DATE_LATELY_30 = "lately30"; + /** 搜索日期-本周 */ + public static final String SEARCH_DATE_WEEK = "week"; + /** 搜索日期-上周 */ + public static final String SEARCH_DATE_PRE_WEEK = "preWeek"; + /** 搜索日期-本月 */ + public static final String SEARCH_DATE_MONTH = "month"; + /** 搜索日期-上月 */ + public static final String SEARCH_DATE_PRE_MONTH = "preMonth"; + /** 搜索日期-年 */ + public static final String SEARCH_DATE_YEAR = "year"; + /** 搜索日期-上一年 */ + public static final String SEARCH_DATE_PRE_YEAR = "preYear"; + /** 搜索日期-最近90天 */ + public static final String SEARCH_DATE_LATELY_90 = "lately90"; + /** 搜索日期-最近180天 */ + public static final String SEARCH_DATE_LATELY_180 = "lately180"; + + // 时间类型开始时间 + public static String DATE_TIME_TYPE_BEGIN = "begin"; + // 时间类型结束时间 + public static String DATE_TIME_TYPE_END = "end"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/ExperienceRecordConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/ExperienceRecordConstants.java new file mode 100644 index 0000000..818adb5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/ExperienceRecordConstants.java @@ -0,0 +1,38 @@ +package com.yzt.common.constants; + +/** + * 经验记录常量类 + * + */ +public class ExperienceRecordConstants { + + /** 经验记录类型—增加 */ + public static final Integer EXPERIENCE_RECORD_TYPE_ADD = 1; + + /** 经验记录类型—扣减 */ + public static final Integer EXPERIENCE_RECORD_TYPE_SUB = 2; + + /** 经验记录状态—创建 */ + public static final Integer EXPERIENCE_RECORD_STATUS_CREATE = 1; + + /** 经验记录关联类型—订单 */ + public static final String EXPERIENCE_RECORD_LINK_TYPE_ORDER = "order"; + + /** 经验记录关联类型—签到 */ + public static final String EXPERIENCE_RECORD_LINK_TYPE_SIGN = "sign"; + + /** 经验记录关联类型—系统后台 */ + public static final String EXPERIENCE_RECORD_LINK_TYPE_SYSTEM = "system"; + + /** 经验记录标题—用户订单付款成功 */ + public static final String EXPERIENCE_RECORD_TITLE_ORDER = "用户订单付款成功"; + + /** 经验记录标题—签到经验奖励 */ + public static final String EXPERIENCE_RECORD_TITLE_SIGN = "签到经验奖励"; + + /** 经验记录标题—用户退款 */ + public static final String EXPERIENCE_RECORD_TITLE_REFUND = "用户退款"; + + /** 经验记录标题—PC管理员操作 */ + public static final String EXPERIENCE_RECORD_TITLE_ADMIN = "管理员操作"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/IntegralRecordConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/IntegralRecordConstants.java new file mode 100644 index 0000000..14ab208 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/IntegralRecordConstants.java @@ -0,0 +1,74 @@ +package com.yzt.common.constants; + +/** + * 积分记录常量类 + * + */ +public class IntegralRecordConstants { + + /** 佣金记录类型—增加 */ + public static final Integer INTEGRAL_RECORD_TYPE_ADD = 1; + + /** 佣金记录类型—扣减 */ + public static final Integer INTEGRAL_RECORD_TYPE_SUB = 2; + + /** 佣金记录状态—创建 */ + public static final Integer INTEGRAL_RECORD_STATUS_CREATE = 1; + + /** 佣金记录状态—冻结期 */ + public static final Integer INTEGRAL_RECORD_STATUS_FROZEN = 2; + + /** 佣金记录状态—完成 */ + public static final Integer INTEGRAL_RECORD_STATUS_COMPLETE = 3; + + /** 佣金记录状态—失效(订单退款) */ + public static final Integer INTEGRAL_RECORD_STATUS_INVALIDATION = 4; + + /** 佣金记录关联类型—订单 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_ORDER = "order"; + + /** 佣金记录关联类型—签到 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_SIGN = "sign"; + + /** 佣金记录关联类型—系统后台 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_SYSTEM = "system"; + + /** 积分记录关联类型—转出 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_TRANSFER_OUT = "transfer_out"; + + /** 积分记录关联类型—转入 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_TRANSFER_IN = "transfer_in"; + + /** 佣金记录关联类型—提现 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_EXTRACT = "extract"; + + /** 佣金记录关联类型—佣金释放转积分 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_BROKERAGE_RELEASE = "brokerage_release"; + + /** 积分记录关联类型—活动商品积分抵扣 */ + public static final String INTEGRAL_RECORD_LINK_TYPE_ACTIVITY_DEDUCTION = "activity_deduction"; + + /** 积分记录标题—佣金释放转积分 */ + public static final String INTEGRAL_RECORD_TITLE_BROKERAGE_RELEASE = "佣金释放转积分"; + + /** 佣金记录标题—用户订单付款成功 */ + public static final String BROKERAGE_RECORD_TITLE_ORDER = "用户订单付款成功"; + + /** 佣金记录标题—签到经验奖励 */ + public static final String BROKERAGE_RECORD_TITLE_SIGN = "签到积分奖励"; + + /** 佣金记录标题—后台积分操作 */ + public static final String BROKERAGE_RECORD_TITLE_SYSTEM = "后台积分操作"; + + /** 积分记录标题—积分转出 */ + public static final String INTEGRAL_RECORD_TITLE_TRANSFER_OUT = "积分转出"; + + /** 积分记录标题—积分转入 */ + public static final String INTEGRAL_RECORD_TITLE_TRANSFER_IN = "积分转入"; + + /** 积分记录标题—提现 */ + public static final String INTEGRAL_RECORD_TITLE_EXTRACT = "积分提现"; + + /** 佣金记录标题—订单退款 */ + public static final String BROKERAGE_RECORD_TITLE_REFUND = "订单退款"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/InvoiceConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/InvoiceConstants.java new file mode 100644 index 0000000..03551eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/InvoiceConstants.java @@ -0,0 +1,25 @@ +package com.yzt.common.constants; + +/** + * 发票相关常量 + */ +public class InvoiceConstants { + + /** 发票抬头类型 - 个人 */ + public static final Integer INVOICE_TYPE_PERSONAL = 1; + + /** 发票抬头类型 - 单位 */ + public static final Integer INVOICE_TYPE_COMPANY = 2; + + /** 开票状态 - 待开票 */ + public static final Integer INVOICE_STATUS_PENDING = 0; + + /** 开票状态 - 已开票 */ + public static final Integer INVOICE_STATUS_ISSUED = 1; + + /** 开票状态 - 开票失败 */ + public static final Integer INVOICE_STATUS_FAILED = 2; + + /** 发票内容 - 默认 */ + public static final String INVOICE_CONTENT_DEFAULT = "商品明细"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/NotifyConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/NotifyConstants.java new file mode 100644 index 0000000..95f01ca --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/NotifyConstants.java @@ -0,0 +1,34 @@ +package com.yzt.common.constants; + +/** + * 通知常量类 + * + */ +public class NotifyConstants { + + /** 支付成功标记*/ + public static final String PAY_SUCCESS_MARK = "paySuccess"; + /** 发货标记 */ + public static final String DELIVER_GOODS_MARK = "deliverGoods"; + /** 收货标记 */ + public static final String RECEIPT_GOODS_MARK = "receiptGoods"; + /** 改价标记 */ + public static final String MODIFY_ORDER_PRICE_MARK = "modifyOrderPrice"; + /** 拼团成功标记 */ + public static final String GROUP_SUCCESS_MARK = "groupSuccess"; + /** 砍价成功标记 */ + public static final String BARGAINING_SUCCESS_MARK = "bargainingSuccess"; + /** 订单配送标记 */ + public static final String FULFILLMENT_ORDER_MARK = "fulfillmentOrder"; + /** 充值成功标记 */ + public static final String RECHARGE_SUCCESS_MARK = "rechargeSuccess"; + + /** 支付成功(管理员短信)标记 */ + public static final String PAY_SUCCESS_ADMIN_MARK = "adminPaySuccess"; + /** 收货(管理员)标记 */ + public static final String RECEIPT_GOODS_ADMIN_MARK = "adminReceiptGoods"; + /** 用户下单(管理员)标记 */ + public static final String PLACE_AN_ORDER_ADMIN_MARK = "adminPlaceAnOrder"; + /** 用户发起退款(管理员)标记 */ + public static final String APPLY_ORDER_REFUND_ADMIN_MARK = "adminApplyOrderRefund"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/OnePassConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/OnePassConstants.java new file mode 100644 index 0000000..6d66d14 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/OnePassConstants.java @@ -0,0 +1,125 @@ +package com.yzt.common.constants; + +/** + * 一号通常量类 + * 202308 添加最新一号通 https://api.yzt.com/docs/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/ + * 一号通更新逻辑 + * 1. 用户登录嵌入的一号通页面后创建或者查看应用配置信息 + * 2. 将配置信息保存到本地 + * 3. 调用login接口,获取的token在调用的业务api中使用即可,产生的记录等都会在嵌入的页面中查看 + * 4. 商家寄件功能,在订单表创建三个字段用来存储商家寄件的数据,用来区分当前订单是否商家寄件的订单(此字段前端不用展示),测试时记得在一号通的记录中取消下,要不会有快递小哥哥上门找你的哦! + * + */ +public class OnePassConstants { + + // 一号通token + public static final String ONE_PASS_TOKEN_KEY_PREFIX = "one_pass_token_{}"; + + // 接口异常错误码 + public static final Integer ONE_PASS_ERROR_CODE = 400; + + // 用户token前缀 + public static final String ONE_PASS_USER_TOKEN_PREFIX = "Bearer-"; + + // 一号通请求地址 + public static final String ONE_PASS_API_URL = "https://sms.yzt.net/api/";// 正式环境 +// public static final String ONE_PASS_API_URL = "http://test.yzt.net/api/";// 测试环境 + + // 验证码地址 + public static final String REGISTER_CAPTCHA_URI = "v2/user/code"; + + // 账号注册地址 + public static final String USER_REGISTER_URI = "user/register"; + + // 用户登录地址 + public static final String USER_LOGIN_URI = "v2/user/login"; + + // 获取账号信息 + public static final String USER_INFO_URI = "v2/user/info"; + + // 修改用户密码 + public static final String USER_UPDATE_PASSWORD_URI = "user/modify"; + + // 修改用户手机 + public static final String USER_UPDATE_PHONE_URI = "user/modify/phone"; + + // 套餐列表 + public static final String ONE_PASS_MEAL_LIST_URI = "meal/list"; + + // 支付二维码 + public static final String ONE_PASS_MEAL_CODE_URI = "meal/code"; + + // 开通短信服务 + public static final String ONE_PASS_SMS_OPEN_URI = "v2/sms_v2/open"; + + // 开通物流服务 + public static final String ONE_PASS_EXPRESS_OPEN_URI = "v2/expr/open"; + + // 开通产品复制服务 + public static final String ONE_PASS_COPY_OPEN_URI = "v2/copy/open"; + + // 用量记录 + public static final String ONE_PASS_USER_RECORD_URI = "v2/user/record"; + + // 修改签名 + public static final String ONE_PASS_SMS_MODIFY_URI = "v2/sms_v2/modify"; + + // 短信模板列表 + public static final String ONE_PASS_TEMP_LIST_URI = "v2/sms_v2/temps"; + + // 申请模板 + public static final String ONE_PASS_TEMP_APPLY_URI = "v2/sms_v2/apply"; + + // 申请模板记录 + public static final String ONE_PASS_APPLYS_LIST_URI = "v2/sms_v2/applys"; + + // 发送短信 + public static final String ONE_PASS_API_SEND_URI = "v2/sms_v2/send"; + + // 快递公司 + public static final String ONE_PASS_API_EXPRESS_URI = "v2/expr/express"; + + // 快递公司面单模板 + public static final String ONE_PASS_API_EXPRESS_TEMP_URI = "v2/expr_dump/temp"; + + // 电子面单模版获取 + public static final String ONE_PASS_API_EXPRESS_DUMP_RECORD_URI = "v2/expr_dump/record"; + + // 复制商品 + public static final String ONE_PASS_API_COPY_GOODS_URI = "v2/copy/goods"; + + // 电子面单 + public static final String ONE_PASS_API_EXPRESS_DUMP_URI = "v2/expr/dump"; + + // 物流追踪 + public static final String ONE_PASS_API_EXPRESS_QUEARY_URI = "v2/expr/query"; + + + /** 商家寄件 START 文档链接 https://api.yzt.com/docs/%E5%95%86%E5%AE%B6%E5%AF%84%E4%BB%B6/API/%E5%88%9B%E5%BB%BA%E5%95%86%E5%AE%B6%E5%AF%84%E4%BB%B6%E8%AE%A2%E5%8D%95.html */ + public static final String ONE_PASS_API_SHIPMENT_CREATE_ORDER_URI = "v2/shipment/create_order"; + public static final String ONE_PASS_API_SHIPMENT_CANCEL_ORDER_URI = "v2/shipment/cancel_order"; + public static final String ONE_PASS_API_SHIPMENT_INDEX_URI = "v2/shipment/index"; + public static final String ONE_PASS_API_SHIPMENT_GET_KUAIDI_COMS_URI = "v2/shipment/get_kuaidi_coms"; + + // 此处为商家寄件回调地址定义,在controller中使用,不得随意更改,在创建订单时当作配置使用 + public static final String ONE_PASS_API_SHIPMENT_CALLBACK_URI = "/shipment/callback"; + + /** 商家寄件 END */ + + // 套餐类型——短信 + public static final String ONE_PASS_MEAL_TYPE_SMS = "sms"; + // 套餐类型——物流 + public static final String ONE_PASS_MEAL_TYPE_EXPR = "expr_query"; + // 套餐类型——电子面单 + public static final String ONE_PASS_MEAL_TYPE_DUMP = "expr_dump"; + // 套餐类型——产品复制 + public static final String ONE_PASS_MEAL_TYPE_COPY = "copy"; + + // 物流公司缓存key + public static final String ONE_PASS_EXPRESS_CACHE_KEY = "sync_express"; + + // 一号通当前应用access + public static final String ONE_PASS_ACCESS_KEY = "access_key"; + // 一号通通当前应用secret + public static final String ONE_PASS_SECRET_KEY = "secret_key"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/PayConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/PayConstants.java new file mode 100644 index 0000000..6f12e83 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/PayConstants.java @@ -0,0 +1,48 @@ +package com.yzt.common.constants; + +/** + * 支付相关常量类 + * fw_ + */ +public class PayConstants { + + //支付方式 + public static final String PAY_TYPE_WE_CHAT = "weixin"; //微信支付 + public static final String PAY_TYPE_YUE = "yue"; //余额支付 + public static final String PAY_TYPE_OFFLINE = "offline"; //线下支付 + public static final String PAY_TYPE_ALI_PAY = "alipay"; //支付宝 + public static final String PAY_TYPE_ZERO_PAY = "zeroPay"; // 零元付 + + //支付渠道 + public static final String PAY_CHANNEL_WE_CHAT_H5 = "weixinh5"; //H5唤起微信支付 + public static final String PAY_CHANNEL_WE_CHAT_PUBLIC = "public"; //公众号 + public static final String PAY_CHANNEL_WE_CHAT_PROGRAM = "routine"; //小程序 + public static final String PAY_CHANNEL_WE_CHAT_APP_IOS = "weixinAppIos"; //微信App支付ios + public static final String PAY_CHANNEL_WE_CHAT_APP_ANDROID = "weixinAppAndroid"; //微信App支付android + + public static final String PAY_CHANNEL_ALI_PAY = "alipay"; //支付宝支付 + public static final String PAY_CHANNEL_ALI_APP_PAY = "appAliPay"; //支付宝App支付 + + public static final String WX_PAY_TRADE_TYPE_JS = "JSAPI"; + public static final String WX_PAY_TRADE_TYPE_H5 = "MWEB"; + + //微信支付接口请求地址 + public static final String WX_PAY_API_URL = "https://api.mch.weixin.qq.com/"; + // 微信统一预下单 + public static final String WX_PAY_API_URI = "pay/unifiedorder"; + // 微信查询订单 + public static final String WX_PAY_ORDER_QUERY_API_URI = "pay/orderquery"; + // 微信支付回调地址 + public static final String WX_PAY_NOTIFY_API_URI = "/api/admin/payment/callback/wechat"; + // 微信退款回调地址 + public static final String WX_PAY_REFUND_NOTIFY_API_URI = "/api/admin/payment/callback/wechat/refund"; + + public static final String WX_PAY_SIGN_TYPE_MD5 = "MD5"; + public static final String WX_PAY_SIGN_TYPE_SHA256 = "HMAC-SHA256"; + + public static final String PAY_BODY = "Yzt支付中心-订单支付"; + public static final String FIELD_SIGN = "sign"; + + // 公共号退款 + public static final String WX_PAY_REFUND_API_URI= "secapi/pay/refund"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/ProductConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/ProductConstants.java new file mode 100644 index 0000000..26ef690 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/ProductConstants.java @@ -0,0 +1,79 @@ +package com.yzt.common.constants; + +/** + * 商品常量类 + * fw_ + */ +public class ProductConstants { + + /** 单规格属性 */ + public static final String SINGLE_ATTR_NAME = "规格"; + /** 单规格属性值 */ + public static final String SINGLE_ATTR_VALUE = "默认"; + + // 商品类型 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 attrResult表用到 + /** 商品类型——普通商品 */ + public static final Integer PRODUCT_TYPE_NORMAL = 0; + /** 商品类型——普通商品文字 */ + public static final String PRODUCT_TYPE_NORMAL_STR = "默认"; + /** 商品类型——秒杀商品 */ + public static final Integer PRODUCT_TYPE_SECKILL = 1; + /** 商品类型——秒杀商品文字 */ + public static final String PRODUCT_TYPE_SECKILL_STR = "秒杀"; + /** 商品类型——砍价商品 */ + public static final Integer PRODUCT_TYPE_BARGAIN = 2; + /** 商品类型——砍价商品文字 */ + public static final String PRODUCT_TYPE_BARGAIN_STR = "砍价"; + /** 商品类型——拼团商品 */ + public static final Integer PRODUCT_TYPE_PINGTUAN= 3; + /** 商品类型——拼团商品文字 */ + public static final String PRODUCT_TYPE_PINGTUAN_STR= "拼团"; + /** 商品类型——组件商品 */ + public static final Integer PRODUCT_TYPE_COMPONENT= 4; + /** 商品类型——组件商品文字 */ + public static final String PRODUCT_TYPE_COMPONENT_STR= "组件"; + /** 商品类型——云盘商品 */ + public static final Integer PRODUCT_TYPE_CLOUD= 5; + /** 商品类型——卡密商品 */ + public static final Integer PRODUCT_TYPE_CDKEY= 6; + + + /** 商品删除类型-回收站 */ + public static final String PRODUCT_DELETE_TYPE_RECYCLE = "recycle"; + /** 商品删除类型-删除 */ + public static final String PRODUCT_DELETE_TYPE_DELETE = "delete"; + + /** 商品评论类型-所有 */ + public static final String PRODUCT_REPLY_TYPE_ALL = "all"; + /** 商品评论类型-好评 */ + public static final String PRODUCT_REPLY_TYPE_GOOD = "good"; + /** 商品评论类型-中评 */ + public static final String PRODUCT_REPLY_TYPE_MEDIUM = "medium"; + /** 商品评论类型-差评 */ + public static final String PRODUCT_REPLY_TYPE_POOR = "poor"; + + /** 商品关系类型-收藏 */ + public static final String PRODUCT_RELATION_TYPE_COLLECT = "collect"; + /** 商品关系商品类型-普通商品 */ + public static final Integer PRODUCT_RELATION_CATEGORY_NORMAL = 0; + /** 商品关系商品类型-秒杀商品 */ + public static final Integer PRODUCT_RELATION_CATEGORY_SECKILL = 1; + /** 商品关系商品类型-砍价商品 */ + public static final Integer PRODUCT_RELATION_CATEGORY_BRANGAIN = 2; + /** 商品关系商品类型-拼团商品 */ + public static final Integer PRODUCT_RELATION_CATEGORY_COMBINATION = 3; + + /** 商品审核状态-无需审核 */ + public static final Integer AUDIT_STATUS_EXEMPTION = 0; + /** 商品审核状态-待审核 */ + public static final Integer AUDIT_STATUS_WAIT = 1; + /** 商品审核状态-审核成功 */ + public static final Integer AUDIT_STATUS_SUCCESS = 2; + /** 商品审核状态-审核拒绝 */ + public static final Integer AUDIT_STATUS_FAIL = 3; + + /** 活动边框 */ + public static final String PRODUCT_ACTIVITY_STYLE_BORDER = "activity_style_border"; + /** 活动背景 */ + public static final String PRODUCT_ACTIVITY_STYLE_BACKGROUND = "activity_style_background"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/RedisConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/RedisConstants.java new file mode 100644 index 0000000..66c8253 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/RedisConstants.java @@ -0,0 +1,22 @@ +package com.yzt.common.constants; + +/** + * Redis常量类 + * + */ +public class RedisConstants { + + /** 用户注册信息缓存Key */ + public static final String USER_REGISTER_KEY = "USER:REGISTER:"; + + /** 商品浏览量(每日) */ + public static final String PRO_PAGE_VIEW_KEY = "statistics:product:page_view:"; + public static final String PRO_PRO_PAGE_VIEW_KEY = "statistics:product:pro_page_view:{}:{}"; + + /** 商品加购量(每日) */ + public static final String PRO_ADD_CART_KEY = "statistics:product:add_cart:"; + public static final String PRO_PRO_ADD_CART_KEY = "statistics:product:pro_add_cart:{}:{}"; + + /** 微信小程序运力缓存Key **/ + public static final String WECHAT_MINI_DELIVERY_KEY = "wechat_delivery"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/RegularConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/RegularConstants.java new file mode 100644 index 0000000..f15d373 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/RegularConstants.java @@ -0,0 +1,102 @@ +package com.yzt.common.constants; + +/** + * 正则表达式类 + * fw_ + */ +public class RegularConstants { + //数字 + public static final String NUMBER = "^-?[0-9]+"; + + //邮箱 + public static final String EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; + + //手机 + public static final String PHONE = "^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$"; + + //只校验手机为11位 + public static final String PHONE_TWO = "^1\\d{10}$"; + + //整数或者小数: + public static final String INTEGER_OR_FLOAT = "^[0-9]+=\\.{0,1}[0-9]{0,2}$"; + + //n位的数字 + public static final String NUMBER_LEN = "^\\d{n}$"; + + //n位的数字 + public static final String NUMBER_MIN_LEN = "^\\d{n,}$"; + + //m~n位的数字 + public static final String NUMBER_LEN_RANGE = "^\\d{m,n}$"; + + //零和非零开头的数字 + public static final String NUMBER_LEN_UNSIGNED_CONTAINS_ZERO = "^(0|[1-9][0-9]*)$"; + + //有两位小数的正实数 + public static final String FLOAT_TWO_LEN = "^[0-9]+(.[0-9]{2})?$"; + + //有两位小数的正实数 + public static final String FLOAT_LEN_RANGE = "^[0-9]+(.[0-9]{1,3})?$"; + + //非零的正整数 + public static final String NUMBER_UNSIGNED = "^\\+?[1-9][0-9]*$"; + + //非0的负数 + public static final String NUMBER_NOT_UNSIGNED = "^\\-[1-9][]0-9\"*$"; + + //3位字符串 + public static final String STRING_THREE_LEN = "^.{3}$"; + + //所有英文字母 + public static final String STRING_ALL_EN_CHARS = "^[A-Za-z]+$"; + + //由26个大写英文字母组成的字符串 + public static final String STRING_UPPER_EN_CHARS = "^[A-Z]+$"; + + //由26个小写英文字母组成的字符串 + public static final String STRING_LOWER_EN_CHARS = "^[a-z]+$"; + + //由数字和26个英文字母组成的字符串 + public static final String STRING_ALL_EN_CHARS_AND_NUMBER = "^[A-Za-z0-9]+$"; + + //由数字和26个英文字母组成的字符串 + public static final String STRING_ALL_EN_CHARS_AND_UNDER_LINE = "^\\w+"; + + //验证用户密码, 正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。 + public static final String PASSWORD = "^[a-zA-Z]\\w{5,17}$"; + + //验证码, 正确格式为:4位数字验证码。 + public static final String SMS_VALIDATE_CODE_NUM = "^\\d{6}$"; + + //验证码, 正确格式为:6位数字验证码。 + public static final String VALIDATE_CODE_NUM_SIX = "^\\d{6}$"; + + //汉字 + public static final String CHINESE = "^[\\u4e00-\\u9fa5]{0,}$"; + + //url http开头 + public static final String URL = "^http://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$"; + + //电话 正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX" + public static final String TEL = "^(\\(\\d{3,4}-)|\\d{3.4}-)?\\d{7,8}$"; + + //验证身份证号 (15位或18位数字) + public static final String ID_CARD = "^\\d{15}|\\d{18}$"; + + // 验证一年的12个月 正确格式为:"01"~"09"和"1"~"12" + public static final String MONTH = "^(0?[1-9]|1[0-2])$"; + + // 验证一个月的31天 正确格式为;"01"~"09"和"1"~"31" + public static final String DAY = "^((0?[1-9])|((1|2)[0-9])|30|31)$"; + + // 匹配空行的正则表达式 + public static final String EMPTY_LINE = "\\n[\\s| ]*\\r"; + + // 匹配html标签的正则表达式 + public static final String HTML_TAG = "<(.*)>(.*)<\\/(.*)>|<(.*)\\/>"; + + // 匹配首尾空格的正则表达式 + public static final String TRIM = "(^\\s*)|(\\s*$)"; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/SmsConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/SmsConstants.java new file mode 100644 index 0000000..fc77ddb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/SmsConstants.java @@ -0,0 +1,102 @@ +package com.yzt.common.constants; + +/** + * 短信常量类 + * + */ +public class SmsConstants { + + /** 接口异常错误码 */ + public static final Integer SMS_ERROR_CODE = 400; + + /** 短信发送队列key */ + public static final String SMS_SEND_KEY = "sms_send_list"; + + /** 手机验证码redis key */ + public static final String SMS_VALIDATE_PHONE = "sms:validate:code:"; + public static final String SMS_VALIDATE_PHONE_NUM = "sms:validate:phone:"; + + /** + * --------------------- + * 短信模版配置开关常量 + * --------------------- + */ + /** 验证码 */ + public static final String SMS_CONFIG_VERIFICATION_CODE = "verificationCode"; +// public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 518076; + /** 验证码模板ID */ + public static final Integer SMS_CONFIG_VERIFICATION_CODE_TEMP_ID = 538393; + + /** 支付成功短信提醒 */ + public static final String SMS_CONFIG_LOWER_ORDER_SWITCH = "lowerOrderSwitch"; + /** 支付成功短信提醒模版ID */ + public static final Integer SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID = 520268; + + /** 发货短信提醒 */ + public static final String SMS_CONFIG_DELIVER_GOODS_SWITCH = "deliverGoodsSwitch"; + /** 发货短信提醒模版ID */ + public static final Integer SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID = 520269; + + /** 确认收货短信提醒 */ + public static final String SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH = "confirmTakeOverSwitch"; + /** 确认收货短信提醒模版ID */ + public static final Integer SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID = 520271; + + /** 用户下单管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH = "adminLowerOrderSwitch"; + /** 用户下单管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID = 520272; + + /** 支付成功管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH = "adminPaySuccessSwitch"; + /** 支付成功管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID = 520273; + + /** 用户确认收货管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_REFUND_SWITCH = "adminRefundSwitch"; + /** 用户确认收货管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID = 520422; + + /** 用户发起退款管理员短信提醒 */ + public static final String SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH = "adminConfirmTakeOverSwitch"; + /** 用户发起退款管理员短信提醒模版ID */ + public static final Integer SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID = 520274; + + /** 改价短信提醒 */ + public static final String SMS_CONFIG_PRICE_REVISION_SWITCH = "priceRevisionSwitch"; + /** 改价短信提醒模版ID */ + public static final Integer SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID = 528288; + + /** 订单未支付 */ + public static final String SMS_CONFIG_ORDER_PAY_FALSE = "orderPayFalse"; + /** 订单未支付模版ID */ + public static final Integer SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID = 528116; + + /** + * 短信类型 + * 短信模版配置开关常量 + */ + /** 验证码 */ + public static final int SMS_CONFIG_TYPE_VERIFICATION_CODE = 1; + /** 支付成功短信提醒 */ + public static final int SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH = 2; + /** 发货短信提醒 */ + public static final int SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH = 3; + /** 确认收货短信提醒 */ + public static final int SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH = 4; + /** 用户下单管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH = 5; + /** 支付成功管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH = 6; + /** 用户确认收货管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH = 7; + /** 用户发起退款管理员短信提醒 */ + public static final int SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH = 8; + /** 改价短信提醒 */ + public static final int SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH = 9; + /** 订单未支付 */ + public static final int SMS_CONFIG_TYPE_ORDER_PAY_FALSE = 10; + + /** 发送短信参数模板 */ + public static final String SMS_COMMON_PARAM_FORMAT = "param[{}]"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/SysConfigConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/SysConfigConstants.java new file mode 100644 index 0000000..05218f0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/SysConfigConstants.java @@ -0,0 +1,202 @@ +package com.yzt.common.constants; + +/** + * 系统设置常量类 + * fw_ + */ +public class SysConfigConstants { + + //后台首页登录图片 + /** 登录页LOGO */ + public static final String CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP = "site_logo_lefttop"; + public static final String CONFIG_KEY_ADMIN_LOGIN_LOGO_LOGIN = "site_logo_login"; + public static final String CONFIG_KEY_ADMIN_LOGO_SQUARE = "site_logo_square"; + public static final String CONFIG_KEY_SITE_NAME = "site_name"; + /** 登录页背景图 */ + public static final String CONFIG_KEY_ADMIN_LOGIN_BACKGROUND_IMAGE = "admin_login_bg_pic"; + + /** 微信分享图片(公众号) */ + public static final String CONFIG_KEY_ADMIN_WECHAT_SHARE_IMAGE = "wechat_share_img"; + /** 微信分享标题(公众号) */ + public static final String CONFIG_KEY_ADMIN_WECHAT_SHARE_TITLE = "wechat_share_title"; + /** 微信分享简介(公众号) */ + public static final String CONFIG_KEY_ADMIN_WECHAT_SHARE_SYNOSIS = "wechat_share_synopsis"; + + + /** 是否启用分销 */ + public static final String CONFIG_KEY_BROKERAGE_FUNC_STATUS = "brokerage_func_status"; + /** 分销模式 :1-指定分销,2-人人分销 */ + public static final String CONFIG_KEY_STORE_BROKERAGE_STATUS = "store_brokerage_status"; + /** 分销模式 :1-指定分销 */ + public static final String STORE_BROKERAGE_STATUS_APPOINT = "1"; + /** 分销模式 :2-人人分销 */ + public static final String STORE_BROKERAGE_STATUS_PEOPLE = "2"; + /** 一级返佣比例 */ + public static final String CONFIG_KEY_STORE_BROKERAGE_RATIO = "store_brokerage_ratio"; + /** 二级返佣比例 */ + public static final String CONFIG_KEY_STORE_BROKERAGE_TWO = "store_brokerage_two"; + /** 判断是否开启气泡 */ + public static final String CONFIG_KEY_STORE_BROKERAGE_IS_BUBBLE = "store_brokerage_is_bubble"; + /** 判断是否分销消费门槛 */ + public static final String CONFIG_KEY_STORE_BROKERAGE_QUOTA = "store_brokerage_quota"; + + /** 是否开启会员功能 */ + public static final String CONFIG_KEY_VIP_OPEN = "vip_open"; + /** 是否开启充值功能 */ + public static final String CONFIG_KEY_RECHARGE_SWITCH = "recharge_switch"; + /** 是否开启门店自提 */ + public static final String CONFIG_KEY_STORE_SELF_MENTION = "store_self_mention"; +// /** 腾讯地图key */ + public static final String CONFIG_SITE_TENG_XUN_MAP_KEY = "tengxun_map_key"; + /** 退款理由 */ + public static final String CONFIG_KEY_STOR_REASON = "stor_reason"; + /** 提现最低金额 */ + public static final String CONFIG_EXTRACT_MIN_PRICE = "user_extract_min_price"; + /** 提现冻结时间 */ + public static final String CONFIG_EXTRACT_FREEZING_TIME = "extract_time"; + + /** 全场满额包邮开关 */ + public static final String STORE_FEE_POSTAGE_SWITCH = "store_free_postage_switch"; + /** 全场满额包邮金额 */ + public static final String STORE_FEE_POSTAGE = "store_free_postage"; + /** 积分抵用比例(1积分抵多少金额) */ + public static final String CONFIG_KEY_INTEGRAL_RATE = "integral_ratio"; + /** 下单支付金额按比例赠送积分(实际支付1元赠送多少积分) */ + public static final String CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE = "order_give_integral"; + + /** 微信支付开关 */ + public static final String CONFIG_PAY_WEIXIN_OPEN = "pay_weixin_open"; + /** 余额支付状态 */ + public static final String CONFIG_YUE_PAY_STATUS = "yue_pay_status"; + /** 支付宝支付状态 */ + public static final String CONFIG_ALI_PAY_STATUS = "ali_pay_status"; + + /** 版权-授权标签 */ + public static final String CONFIG_COPYRIGHT_LABEL = "copyright_label"; + /** 版权-公司信息 */ + public static final String CONFIG_COPYRIGHT_COMPANY_INFO = "copyright_company_name"; + /** 版权-公司图片 */ + public static final String CONFIG_COPYRIGHT_COMPANY_IMAGE = "copyright_company_image"; + /** 版权-授权地址 */ + public static final String CONFIG_COPYRIGHT_AUTH_HOST = "authHost"; + + /** 主题测配置 */ + public static final String CONFIG_CHANGE_COLOR = "change_color_config"; + + /** 电子面单-快递公司ID */ + public static final String ELECTRONIC_FACE_SHEET_EXPORT_ID = "config_export_id"; + /** 电子面单-快递公司模板id */ + public static final String ELECTRONIC_FACE_SHEET_EXPORT_TEMP_ID = "config_export_temp_id"; + /** 电子面单-快递公司编码 */ + public static final String ELECTRONIC_FACE_SHEET_EXPORT_COM = "config_export_com"; + /** 电子面单-发货人姓名 */ + public static final String ELECTRONIC_FACE_SHEET_TO_NAME = "config_export_to_name"; + /** 电子面单-发货人电话 */ + public static final String ELECTRONIC_FACE_SHEET_TO_TEL = "config_export_to_tel"; + /** 电子面单-发货人详细地址 */ + public static final String ELECTRONIC_FACE_SHEET_ADDRESS = "config_export_to_address"; + /** 电子面单-电子面单打印机编号 */ + public static final String ELECTRONIC_FACE_SHEET_PRINTER_NUM = "config_export_siid"; + /** 电子面单-开关 */ + public static final String ELECTRONIC_FACE_SHEET_OPEN = "config_export_open"; + + + /** 系统配置列表 */ + public static final String CONFIG_LIST = "config_list"; + /** 移动端域名 */ + public static final String CONFIG_KEY_SITE_URL = "site_url"; + /** 后台api地址(回调地址) */ + public static final String CONFIG_KEY_API_URL = "api_url"; + /** 移动商城api接口地址 */ + public static final String CONFIG_KEY_FRONT_API_URL = "front_api_url"; + + /** 充值注意事项 */ + public static final String CONFIG_RECHARGE_ATTENTION = "recharge_attention"; + + + /** 图片上传类型 1本地 2七牛云 3OSS 4COS 5京东, 默认本地 */ + public static final String CONFIG_UPLOAD_TYPE = "uploadType"; + /** 文件上传是否保存本地 */ + public static final String CONFIG_FILE_IS_SAVE = "file_is_save"; + /** 全局本地图片域名 */ + public static final String CONFIG_LOCAL_UPLOAD_URL = "localUploadUrl"; + /** 图片上传,拓展名 */ + public static final String UPLOAD_IMAGE_EXT_STR_CONFIG_KEY = "image_ext_str"; + /** 图片上传,最大尺寸 */ + public static final String UPLOAD_IMAGE_MAX_SIZE_CONFIG_KEY = "image_max_size"; + /** 文件上传,拓展名 */ + public static final String UPLOAD_FILE_EXT_STR_CONFIG_KEY = "file_ext_str"; + /** 文件上传,最大尺寸 */ + public static final String UPLOAD_FILE_MAX_SIZE_CONFIG_KEY = "file_max_size"; + + /** 七牛云上传URL */ + public static final String CONFIG_QN_UPLOAD_URL = "qnUploadUrl"; + /** 七牛云Access Key */ + public static final String CONFIG_QN_ACCESS_KEY = "qnAccessKey"; + /** 七牛云Secret Key */ + public static final String CONFIG_QN_SECRET_KEY = "qnSecretKey"; + /** 七牛云存储名称 */ + public static final String CONFIG_QN_STORAGE_NAME = "qnStorageName"; + /** 七牛云存储区域 */ + public static final String CONFIG_QN_STORAGE_REGION = "qnStorageRegion"; + + /** 阿里云上传URL */ + public static final String CONFIG_AL_UPLOAD_URL = "alUploadUrl"; + /** 阿里云Access Key */ + public static final String CONFIG_AL_ACCESS_KEY = "alAccessKey"; + /** 阿里云Secret Key */ + public static final String CONFIG_AL_SECRET_KEY = "alSecretKey"; + /** 阿里云存储名称 */ + public static final String CONFIG_AL_STORAGE_NAME = "alStorageName"; + /** 阿里云存储区域 */ + public static final String CONFIG_AL_STORAGE_REGION = "alStorageRegion"; + + /** 腾讯云上传URL */ + public static final String CONFIG_TX_UPLOAD_URL = "txUploadUrl"; + /** 腾讯云Access Key */ + public static final String CONFIG_TX_ACCESS_KEY = "txAccessKey"; + /** 腾讯云Secret Key */ + public static final String CONFIG_TX_SECRET_KEY = "txSecretKey"; + /** 腾讯云存储名称 */ + public static final String CONFIG_TX_STORAGE_NAME = "txStorageName"; + /** 腾讯云存储区域 */ + public static final String CONFIG_TX_STORAGE_REGION = "txStorageRegion"; + + /** 京东云上传URL */ + public static final String CONFIG_JD_UPLOAD_URL = "jdUploadUrl"; + /** 京东云Access Key */ + public static final String CONFIG_JD_ACCESS_KEY = "jdAccessKey"; + /** 京东云Secret Key */ + public static final String CONFIG_JD_SECRET_KEY = "jdSecretKey"; + /** 京东云存储桶名称 */ + public static final String CONFIG_JD_BUCKET_NAME = "jdBucketName"; + /** 京东云存储区域 */ + public static final String CONFIG_JD_CLOUD_SIGNING_REGION = "jdSigningRegion"; + /** 京东云存储端点 */ + public static final String CONFIG_JD_CLOUD_ENDPOINT = "jdEndpoint"; + + /** 短信类型 1:阿里云 2:腾讯云 3:华为云, 默认阿里云 */ + public static final String CONFIG_SMS_TYPE = "smsType"; + + /** 阿里云Access Key */ + public static final String CONFIG_AL_SMS_ACCESS_KEY = "alSmsAccessKey"; + /** 阿里云Secret Key */ + public static final String CONFIG_AL_SMS_SECRET_KEY = "alSmsSecretKey"; + /** 阿里云短信签名 */ + public static final String CONFIG_AL_SMS_SIGN_NAME = "alSmsSignName"; + /** 阿里云短信模板ID */ + public static final String CONFIG_AL_SMS_TEMPLATE_ID = "alSmsTemplateId"; + /** 阿里云短信模板参数 */ + public static final String CONFIG_AL_SMS_TEMPLATE_PARAMS = "alSmsTemplateParams"; + + /** 腾讯云Access Key */ + public static final String CONFIG_TX_SMS_ACCESS_KEY = "txSmsAccessKey"; + /** 腾讯云Secret Key */ + public static final String CONFIG_TX_SMS_SECRET_KEY = "txSmsSecretKey"; + /** 腾讯云短信签名 */ + public static final String CONFIG_TX_SMS_SIGN_NAME = "txSmsSignName"; + /** 腾讯云短信模板ID */ + public static final String CONFIG_TX_SMS_TEMPLATE_ID = "txSmsTemplateId"; + /** 腾讯云短信模板AppID */ + public static final String CONFIG_TX_SMS_TEMPLATE_APPID = "txSmsTemplateAppId"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/SysGroupDataConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/SysGroupDataConstants.java new file mode 100644 index 0000000..0e00c61 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/SysGroupDataConstants.java @@ -0,0 +1,48 @@ +package com.yzt.common.constants; + +/** + * 组合数据常量类 + * fw_ + */ +public class SysGroupDataConstants { + + /** 中部推荐banner图 */ + public static final Integer GROUP_DATA_ID_INDEX_BEST_BANNER = 37; + /** 首页banner滚动图 */ + public static final Integer GROUP_DATA_ID_INDEX_BANNER = 48; + /** 首页精品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_RECOMMEND_BANNER = 52; + /** 订单详情状态图 */ + public static final Integer GROUP_DATA_ID_ORDER_STATUS_PIC = 53; + /** 个人中心菜单 */ + public static final Integer GROUP_DATA_ID_USER_CENTER_MENU = 54; + /** 签到配置 */ + public static final Integer GROUP_DATA_ID_SIGN = 55; + /** 热门搜索 */ + public static final Integer GROUP_DATA_ID_HOT_SEARCH = 56; + /** 热门榜单推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_HOT_BANNER = 57; + /** 首发新品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_NEW_BANNER = 58; + /** 首页促销单品推荐Banner图片 */ + public static final Integer GROUP_DATA_ID_INDEX_BENEFIT_BANNER = 59; + /** 推广海报图 */ + public static final Integer GROUP_DATA_ID_SPREAD_BANNER_LIST = 60; + /** 充值金额设置 */ + public static final Integer GROUP_DATA_ID_RECHARGE_LIST = 62; + /** 个人中心轮播图 */ + public static final Integer GROUP_DATA_ID_USER_CENTER_BANNER = 65; + /** 导航模块 */ + public static final Integer GROUP_DATA_ID_INDEX_MENU = 67; + /** 首页滚动新闻 */ + public static final Integer GROUP_DATA_ID_INDEX_NEWS_BANNER = 68; + /** 首页活动区域图片 */ + public static final Integer GROUP_DATA_ID_INDEX_ACTIVITY_BANNER = 69; + /** 首页超值爆款 */ + public static final Integer GROUP_DATA_ID_INDEX_EX_BANNER = 70; + /** 热门搜索 */ + public static final Integer GROUP_DATA_ID_INDEX_KEYWORDS = 71; + /** 后台登录页面轮播图 */ + public static final Integer GROUP_DATA_ID_ADMIN_LOGIN_BANNER_IMAGE_LIST = 72; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/TaskConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/TaskConstants.java new file mode 100644 index 0000000..eee0520 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/TaskConstants.java @@ -0,0 +1,13 @@ +package com.yzt.common.constants; + +/** + * 定时任务常量类 + * + */ +public class TaskConstants { + + /** 订单支付成功后Task */ + public static final String ORDER_TASK_PAY_SUCCESS_AFTER = "orderPaySuccessTask"; + /** 订单收货后Task */ + public static final String ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER = "alterOrderTakeByUser"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/UploadConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/UploadConstants.java new file mode 100644 index 0000000..0a11d7d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/UploadConstants.java @@ -0,0 +1,20 @@ +package com.yzt.common.constants; + +/** + * 上传/下载常量类 + * + */ +public class UploadConstants { + + /** 文件上传关键字 */ + public static final String UPLOAD_FILE_KEYWORD = "yztimage"; + + /** 文件导出下载拦截关键字 */ + public static final String DOWNLOAD_FILE_KEYWORD = "downloadf"; + + /** 文件前端上传后下载关键字 */ + public static final String UPLOAD_AFTER_FILE_KEYWORD = "uploadf"; + + /** 文件类型-excel */ + public static final String UPLOAD_MODEL_PATH_EXCEL = "excel"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/UserConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/UserConstants.java new file mode 100644 index 0000000..5f52b95 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/UserConstants.java @@ -0,0 +1,27 @@ +package com.yzt.common.constants; + +/** + * 用户常量表 + * fw_ + */ +public class UserConstants { + + /** 用户类型——H5 */ + public static final String USER_TYPE_H5 = "h5"; + /** 用户类型——公众号 */ + public static final String USER_TYPE_WECHAT = "wechat"; + /** 用户类型——小程序 */ + public static final String USER_TYPE_ROUTINE = "routine"; + + /** + * ========================================================= + * UserToken部分 + * ========================================================= + */ + /** 用户Token类型——公众号 */ + public static final Integer USER_TOKEN_TYPE_WECHAT = 1; + /** 用户Token类型——小程序 */ + public static final Integer USER_TOKEN_TYPE_ROUTINE = 2; + /** 用户Token类型——unionid */ + public static final Integer USER_TOKEN_TYPE_UNIONID = 3; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/UserLevelConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/UserLevelConstants.java new file mode 100644 index 0000000..5444a74 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/UserLevelConstants.java @@ -0,0 +1,18 @@ +package com.yzt.common.constants; + +/** + * 用户等级常量类 + * + */ +public class UserLevelConstants { + + /** + * --------------------------------------- + * --------系统用户等级常量------------------ + * --------------------------------------- + */ + /** 系统用户等级规则 */ + public static final String SYSTEM_USER_LEVEL_RULE = "userLevelRule"; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/WeChatConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/WeChatConstants.java new file mode 100644 index 0000000..150aab6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/WeChatConstants.java @@ -0,0 +1,279 @@ +package com.yzt.common.constants; + +/** 微信配置 + * fw_ + */ +public class WeChatConstants { + + //-------------------------------------------微信系统配置------------------------------------------------------------ + /** 公众号appId key */ + public static final String WECHAT_PUBLIC_APPID = "wechat_appid"; + /** 公众号appSecret key */ + public static final String WECHAT_PUBLIC_APPSECRET = "wechat_appsecret"; + /** 小程序appId key */ + public static final String WECHAT_MINI_APPID = "routine_appid"; + // 小程序 名称 + public static final String WECHAT_MINI_NAME = "routine_name"; + /** 小程序appSecret key */ + public static final String WECHAT_MINI_APPSECRET = "routine_appsecret"; + + + + + + //------------------------------------------------微信公众号------------------------------------------------ + //微信接口请求地址 + public static final String API_URL = "https://api.weixin.qq.com/"; + //获取token + public static final String API_TOKEN_URI = "cgi-bin/token?grant_type=client_credential"; + // 微信token 过期时间,娶了一个中间值 4000 官方的7200不靠谱 + public static final Long API_TOKEN_EXPIRES = 3000L; + //微信公众号菜单创建 + public static final String PUBLIC_API_MENU_CREATE_URI = "cgi-bin/menu/create"; + //微信公众号菜单获取 + public static final String PUBLIC_API_MENU_GET_URI = "cgi-bin/menu/get"; + //微信公众号菜单删除 + public static final String PUBLIC_API_MENU_DELETE_URI = "cgi-bin/menu/delete"; + //微信公众号,获取自定义菜单配置接口 + public static final String PUBLIC_API_MENU_SELF_SET_URI = "cgi-bin/get_current_selfmenu_info"; + //微信公众号,创建个性化菜单 + public static final String PUBLIC_API_MENU_ADD_CONDITIONAL_URI = "cgi-bin/menu/addconditional"; + //微信公众号,删除个性化菜单 + public static final String PUBLIC_API_MENU_DEL_CONDITIONAL_URI = "cgi-bin/menu/delconditional"; + //微信公众号,测试个性化菜单匹配结果 + public static final String PUBLIC_API_USER_INFO_URI = "cgi-bin/menu/trymatch"; + //获取公众号已创建的标签 + public static final String PUBLIC_API_TAG_LIST_URI = "cgi-bin/tags/get"; + //创建标签 + public static final String PUBLIC_API_TAG_CREATE_URI = "cgi-bin/tags/create"; + //编辑标签 + public static final String PUBLIC_API_TAG_UPDATE_URI = "cgi-bin/tags/update"; + //删除标签 + public static final String PUBLIC_API_TAG_DELETE_URI = "cgi-bin/tags/delete"; + //获取标签下粉丝列表 + public static final String PUBLIC_API_TAG_USER_GET_URI = "cgi-bin/user/tag/get"; + //批量为用户打标签 + public static final String PUBLIC_API_TAG_MEMBER_BATCH_URI = "cgi-bin/tags/members/batchtagging"; + //批量为用户取消标签 + public static final String PUBLIC_API_TAG_MEMBER_BATCH_UN_URI = "cgi-bin/tags/members/batchuntagging"; + //获取用户身上的标签列表 + public static final String PUBLIC_API_TAG_GET_ID_LIST_URI = "cgi-bin/tags/getidlist"; + //获取 JsApiTicket + public static final String PUBLIC_API_JS_API_TICKET = "cgi-bin/ticket/getticket"; + //发送公众号模板消息 + public static final String PUBLIC_API_PUBLIC_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/template/send"; + //获取设置的行业信息 + public static final String PUBLIC_API_TEMPLATE_MESSAGE_INDUSTRY = "cgi-bin/template/get_industry"; + //新增其他类型永久素材 + public static final String PUBLIC_API_MEDIA_UPLOAD = "cgi-bin/material/add_material"; + //获取永久素材 + public static final String PUBLIC_API_MEDIA_GET = "cgi-bin/material/get_material"; + //获取微信素材总数 + public static final String PUBLIC_API_MEDIA_COUNT = "cgi-bin/material/get_materialcount"; + //发送客服消息 + public static final String PUBLIC_API_KF_MESSAGE_SEND = "cgi-bin/message/custom/send"; + + + //------------------------------------------------微信小程序------------------------------------------------ + //小程序行业消息 + public static final String PUBLIC_API_PROGRAM_CATEGORY = "wxaapi/newtmpl/getcategory"; + //小程序公共模板库 + public static final String PUBLIC_API_PROGRAM_PUBLIC_TEMP = "wxaapi/newtmpl/getpubtemplatetitles"; + //小程序模板关键词列表 + public static final String PUBLIC_API_PROGRAM_PUBLIC_TEMP_KEYWORDS = "wxaapi/newtmpl/getpubtemplatekeywords"; + //添加小程序订阅消息 + public static final String PUBLIC_API_ADD_PROGRAM_TEMPLATE = "wxaapi/newtmpl/addtemplate"; + //删除小程序订阅消息 + public static final String PUBLIC_API_DELETE_PROGRAM_TEMPLATE = "wxaapi/newtmpl/deltemplate"; + //发送小程序模板消息 + public static final String PUBLIC_API_PROGRAM_TEMPLATE_MESSAGE_SEND = "cgi-bin/message/subscribe/send"; + + //授权登录 + + //获取临时code跳转地址 + public static final String WE_CHAT_AUTHORIZE_REDIRECT_URI_URL = "/api/front/wechat/authorize/login"; + + //获取openId + public static final String WE_CHAT_AUTHORIZE_GET_OPEN_ID = "sns/oauth2/access_token"; + + //获取小程序openId + public static final String WE_CHAT_AUTHORIZE_PROGRAM_GET_OPEN_ID = "sns/jscode2session"; + + //获取用户信息 + public static final String WE_CHAT_AUTHORIZE_GET_USER_INFO = "sns/userinfo"; + + //生成二维码 + public static final String WE_CHAT_CREATE_QRCODE = "wxa/getwxacodeunlimit"; + + //微信消息存储队列 + public static final String WE_CHAT_MESSAGE_SEND_KEY = "we_chat_message_send_list"; + + //大家注意这里消息类型的定义,以 RESP 开头的表示返回的消息类型,以 REQ 表示微信服务器发来的消息类型 + /** + * 返回消息类型:文本 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_TEXT = "text"; + /** + * 返回消息类型:音乐 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_MUSIC = "music"; + /** + * 返回消息类型:图文 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_NEWS = "news"; + /** + * 返回消息类型:图片 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_IMAGE = "image"; + /** + * 返回消息类型:语音 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_VOICE = "voice"; + /** + * 返回消息类型:视频 + */ + public static final String WE_CHAT_MESSAGE_RESP_MESSAGE_TYPE_VIDEO = "video"; + /** + * 请求消息类型:文本 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_TEXT = "text"; + /** + * 请求消息类型:图片 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_IMAGE = "image"; + /** + * 请求消息类型:链接 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_LINK = "link"; + /** + * 请求消息类型:地理位置 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_LOCATION = "location"; + /** + * 请求消息类型:音频 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_VOICE = "voice"; + /** + * 请求消息类型:视频 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_VIDEO = "video"; + /** + * 请求消息类型:推送 + */ + public static final String WE_CHAT_MESSAGE_REQ_MESSAGE_TYPE_EVENT = "event"; + /** + * 事件类型:subscribe(订阅) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_SUBSCRIBE = "subscribe"; + /** + * 事件类型:unsubscribe(取消订阅) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; + /** + * 事件类型:CLICK(自定义菜单点击事件) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_CLICK = "click"; + /** + * 事件类型:VIEW(自定义菜单 URl 视图) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_VIEW = "view"; + /** + * 事件类型:LOCATION(上报地理位置事件) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_LOCATION = "LOCATION"; + /** + * 事件类型:LOCATION(上报地理位置事件) + */ + public static final String WE_CHAT_MESSAGE_EVENT_TYPE_SCAN = "SCAN"; + + //无效关键字key + public static final String WE_CHAT_MESSAGE_DEFAULT_CONTENT_KEY = "default"; + //Js sdk api 列表 + public static final String PUBLIC_API_JS_API_SDK_LIST = "openAddress,updateTimelineShareData,updateAppMessageShareData,onMenuShareTimeline,onMenuShareAppMessage,onMenuShareQQ,onMenuShareWeibo,onMenuShareQZone,startRecord,stopRecord,onVoiceRecordEnd,playVoice,pauseVoice,stopVoice,onVoicePlayEnd,uploadVoice,downloadVoice,chooseImage,previewImage,uploadImage,downloadImage,translateVoice,getNetworkType,openLocation,getLocation,hideOptionMenu,showOptionMenu,hideMenuItems,showMenuItems,hideAllNonBaseMenuItem,showAllNonBaseMenuItem,closeWindow,scanQRCode,chooseWXPay,openProductSpecificView,addCard,chooseCard,openCard"; + + + //token + public static final String REDIS_TOKEN_KEY = "wechat_token"; + public static final String REDIS_PROGRAM_TOKEN_KEY = "wechat_program_token"; + //tag + public static final String REDIS_TAGS_LIST_KEY = "wechat_tags_list"; + //user tag + public static final String REDIS_TAGS_LIST_USER_KEY = "wechat_tags_user_list"; + //微信菜单 + public static final String REDIS_PUBLIC_MENU_KEY = "wechat_public_menu_key"; + //微信自定义菜单 + public static final String REDIS_PUBLIC_MENU_SELF_KEY = "wechat_public_menu_self_key"; + + + + //授权请求地址 + public static final String WE_CHAT_AUTHORIZE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$appId}&redirect_uri={$redirectUri}&response_type=code&scope=snsapi_base&state=#wechat_redirect"; + + + //-------------------------------------------微信支付------------------------------------------------------------ + //微信支付接口请求地址 + public static final String PAY_API_URL = "https://api.mch.weixin.qq.com/"; + public static final String PAY_API_URI = "pay/unifiedorder"; + public static final String PAY_NOTIFY_API_URI_WECHAT = "/api/admin/payment/callback/wechat"; + // 公共号退款 + public static final String PAY_REFUND_API_URI_WECHAT = "secapi/pay/refund"; + + public static final String PAY_TYPE_JS = "JSAPI"; + public static final String PAY_TYPE_H5 = "MWEB"; + + // -------------------------------------------------------------------------------------------------------- + // 微信部分 + // -------------------------------------------------------------------------------------------------------- + + /** 获取accessToken的url */ + public static final String WECHAT_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}"; + /** 开放平台获取accessToken的url */ + public static final String WECHAT_OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={}&secret={}&code={}&grant_type=authorization_code"; + /** 开放平台获取用户的url */ + public static final String WECHAT_SNS_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token={}&openid={}&lang={}"; + + /** 公众号js-sdk获取ticket的url */ + public static final String WECHAT_PUBLIC_JS_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={}&type=jsapi"; + /** 公众号发送模板消息的url */ + public static final String WECHAT_PUBLIC_SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}"; + /** 公众号获取自定义菜单配置的url */ + public static final String WECHAT_PUBLIC_MENU_GET_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token={}"; + /** 公众号创建自定义菜单的url */ + public static final String WECHAT_PUBLIC_MENU_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={}"; + /** 公众号删除自定义菜单的url */ + public static final String WECHAT_PUBLIC_MENU_DELETE_URL = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={}"; + /** 公众号上传其他类型永久素材的url */ + public static final String WECHAT_PUBLIC_QYAPI_ADD_MATERIAL_URL = "https://api.weixin.qq.com/cgi-bin/material/add_material?type={}&access_token={}"; + /** 公众号获取模板列表(自己的) */ + public static final String WECHAT_PUBLIC_GET_ALL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token={}"; + /** 公众号删除模板(自己的) */ + public static final String WECHAT_PUBLIC_DEL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token={}"; + /** 公众号添加模板(自己的) */ + public static final String WECHAT_PUBLIC_API_ADD_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={}"; + + + /** 小程序登录凭证校验的url */ + public static final String WECHAT_MINI_SNS_AUTH_CODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code"; + /** 小程序生成小程序码的url */ + public static final String WECHAT_MINI_QRCODE_UNLIMITED_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={}"; + /** 小程序发送订阅消息的url */ + public static final String WECHAT_MINI_SEND_SUBSCRIBE_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={}"; + /** 小程序获取订阅列表(自己的) */ + public static final String WECHAT_MINI_GET_ALL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token={}"; + /** 小程序删除模板(自己的) */ + public static final String WECHAT_MINI_DEL_PRIVATE_TEMPLATE_URL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token={}"; + /** 小程序获取订阅模板(小程序的) */ + public static final String WECHAT_MINI_GET_TEMPLATE_URL = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token={}&tid={}"; + /** 公众号添加模板(自己的) */ + public static final String WECHAT_MINI_API_ADD_TEMPLATE_URL = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token={}"; + + /** 小程序accessToken redis key */ + public static final String REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY = "wechat_mini_accessToken"; + /** 公众号accessToken redis key */ + public static final String REDIS_WECAHT_PUBLIC_ACCESS_TOKEN_KEY = "wechat_public_accessToken"; + /** 公众号JsApiTicket redis key */ + public static final String REDIS_PUBLIC_JS_API_TICKET = "wechat_js_api_ticket"; + public static final Long REDIS_PUBLIC_JS_API_TICKET_EXPRESS = 7100L; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/constants/YlyConstants.java b/fightwine-common/src/main/java/com/yzt/common/constants/YlyConstants.java new file mode 100644 index 0000000..9cd5486 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/constants/YlyConstants.java @@ -0,0 +1,23 @@ +package com.yzt.common.constants; + +/** + * 易联云打印 + * + */ +public class YlyConstants { + + // 易联云应用ID + public static final String YLY_PRINT_APP_ID = "ylyprint_app_id"; + // 易联云应用密钥 + public static final String YLY_PRINT_APP_SECRET = "ylyprint_app_secret"; + // 易联云打印机设备码 + public static final String YLY_PRINT_APP_MACHINE_CODE = "ylyprint_app_machine_code"; + // 易联云打印机设备密钥 + public static final String YLY_PRINT_APP_MACHINE_MSIGN = "ylyprint_app_machine_msign"; + // 易联云打印开关 + public static final String YLY_PRINT_AUTO_STATUS = "ylyprint_auto_status"; + public static final String YLY_PRINT_STATUS = "ylyprint_status"; + + // + public static final String YLY_REDIS_TOKEN = "yly_token"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/enums/EnumYly.java b/fightwine-common/src/main/java/com/yzt/common/enums/EnumYly.java new file mode 100644 index 0000000..fe973a1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/enums/EnumYly.java @@ -0,0 +1,38 @@ +package com.yzt.common.enums; + +/** 易联云 枚举 + * + **/ +public enum EnumYly { + VOLUME_RESPONSE_TYPE_FENGMINGQI("蜂鸣器","buzzer"), + VOLUME_RESPONSE_TYPE_HORN("喇叭","horn"), + VOLUME_RESPONSE_VOICE1("音量1","1"), + VOLUME_RESPONSE_VOICE2("音量2","2"), + VOLUME_RESPONSE_VOICE3("音量3","3"), + VOLUME_RESPONSE_VOICE4("音量4","4"), + ; + + private String name; + private String code; + + EnumYly(String name, String code) { + this.name = name; + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/enums/MethodType.java b/fightwine-common/src/main/java/com/yzt/common/enums/MethodType.java new file mode 100644 index 0000000..243dba5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/enums/MethodType.java @@ -0,0 +1,46 @@ +package com.yzt.common.enums; + +/** + * 方法类型枚举 + * fw_ + */ +public enum MethodType { + + ADD("add", "增加"), + DELETE("delete", "删除"), + UPDATE("update", "修改"), + EXPORT("export", "导出"), + SELECT("query", "查询"); + + private final String type; + private final String name; + + MethodType(String type, String name) { + this.type = type; + this.name = name; + } + + public String getType() { + return type; + } + + public String getName() { + return name; + } + + public static String getName(String type){ + for (MethodType modelType : MethodType.values()) { + if (modelType.getType().equals(type)) + return modelType.getName(); + } + return null; + } + + public static String getType(String name){ + for (MethodType modelType : MethodType.values()) { + if (modelType.getName().equals(name)) + return modelType.getType(); + } + return "-1"; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/enums/OssEnum.java b/fightwine-common/src/main/java/com/yzt/common/enums/OssEnum.java new file mode 100644 index 0000000..d9ef13c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/enums/OssEnum.java @@ -0,0 +1,40 @@ +package com.yzt.common.enums; + +public enum OssEnum { + /** + * 上传渠道 + */ + ALI_OSS("ALI_OSS", "3"), MINIO("MINIO", "5"), HUAWEI_OBS("HUAWEI_OBS", "6"), TENCENT_COS("TENCENT_COS", "4"); + + private String name; + private String code; + + OssEnum(String name, String code) { + this.name = name; + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public static String getName(String code){ + for (OssEnum ossEnum : OssEnum.values()) { + if (ossEnum.getCode().equals(code)) + return ossEnum.getName(); + } + return null; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/enums/SmsEnum.java b/fightwine-common/src/main/java/com/yzt/common/enums/SmsEnum.java new file mode 100644 index 0000000..e50a48c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/enums/SmsEnum.java @@ -0,0 +1,45 @@ +package com.yzt.common.enums; + +/** + * 短信通道枚举 + * + */ +public enum SmsEnum { + + /** + * 短信渠道 + */ + ALI("ALI", "1"), HUAWEI("HUAWEI", "3"), TENCENT("TENCENT", "2"); + + private String name; + private String code; + + SmsEnum(String name, String code) { + this.name = name; + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public static String getName(String code){ + for (SmsEnum smsEnum : SmsEnum.values()) { + if (smsEnum.getCode().equals(code)) + return smsEnum.getName(); + } + return null; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/Assert.java b/fightwine-common/src/main/java/com/yzt/common/exception/Assert.java new file mode 100644 index 0000000..177b094 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/Assert.java @@ -0,0 +1,122 @@ +package com.yzt.common.exception; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; + +/** + * 断言 + * + */ +public interface Assert { + + /** + * 创建异常 + */ + YztException newException(); + + /** + * 断言对象不为空 + */ + default T assertNotNull(T obj) { + if (ObjectUtil.isEmpty(obj)) { + throw newException(); + } + return obj; + } + + /** + * 断言对象是空 + */ + default void assertIsNull(Object obj) { + if (ObjectUtil.isNotNull(obj)) { + throw newException(); + } + } + + /** + * 断言两个对象不相等 + */ + default void assertNotEquals(Object obj, Object obj1) { + if (ObjectUtil.equal(obj, obj1)) { + throw newException(); + } + } + + + /** + * 断言字符串不为空 + */ + default void assertNotEmptyStr(String str) { + if (StrUtil.isBlank(str)) { + throw newException(); + } + } + + /** + * 断言两个对象相等 + */ + default void assertEquals(Object obj, Object obj1) { + if (ObjectUtil.notEqual(obj, obj1)) { + throw newException(); + } + } + + /** + * 断言true + */ + default void assertIsTrue(boolean expression) { + if (!expression) { + throw newException(); + } + } + + /** + * 断言false + */ + default void assertIsFalse(boolean expression) { + if (expression) { + throw newException(); + } + } + + /** + * 断言int数组范围 + */ + default int assertBetween(int value, int min, int max) { + if (value >= min && value <= max) { + return value; + } + throw newException(); + } + + /** + * 断言long数值范围 + */ + default long assertBetween(long value, long min, long max) { + if (value >= min && value <= max) { + return value; + } + throw newException(); + } + + /** + * 断言double数值范围 + */ + default double assertBetween(double value, double min, double max) { + if (value >= min && value <= max) { + return value; + } + throw newException(); + } + + /** + * 断言int大于数值范围 + */ + default int assertGreaterThan(int value , int min){ + if (value <= min){ + throw newException(); + } + return value; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/BusinessException.java b/fightwine-common/src/main/java/com/yzt/common/exception/BusinessException.java new file mode 100644 index 0000000..e6f9e82 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/BusinessException.java @@ -0,0 +1,22 @@ +package com.yzt.common.exception; + + +import com.yzt.common.result.IResultEnum; + +/** + * 业务异常类 + * + */ +public class BusinessException extends YztException { + + private static final long serialVersionUID = 1L; + + public BusinessException(IResultEnum iResultEnum) { + super(iResultEnum); + } + + public BusinessException(IResultEnum iResultEnum, Throwable throwable) { + super(iResultEnum, throwable); + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/BusinessExceptionAssert.java b/fightwine-common/src/main/java/com/yzt/common/exception/BusinessExceptionAssert.java new file mode 100644 index 0000000..0fb1536 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/BusinessExceptionAssert.java @@ -0,0 +1,17 @@ +package com.yzt.common.exception; + + +import com.yzt.common.result.IResultEnum; + +/** + * 业务异常断言 + * + */ +public interface BusinessExceptionAssert extends IResultEnum, Assert { + + @Override + default YztException newException() { + return new BusinessException(this); + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionCodeEnum.java b/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionCodeEnum.java new file mode 100644 index 0000000..6b21fee --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionCodeEnum.java @@ -0,0 +1,36 @@ +package com.yzt.common.exception; + +/** + * Exception 拦截 + * fw_ + */ +public enum ExceptionCodeEnum implements ExceptionHandler{ + // 数据操作错误定义 + SUCCESS(200, "操作成功"), + FAILED(500, "操作失败"), + PRAM_NOT_MATCH(400, "参数不正确"), + VALIDATE_FAILED(400, "参数检验失败"), + UNAUTHORIZED(401, "未登录或token过期,请登录!"), + FORBIDDEN(403, "没有相关权限"), + NOT_FOUND(404, "没有找到相关数据"), + ERROR(500, "系统异常"), + ; + + private long code; + private String message; + + private ExceptionCodeEnum(long code, String message){ + this.code = code; + this.message = message; + } + + @Override + public long getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionHandler.java b/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionHandler.java new file mode 100644 index 0000000..d68e519 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/ExceptionHandler.java @@ -0,0 +1,12 @@ +package com.yzt.common.exception; + +/** + * Exception 接口定义 + * fw_ + */ +public interface ExceptionHandler { + + long getCode(); + + String getMessage(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/exception/YztException.java b/fightwine-common/src/main/java/com/yzt/common/exception/YztException.java new file mode 100644 index 0000000..4fc9dc4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/exception/YztException.java @@ -0,0 +1,58 @@ +package com.yzt.common.exception; + +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.result.IResultEnum; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * Yzt异常类 + * + */ +@Getter +@Slf4j +@RestControllerAdvice +public class YztException extends RuntimeException { + + private static final long serialVersionUID = 6397082987802748517L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误信息 + */ + private String message; + + public YztException() { + super(); + } + + public YztException(String message) { + super(CommonResultCode.ERROR.getCode() + "-" + message); + this.code = CommonResultCode.ERROR.getCode(); + this.message = message; + } + + public YztException(IResultEnum iResultEnum) { + super(iResultEnum.getCode() + "-" + iResultEnum.getMessage()); + this.code = iResultEnum.getCode(); + this.message = iResultEnum.getMessage(); + } + + public YztException(IResultEnum iResultEnum, String message) { + super(iResultEnum.getCode() + "-" + message); + this.code = iResultEnum.getCode(); + this.message = message; + } + + public YztException(IResultEnum iResultEnum, Throwable throwable) { + super(iResultEnum.getCode() + "-" + iResultEnum.getMessage() + ", " + throwable.getMessage(), throwable); + this.code = iResultEnum.getCode(); + this.message = iResultEnum.getMessage(); + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/interceptor/SwaggerInterceptor.java b/fightwine-common/src/main/java/com/yzt/common/interceptor/SwaggerInterceptor.java new file mode 100644 index 0000000..5568e11 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/interceptor/SwaggerInterceptor.java @@ -0,0 +1,72 @@ +package com.yzt.common.interceptor; + +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Base64; + +/** + * Swagger 文档 + * fw_ + */ +public class SwaggerInterceptor implements HandlerInterceptor { + private String username; + private String password; + private Boolean check; + public SwaggerInterceptor(String username, String password, Boolean check) { + this.username = username; + this.password = password; + this.check = check; + } + + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String authorization = request.getHeader("Authorization"); + boolean isAuthSuccess = httpBasicAuth(authorization); + if (!isAuthSuccess) { + response.setCharacterEncoding("utf-8"); + response.setStatus(401); +// response.setStatus(401,"Unauthorized"); + response.setHeader("WWW-authenticate", "Basic realm=\"Realm\""); + try (PrintWriter writer = response.getWriter()) { + writer.print("Forbidden, unauthorized user"); + } + } + return isAuthSuccess; + } + public boolean httpBasicAuth(String authorization) throws IOException { + if(check){ + if (authorization != null && authorization.split(" ").length == 2) { + String userAndPass = new String(Base64.getDecoder().decode((authorization.split(" ")[1]))); + String username = userAndPass.split(":").length == 2 ? userAndPass.split(":")[0] : null; + String password = userAndPass.split(":").length == 2 ? userAndPass.split(":")[1] : null; + return this.username.equals(username) && this.password.equals(password); + } + return false; + } + return true; + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + String uri = request.getRequestURI(); + AntPathMatcher pathMatcher = new AntPathMatcher(); + if (!pathMatcher.match("/swagger-ui.html", uri) && !pathMatcher.match("/webjars/**", uri)) { + response.setStatus(404); + return; + } + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resources = resolver.getResources("classpath:/META-INF/resources" + uri); + if (resources.length > 0) { + FileCopyUtils.copy(resources[0].getInputStream(), response.getOutputStream()); + } else { + response.setStatus(404); + } + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/acticitystyle/ActivityStyle.java b/fightwine-common/src/main/java/com/yzt/common/model/acticitystyle/ActivityStyle.java new file mode 100644 index 0000000..b7d6602 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/acticitystyle/ActivityStyle.java @@ -0,0 +1,75 @@ +package com.yzt.common.model.acticitystyle; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 活动气氛样式,包含活动边框和活动背景 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_activity_style") +@ApiModel(value="ActivityStyle对象", description="") +public class ActivityStyle implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "活动名称") + private String name; + + @ApiModelProperty(value = "活动类型0=活动边框,1=活动背景") + private Boolean type; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "开始时间") + private Date starttime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "结束时间") + private Date endtime; + + @ApiModelProperty(value = "活动边框素材地址") + private String style; + + @ApiModelProperty(value = "状态 0=关闭1=开启") + private Boolean status; + + @ApiModelProperty(value = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与,4=指定商户产品") + private Integer method; + + @ApiModelProperty(value = "参与活动商品") + private String products; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createtime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private Date updatetime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/article/Article.java b/fightwine-common/src/main/java/com/yzt/common/model/article/Article.java new file mode 100644 index 0000000..678b9c9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/article/Article.java @@ -0,0 +1,96 @@ +package com.yzt.common.model.article; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文章管理表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_article") +@ApiModel(value="Article对象", description="文章管理表") +public class Article implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "文章管理ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "分类id") + private String cid; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章作者") + private String author; + + @ApiModelProperty(value = "文章图片") + private String imageInput; + + @ApiModelProperty(value = "文章简介") + private String synopsis; + + @ApiModelProperty(value = "文章分享标题") + private String shareTitle; + + @ApiModelProperty(value = "文章分享简介") + private String shareSynopsis; + + @ApiModelProperty(value = "浏览次数") + private String visit; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "原文链接") + private String url; + + @ApiModelProperty(value = "微信素材id") + private String mediaId; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "是否隐藏") + private Boolean hide; + + @ApiModelProperty(value = "管理员id") + private Integer adminId; + + @ApiModelProperty(value = "商户id") + private Integer merId; + + @ApiModelProperty(value = "商品关联id") + private Integer productId; + + @ApiModelProperty(value = "是否热门(小程序)") + private Boolean isHot; + + @ApiModelProperty(value = "是否轮播图(小程序)") + private Boolean isBanner; + + @ApiModelProperty(value = "文章内容") + private String content; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargain.java b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargain.java new file mode 100644 index 0000000..d190845 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargain.java @@ -0,0 +1,138 @@ +package com.yzt.common.model.bargain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 砍价表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_bargain") +@ApiModel(value="StoreBargain对象", description="砍价表") +public class StoreBargain implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "砍价商品ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + private String image; + + @ApiModelProperty(value = "单位名称") + private String unitName; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "砍价商品轮播图") + private String images; + + @ApiModelProperty(value = "砍价开启时间") + private Long startTime; + + @ApiModelProperty(value = "砍价结束时间") + private Long stopTime; + + @ApiModelProperty(value = "砍价商品名称") + private String storeName; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal price; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "购买数量限制") + // 单个活动每个用户发起砍价次数限制 + private Integer num; + + @ApiModelProperty(value = "用户每次砍价的最大金额") + private BigDecimal bargainMaxPrice; + + @ApiModelProperty(value = "用户每次砍价的最小金额") + private BigDecimal bargainMinPrice; + + @ApiModelProperty(value = "帮砍次数") + // 单个商品用户可以帮砍的次数,例:次数设置为1,甲和乙同时将商品A的砍价链接发给丙,丙只能帮甲或乙其中一个人砍价 + private Integer bargainNum; + + @ApiModelProperty(value = "砍价状态 0(到砍价时间不自动开启) 1(到砍价时间自动开启时间)") + private Boolean status; + + @ApiModelProperty(value = "反多少积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "砍价活动简介") + private String info = ""; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否推荐0不推荐1推荐") + private Boolean isHot; + + @ApiModelProperty(value = "是否删除 0未删除 1删除") + private Boolean isDel; + + @ApiModelProperty(value = "添加时间") + private Long addTime; + + @ApiModelProperty(value = "是否包邮 0不包邮 1包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "砍价规则") + private String rule; + + @ApiModelProperty(value = "砍价商品浏览量") + private Integer look; + + @ApiModelProperty(value = "砍价商品分享量") + private Integer share; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "帮助砍价好友人数") + private Integer peopleNum; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUser.java b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUser.java new file mode 100644 index 0000000..87698f1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUser.java @@ -0,0 +1,57 @@ +package com.yzt.common.model.bargain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户参与砍价表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_bargain_user") +@ApiModel(value="StoreBargainUser对象", description="用户参与砍价表") +public class StoreBargainUser implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户参与砍价表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "砍价商品id") + private Integer bargainId; + + @ApiModelProperty(value = "砍价的最低价") + private BigDecimal bargainPriceMin; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal bargainPrice; + + @ApiModelProperty(value = "砍掉的价格") + private BigDecimal price; + + @ApiModelProperty(value = "状态 1参与中 2 活动结束参与失败 3活动结束参与成功") + private Integer status; + + @ApiModelProperty(value = "参与时间") + private Long addTime; + + @ApiModelProperty(value = "是否取消") + private Boolean isDel; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUserHelp.java b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUserHelp.java new file mode 100644 index 0000000..13f9f87 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/bargain/StoreBargainUserHelp.java @@ -0,0 +1,59 @@ +package com.yzt.common.model.bargain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 砍价用户帮助表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_bargain_user_help") +@ApiModel(value="StoreBargainUserHelp对象", description="砍价用户帮助表") +public class StoreBargainUserHelp implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "砍价用户帮助表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "帮助的用户id") + private Integer uid; + + @ApiModelProperty(value = "砍价商品ID") + private Integer bargainId; + + @ApiModelProperty(value = "用户参与砍价表id") + private Integer bargainUserId; + + @ApiModelProperty(value = "帮助砍价多少金额") + private BigDecimal price; + + @ApiModelProperty(value = "添加时间") + private Long addTime; + + @ApiModelProperty(value = "用户昵称") + @TableField(exist = false) + private String nickname; + + @ApiModelProperty(value = "用户头像") + @TableField(exist = false) + private String avatar; + + @ApiModelProperty(value = "添加时间(前端用)") + @TableField(exist = false) + private String addTimeStr; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/cat/StoreCart.java b/fightwine-common/src/main/java/com/yzt/common/model/cat/StoreCart.java new file mode 100644 index 0000000..51e5958 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/cat/StoreCart.java @@ -0,0 +1,72 @@ +package com.yzt.common.model.cat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 购物车表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_cart") +@ApiModel(value="StoreCart对象", description="购物车表") +public class StoreCart implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "购物车表ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "类型") + private String type; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "商品属性") + private String productAttrUnique; + + @ApiModelProperty(value = "商品数量") + private Integer cartNum; + + @ApiModelProperty(value = "是否为立即购买") + private Boolean isNew; + + @ApiModelProperty(value = "拼团id") + private Integer combinationId; + + @ApiModelProperty(value = "秒杀商品ID") + private Integer seckillId; + + @ApiModelProperty(value = "砍价id") + private Integer bargainId; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "已添加的商品是否有效状态") + private Boolean status; + + @ApiModelProperty(value = "团长拼团id") + @TableField(exist = false) + private Integer pinkId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/category/Category.java b/fightwine-common/src/main/java/com/yzt/common/model/category/Category.java new file mode 100644 index 0000000..fe235a2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/category/Category.java @@ -0,0 +1,62 @@ +package com.yzt.common.model.category; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 分类表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_category") +@ApiModel(value="Category对象", description="分类表") +public class Category implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "路径") + private String path; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "类型ID | 类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置 ") + private Integer type; + + @ApiModelProperty(value = "地址") + private String url; + + @ApiModelProperty(value = "扩展字段") + private String extra; + + @ApiModelProperty(value = "状态,1正常,0失效") + private Boolean status; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/combination/StoreCombination.java b/fightwine-common/src/main/java/com/yzt/common/model/combination/StoreCombination.java new file mode 100644 index 0000000..cc37ebb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/combination/StoreCombination.java @@ -0,0 +1,139 @@ +package com.yzt.common.model.combination; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 拼团商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_combination") +@ApiModel(value="StoreCombination对象", description="拼团商品表") +public class StoreCombination implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团商品ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "商户id") + private Integer merId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private String images; + + @ApiModelProperty(value = "活动标题") + private String title; + + @ApiModelProperty(value = "活动属性") + private String attr; + + @ApiModelProperty(value = "参团人数") + private Integer people; + + @ApiModelProperty(value = "简介") + private String info = ""; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "添加时间") + private Long addTime; + + @ApiModelProperty(value = "推荐") + private Boolean isHost; + + @ApiModelProperty(value = "商品状态") + private Boolean isShow; + + private Boolean isDel; + + private Boolean combination; + + @ApiModelProperty(value = "商户是否可用1可用0不可用") + private Boolean merUse; + + @ApiModelProperty(value = "是否包邮1是0否") + private Boolean isPostage; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "拼团开始时间") + private Long startTime; + + @ApiModelProperty(value = "拼团结束时间") + private Long stopTime; + + @ApiModelProperty(value = "拼团订单有效时间(小时)") + private Integer effectiveTime; + + @ApiModelProperty(value = "拼图商品成本") + private BigDecimal cost; + + @ApiModelProperty(value = "浏览量") + private Integer browse; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "单次购买数量") + private Integer num; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "每个订单可购买数量") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟成团百分比") + private Integer virtualRation; + + @ApiModelProperty(value = "限量百分比") + @TableField(exist = false) + private Integer quotaPercent; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/combination/StorePink.java b/fightwine-common/src/main/java/com/yzt/common/model/combination/StorePink.java new file mode 100644 index 0000000..5d53311 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/combination/StorePink.java @@ -0,0 +1,98 @@ +package com.yzt.common.model.combination; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 拼团表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_pink") +@ApiModel(value="StorePink对象", description="拼团表") +public class StorePink implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "订单id 生成") + private String orderId; + + @ApiModelProperty(value = "订单id 数据库") + private Integer orderIdKey; + + @ApiModelProperty(value = "购买商品个数") + private Integer totalNum; + + @ApiModelProperty(value = "购买总金额") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "拼团商品id") + private Integer cid; + + @ApiModelProperty(value = "商品id") + private Integer pid; + + @ApiModelProperty(value = "拼图总人数") + private Integer people; + + @ApiModelProperty(value = "拼团商品单价") + private BigDecimal price; + + @ApiModelProperty(value = "开始时间") + private Long addTime; + + @ApiModelProperty(value = "结束时间") + private Long stopTime; + + @ApiModelProperty(value = "团长id 0为团长") + private Integer kId; + + @ApiModelProperty(value = "是否发送模板消息0未发送1已发送") + private Boolean isTpl; + + @ApiModelProperty(value = "是否退款 0未退款 1已退款") + private Boolean isRefund; + + @ApiModelProperty(value = "状态1进行中2已完成3未完成") + private Integer status; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "是否虚拟拼团") + private Boolean is_virtual; + + @ApiModelProperty(value = "队列类型: 1-会员队列, 2-会馆队列") + private Integer queueType; + + @ApiModelProperty(value = "当前队列的排队序号") + private Integer queueNo; + + @ApiModelProperty(value = "排队免单进度(1.00表示100%)") + private BigDecimal queueProgress; + + @ApiModelProperty(value = "排队码编号(年月日时分秒+六位随机数)") + private String queueCode; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCoupon.java b/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCoupon.java new file mode 100644 index 0000000..6a14d59 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCoupon.java @@ -0,0 +1,97 @@ +package com.yzt.common.model.coupon; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠券表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon") +@ApiModel(value="StoreCoupon对象", description="优惠券表") +public class StoreCoupon implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "兑换的优惠券面值") + private BigDecimal money; + + @ApiModelProperty(value = "是否限量, 默认0 不限量, 1限量") + private Boolean isLimited; + + @ApiModelProperty(value = "发放总数") + private Integer total; + + @ApiModelProperty(value = "剩余数量") + private Integer lastTotal; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "主键id 商品id/分类id", required = true) + private String primaryKey; + + @ApiModelProperty(value = "最低消费,0代表不限制") + private BigDecimal minPrice; + + @ApiModelProperty(value = "可领取开始时间") + private Date receiveStartTime; + + @ApiModelProperty(value = "可领取结束时间") + private Date receiveEndTime; + + @ApiModelProperty(value = "是否固定使用时间, 默认0 否, 1是") + private Boolean isFixedTime; + + @ApiModelProperty(value = "可使用时间范围 开始时间") + private Date useStartTime; + + @ApiModelProperty(value = "可使用时间范围 结束时间") + private Date useEndTime; + + @ApiModelProperty(value = "天数") + private Integer day; + + @ApiModelProperty(value = "优惠券类型 1 手动领取, 2 新人券, 3 赠送券") + private Integer type; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态(0:关闭,1:开启)") + private Boolean status; + + @ApiModelProperty(value = "是否删除 状态(0:否,1:是)") + private Boolean isDel; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "是否领取") + @TableField(exist = false) + private Boolean isGet = false; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCouponUser.java b/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCouponUser.java new file mode 100644 index 0000000..c671ae7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/coupon/StoreCouponUser.java @@ -0,0 +1,78 @@ +package com.yzt.common.model.coupon; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠卷记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon_user") +@ApiModel(value="StoreCouponUser对象", description="优惠券记录表") +public class StoreCouponUser implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "优惠券发布id") + private Integer couponId; + + @ApiModelProperty(value = "兑换的项目id") + private Integer cid; + + @ApiModelProperty(value = "领取人id") + private Integer uid; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "优惠券的面值") + private BigDecimal money; + + @ApiModelProperty(value = "最低消费多少金额可用优惠券") + private BigDecimal minPrice; + + @ApiModelProperty(value = "获取方式,send后台发放, 用户领取 get,register用户注册") + private String type; + + @ApiModelProperty(value = "状态(0:未使用,1:已使用, 2:已失效)") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "开始使用时间") + private Date startTime; + + @ApiModelProperty(value = "过期时间") + private Date endTime; + + @ApiModelProperty(value = "使用时间") + private Date useTime; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "主键id 商品id/分类id", required = true) + private String primaryKey; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/exception/ExceptionLog.java b/fightwine-common/src/main/java/com/yzt/common/model/exception/ExceptionLog.java new file mode 100644 index 0000000..9501390 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/exception/ExceptionLog.java @@ -0,0 +1,64 @@ +package com.yzt.common.model.exception; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 异常信息表 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_exception_log") +@ApiModel(value = "ExceptionLog对象", description = "异常信息表") +public class ExceptionLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("异常日志ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("异常的url") + @TableField("exp_url") + private String expUrl; + + @ApiModelProperty("异常的参数") + @TableField("exp_params") + private String expParams; + + @ApiModelProperty("异常的类型") + @TableField("exp_type") + private String expType; + + @ApiModelProperty("异常的类名") + @TableField("exp_controller") + private String expController; + + @ApiModelProperty("异常的方法名") + @TableField("exp_method") + private String expMethod; + + @ApiModelProperty("异常详细信息") + @TableField("exp_detail") + private String expDetail; + + @ApiModelProperty("创建时间") + @TableField("create_time") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/express/Express.java b/fightwine-common/src/main/java/com/yzt/common/model/express/Express.java new file mode 100644 index 0000000..bdbd9b7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/express/Express.java @@ -0,0 +1,63 @@ +package com.yzt.common.model.express; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 快递公司表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_express") +@ApiModel(value="Express对象", description="快递公司表") +public class Express implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "快递公司id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "快递公司简称") + private String code; + + @ApiModelProperty(value = "快递公司全称") + private String name; + + @ApiModelProperty(value = "是否需要月结账号") + private Boolean partnerId; + + @ApiModelProperty(value = "是否需要月结密码") + private Boolean partnerKey; + + @ApiModelProperty(value = "是否需要取件网店") + private Boolean net; + + @ApiModelProperty(value = "账号") + private String account; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "网点名称") + private String netName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否显示") + private Boolean isShow; + + @ApiModelProperty(value = "是否可用") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplates.java b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplates.java new file mode 100644 index 0000000..b2af45a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplates.java @@ -0,0 +1,51 @@ +package com.yzt.common.model.express; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 运费模版对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_shipping_templates") +@ApiModel(value="ShippingTemplates对象", description="") +public class ShippingTemplates implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "编号") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "模板名称") + private String name; + + @ApiModelProperty(value = "计费方式 0(未选择),1(按件数), 2(按重量),3(按体积)") + private Integer type; + + @ApiModelProperty(value = "包邮类型:0-全国包邮,1-部分包邮,2-自定义") + private Integer appoint; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesFree.java b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesFree.java new file mode 100644 index 0000000..8f81eec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesFree.java @@ -0,0 +1,64 @@ +package com.yzt.common.model.express; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 免费运费模版 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_shipping_templates_free") +@ApiModel(value="ShippingTemplatesFree对象", description="") +public class ShippingTemplatesFree implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "编号") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "模板ID") + private Integer tempId; + + @ApiModelProperty(value = "城市ID") + private Integer cityId; + + @ApiModelProperty(value = "描述") + private String title; + + @ApiModelProperty(value = "包邮件数") + private BigDecimal number; + + @ApiModelProperty(value = "包邮金额") + private BigDecimal price; + + @ApiModelProperty(value = "计费方式") + private Integer type; + + @ApiModelProperty(value = "分组唯一值") + private String uniqid; + + @ApiModelProperty(value = "是否无效") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesRegion.java b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesRegion.java new file mode 100644 index 0000000..a0d99fa --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/express/ShippingTemplatesRegion.java @@ -0,0 +1,70 @@ +package com.yzt.common.model.express; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 运费模版区域 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_shipping_templates_region") +@ApiModel(value="ShippingTemplatesRegion对象", description="") +public class ShippingTemplatesRegion implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "编号") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "模板ID") + private Integer tempId; + + @ApiModelProperty(value = "城市ID") + private Integer cityId; + + @ApiModelProperty(value = "描述") + private String title; + + @ApiModelProperty(value = "首件") + private BigDecimal first; + + @ApiModelProperty(value = "首件运费") + private BigDecimal firstPrice; + + @ApiModelProperty(value = "续件") + private BigDecimal renewal; + + @ApiModelProperty(value = "续件运费") + private BigDecimal renewalPrice; + + @ApiModelProperty(value = "计费方式 1按件数 2按重量 3按体积") + private Integer type; + + @ApiModelProperty(value = "分组唯一值") + private String uniqid; + + @ApiModelProperty(value = "是否无效") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/finance/UserExtract.java b/fightwine-common/src/main/java/com/yzt/common/model/finance/UserExtract.java new file mode 100644 index 0000000..d88b75a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/finance/UserExtract.java @@ -0,0 +1,126 @@ +package com.yzt.common.model.finance; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.data.annotation.Transient; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户 提现表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_extract") +@ApiModel(value="UserExtract对象", description="用户提现表") +public class UserExtract implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + private Integer uid; + + @ApiModelProperty(value = "名称") + private String realName; + + @ApiModelProperty(value = "bank = 银行卡 alipay = 支付宝 weixin=微信") + private String extractType; + + @ApiModelProperty(value = "银行卡") + private String bankCode; + + @ApiModelProperty(value = "开户地址") + private String bankAddress; + + @ApiModelProperty(value = "支付宝账号") + private String alipayCode; + + @ApiModelProperty(value = "提现金额") + private BigDecimal extractPrice; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "金额") + private BigDecimal balance; + + @ApiModelProperty(value = "无效原因") + private String failMsg; + + @ApiModelProperty(value = "-1 未通过 0 审核中 1 已提现") + private Integer status; + + @ApiModelProperty(value = "审核管理员ID") + @TableField("audit_admin_id") + private Integer auditAdminId; + + @ApiModelProperty(value = "微信号") + private String wechat; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "失败时间") + private Date failTime; + + @ApiModelProperty(value = "银行名称") + private String bankName; + + @ApiModelProperty(value = "收款二维码地址") + private String qrcodeUrl; + + @ApiModelProperty(value = "转账凭证地址") + @TableField("transfer_voucher_url") + private String transferVoucherUrl; + + @Transient + @TableField(exist = false) + private String nickName; + + @ApiModelProperty(value = "实际到账金额") + private BigDecimal actualAmount; + + @ApiModelProperty(value = "会旅积分金额") + private BigDecimal integralAmount; + + @ApiModelProperty(value = "手机号码") + @Transient + @TableField(exist = false) + private String phone; + + @ApiModelProperty(value = "归属公司名称") + @Transient + @TableField(exist = false) + private String tenantName; + + @ApiModelProperty(value = "身份类型(用户等级)") + @Transient + @TableField(exist = false) + private Integer level; + + @ApiModelProperty(value = "审核时间") + @Transient + @TableField(exist = false) + private Date auditTime; + + @ApiModelProperty(value = "审核人") + @Transient + @TableField(exist = false) + private String auditAdminName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/finance/UserRecharge.java b/fightwine-common/src/main/java/com/yzt/common/model/finance/UserRecharge.java new file mode 100644 index 0000000..c40b78b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/finance/UserRecharge.java @@ -0,0 +1,64 @@ +package com.yzt.common.model.finance; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户充值表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_recharge") +@ApiModel(value="UserRecharge对象", description="用户充值表") +public class UserRecharge implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "充值用户UID") + private Integer uid; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "充值金额") + private BigDecimal price; + + @ApiModelProperty(value = "购买赠送金额") + private BigDecimal givePrice; + + @ApiModelProperty(value = "充值类型") + private String rechargeType; + + @ApiModelProperty(value = "是否充值") + private Boolean paid; + + @ApiModelProperty(value = "充值支付时间") + private Date payTime; + + @ApiModelProperty(value = "充值时间") + private Date createTime; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "是否上传微信发货管理") + private Boolean isWechatShipping; + + @ApiModelProperty(value = "支付服务方订单号") + private String outTradeNo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/log/StoreProductLog.java b/fightwine-common/src/main/java/com/yzt/common/model/log/StoreProductLog.java new file mode 100644 index 0000000..7fd201e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/log/StoreProductLog.java @@ -0,0 +1,75 @@ +package com.yzt.common.model.log; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品统计 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_log") +@ApiModel(value="StoreProductLog对象", description="商品统计") +public class StoreProductLog implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品统计表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "类型visit,cart,order,pay,collect,refund") + private String type; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "是否浏览") + private Boolean visitNum; + + @ApiModelProperty(value = "加入购物车数量") + private Integer cartNum; + + @ApiModelProperty(value = "下单数量") + private Integer orderNum; + + @ApiModelProperty(value = "支付数量") + private Integer payNum; + + @ApiModelProperty(value = "支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "商品成本价") + private BigDecimal costPrice; + + @ApiModelProperty(value = "支付用户ID") + private Integer payUid; + + @ApiModelProperty(value = "退款数量") + private Integer refundNum; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "收藏") + private Boolean collectNum; + + @ApiModelProperty(value = "添加时间") + private Long addTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrder.java b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrder.java new file mode 100644 index 0000000..0abc27e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrder.java @@ -0,0 +1,232 @@ +package com.yzt.common.model.order; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_order") +@ApiModel(value="StoreOrder对象", description="订单表") +public class StoreOrder implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @ApiModelProperty(value = "详细地址") + private String userAddress; + + @ApiModelProperty(value = "运费金额") + private BigDecimal freightPrice; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "订单总价") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "邮费") + private BigDecimal totalPostage; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "抵扣金额") + private BigDecimal deductionPrice; + + @ApiModelProperty(value = "优惠券id") + private Integer couponId; + + @ApiModelProperty(value = "优惠券金额") + private BigDecimal couponPrice; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付时间") + private Date payTime; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer status; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款 3 退款中") + private Integer refundStatus; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "退款用户说明") + private String refundReasonWapExplain; + + @ApiModelProperty(value = "前台退款原因") + private String refundReasonWap; + + @ApiModelProperty(value = "不退款的理由") + private String refundReason; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "退款类型 0=仅退款 1=退货退款") + private Integer refundType; + + @ApiModelProperty(value = "货物状态 0=未收到货 1=已收到货") + private Integer refundGoodsStatus; + + @ApiModelProperty(value = "快递名称/送货人姓名") + private String deliveryName; + + @ApiModelProperty(value = "发货类型 express 发货,send 送货,fictitious虚拟") + private String deliveryType; + + @ApiModelProperty(value = "快递单号/手机号") + private String deliveryId; + + @ApiModelProperty(value = "消费赚取积分") + private Integer gainIntegral; + + @ApiModelProperty(value = "使用积分") + private Integer useIntegral; + + @ApiModelProperty(value = "给用户退了多少积分") + private Integer backIntegral; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "商户ID") + private Integer merId; + + private Integer isMerCheck; + + @ApiModelProperty(value = "拼团商品id0一般商品") + private Integer combinationId; + + @ApiModelProperty(value = "拼团id 0没有拼团") + private Integer pinkId; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "秒杀商品ID") + private Integer seckillId; + + @ApiModelProperty(value = "砍价id") + private Integer bargainId; + + @ApiModelProperty(value = "用户砍价活动id") + private Integer bargainUserId; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + + @ApiModelProperty(value = "店员id") + private Integer clerkId; + + @ApiModelProperty(value = "支付渠道(0-微信公众号,1-微信小程序,2-H5,3-余额,4-微信AppIos,5-微信AppIos安卓,6-支付宝支付,7-支付宝app支付)") + private Integer isChannel; + + @ApiModelProperty(value = "消息提醒") + private Boolean isRemind; + + @ApiModelProperty(value = "后台是否删除") + private Boolean isSystemDel; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "订单完成时间") + private Date finishTime; + + @ApiModelProperty(value = "快递公司简称") + private String deliveryCode; + + @ApiModelProperty(value = "订单类型:0-普通订单,1-视频号订单,2-活动订单") + private Integer type; + + @ApiModelProperty(value = "商品总价") + private BigDecimal proTotalPrice; + + @ApiModelProperty(value = "改价前支付金额") + private BigDecimal beforePayPrice; + + @ApiModelProperty(value = "是否改价,0-否,1-是") + private Boolean isAlterPrice; + + @ApiModelProperty(value = "商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号") + private String outTradeNo; + + @ApiModelProperty(value = "商家寄件单号图片") + private String shipmentPic; + + @ApiModelProperty(value = "商家寄件订单任务id") + private String shipmentTaskId; + + @ApiModelProperty(value = "商家寄件订单单号") + private String shipmentOrderId; + + @ApiModelProperty(value = "商家寄件快递单号") + private String shipmentNum; + + @ApiModelProperty(value = "发货记录类型,1快递、2送货, 3虚拟发货") + private String expressRecordType; + + @ApiModelProperty(value = "虚拟商品备注信息,JSON 格式") + private String virtualRemark; + + @ApiModelProperty(value = "tenantid") + private Long tenantId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInfo.java b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInfo.java new file mode 100644 index 0000000..0649cb3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInfo.java @@ -0,0 +1,94 @@ +package com.yzt.common.model.order; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单购物详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_order_info") +@ApiModel(value="StoreOrderInfo对象", description="订单购物详情表") +public class StoreOrderInfo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "订单id") + private Integer orderId; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "购买东西的详细信息") + private String info; + + @ApiModelProperty(value = "唯一id") + @TableField(value = "`unique`") + private String unique; + + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "商品名称") + private String productName; + + @ApiModelProperty(value = "规格属性id") + private Integer attrValueId; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "sku") + private String sku; + + @ApiModelProperty(value = "单价") + private BigDecimal price; + + @ApiModelProperty(value = "购买数量") + private Integer payNum; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "是否评价") + private Boolean isReply; + + @ApiModelProperty(value = "是否单独分佣") + private Boolean isSub; + + @ApiModelProperty(value = "会员价") + private BigDecimal vipPrice; + + @ApiModelProperty(value = "商品类型:0-普通,1-秒杀,2-砍价,3-拼团,4-视频号") + private Integer productType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInvoice.java b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInvoice.java new file mode 100644 index 0000000..84d1942 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderInvoice.java @@ -0,0 +1,73 @@ +package com.yzt.common.model.order; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单发票表 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_order_invoice") +@ApiModel(value="StoreOrderInvoice对象", description="订单发票表") +public class StoreOrderInvoice implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "发票ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "发票抬头类型:1=个人,2=单位") + private Integer invoiceType; + + @ApiModelProperty(value = "发票抬头(个人名称或单位名称)") + private String invoiceTitle; + + @ApiModelProperty(value = "纳税人识别号(单位必填)") + private String taxNumber; + + @ApiModelProperty(value = "发票内容") + private String invoiceContent; + + @ApiModelProperty(value = "开票状态:0=待开票,1=已开票,2=开票失败") + private Integer invoiceStatus; + + @ApiModelProperty(value = "发票代码") + private String invoiceCode; + + @ApiModelProperty(value = "发票号码") + private String invoiceNumber; + + @ApiModelProperty(value = "电子发票URL") + private String invoiceUrl; + + @ApiModelProperty(value = "开票时间") + private Date invoiceTime; + + @ApiModelProperty(value = "开票金额") + private BigDecimal invoiceAmount; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderStatus.java b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderStatus.java new file mode 100644 index 0000000..e73c78b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/order/StoreOrderStatus.java @@ -0,0 +1,39 @@ +package com.yzt.common.model.order; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 订单操作记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_order_status") +@ApiModel(value="StoreOrderStatus对象", description="订单操作记录表") +public class StoreOrderStatus implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单id") + private Integer oid; + + @ApiModelProperty(value = "操作类型") + private String changeType; + + @ApiModelProperty(value = "操作备注") + private String changeMessage; + + @ApiModelProperty(value = "操作时间") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/page/PageCategory.java b/fightwine-common/src/main/java/com/yzt/common/model/page/PageCategory.java new file mode 100644 index 0000000..371a796 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/page/PageCategory.java @@ -0,0 +1,58 @@ +package com.yzt.common.model.page; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 页面链接分类 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_page_category") +@ApiModel(value="PageCategory对象", description="页面链接分类") +public class PageCategory implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "父类id") + private Integer pid; + + @ApiModelProperty(value = "类型:link、special、product、product_category、custom") + private String type; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "层级 个位数") + private Boolean level; + + @ApiModelProperty(value = "是否商户 0平台,商户id") + private Integer isMer; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/page/PageDiy.java b/fightwine-common/src/main/java/com/yzt/common/model/page/PageDiy.java new file mode 100644 index 0000000..cd88343 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/page/PageDiy.java @@ -0,0 +1,109 @@ +package com.yzt.common.model.page; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * DIY数据表 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_page_diy") +@ApiModel(value="PageDiy对象", description="DIY数据表") +public class PageDiy implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "版本号") + private String version; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "网站标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String coverImage; + + @ApiModelProperty(value = "模板名称") + private String templateName; + + @ApiModelProperty(value = "页面数据") + private String value; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "是否使用") + private Integer status; + + @ApiModelProperty(value = "页面类型") + private Integer type; + + @ApiModelProperty(value = "显示首页") + private Integer isShow; + + @ApiModelProperty(value = "颜色是否选中") + private Integer isBgColor; + + @ApiModelProperty(value = "背景图是否选中") + private Integer isBgPic; + + @ApiModelProperty(value = "是否是diy数据") + private Integer isDiy; + + @ApiModelProperty(value = "背景颜色") + private String colorPicker; + + @ApiModelProperty(value = "背景图") + private String bgPic; + + @ApiModelProperty(value = "背景图图片样式") + private Integer bgTabVal; + + @ApiModelProperty(value = "是否删除") + private Integer isDel; + + @ApiModelProperty(value = "返回地址") + private String returnAddress; + + @ApiModelProperty(value = "标题背景色") + private String titleBgColor; + + @ApiModelProperty(value = "标题颜色") + private String titleColor; + + @ApiModelProperty(value = "商家样式") + private Integer serviceStatus; + + @ApiModelProperty(value = "商户ID") + private Integer merId; + + @ApiModelProperty(value = "默认模板(1.平台默认 2.商户默认)") + private Integer isDefault; + + @ApiModelProperty(value = "标题文本位置") + private Integer textPosition; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/page/PageLink.java b/fightwine-common/src/main/java/com/yzt/common/model/page/PageLink.java new file mode 100644 index 0000000..a52c167 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/page/PageLink.java @@ -0,0 +1,64 @@ +package com.yzt.common.model.page; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 页面链接 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_page_link") +@ApiModel(value="PageLink对象", description="页面链接") +public class PageLink implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "分类id") + private Integer cateId; + + @ApiModelProperty(value = "分组1:基础2:分销3:个人中心") + private Boolean type; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "页面链接") + private String url; + + @ApiModelProperty(value = "参数") + private String param; + + @ApiModelProperty(value = "事例") + private String example; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "1是商户的链接") + private Boolean isMer; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProduct.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProduct.java new file mode 100644 index 0000000..076136e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProduct.java @@ -0,0 +1,166 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product") +@ApiModel(value = "StoreProduct对象", description = "商品表") +public class StoreProduct implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)") + private Integer merId; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "轮播图") + private String sliderImage; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "商品简介") + private String storeInfo = ""; + + @ApiModelProperty(value = "关键字") + private String keyword; + + @ApiModelProperty(value = "商品条码(一维码)") + private String barCode; + + @ApiModelProperty(value = "分类id") + private String cateId; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "会员价格") + private BigDecimal vipPrice; + + @ApiModelProperty(value = "市场价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "状态(0:未上架,1:上架)") + private Boolean isShow; + + @ApiModelProperty(value = "是否热卖") + private Boolean isHot; + + @ApiModelProperty(value = "是否优惠") + private Boolean isBenefit; + + @ApiModelProperty(value = "是否精品") + private Boolean isBest; + + @ApiModelProperty(value = "是否新品") + private Boolean isNew; + + @ApiModelProperty(value = "添加时间") + private Integer addTime; + + @ApiModelProperty(value = "是否包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "是否回收站") + private Boolean isRecycle; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "商户是否代理 0不可代理1可代理") + private Boolean merUse; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "秒杀状态 0 未开启 1已开启") + private Boolean isSeckill; + + @ApiModelProperty(value = "砍价状态 0未开启 1开启") + private Boolean isBargain; + + @ApiModelProperty(value = "是否优品推荐") + private Boolean isGood; + + @ApiModelProperty(value = "是否单独分佣") + private Boolean isSub; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "浏览量") + private Integer browse; + + @ApiModelProperty(value = "商品二维码地址(用户小程序海报)") + private String codePath; + + @ApiModelProperty(value = "淘宝京东1688类型") + private String soureLink; + + @ApiModelProperty(value = "主图视频链接") + private String videoLink; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "规格 0单 1多") + private Boolean specType; + + @ApiModelProperty(value = "活动显示排序0=默认,1=秒杀,2=砍价,3=拼团") + private String activity; + + @ApiModelProperty(value = "展示图") + private String flatPattern; + + @ApiModelProperty(value = "商品详情") + @TableField(exist = false) + private String content; + + @ApiModelProperty(value = "并发版本控制") + private Integer version; + + @ApiModelProperty(value = "活动边框 列表中是边框 详情中是背景图") + @TableField(exist = false) + private String activityStyle; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttr.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttr.java new file mode 100644 index 0000000..ed36daa --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttr.java @@ -0,0 +1,45 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品属性表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_attr") +@ApiModel(value="StoreProductAttr对象", description="商品属性表") +public class StoreProductAttr implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "attrId") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "属性名") + private String attrName; + + @ApiModelProperty(value = "属性值") + private String attrValues; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + @ApiModelProperty(value = "是否删除,0-否,1-是") + private Boolean isDel; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrResult.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrResult.java new file mode 100644 index 0000000..383b64e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrResult.java @@ -0,0 +1,41 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品属性详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_attr_result") +@ApiModel(value="StoreProductAttrResult对象", description="商品属性详情表") +public class StoreProductAttrResult implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "商品属性参数") + private String result; + + @ApiModelProperty(value = "上次修改时间") + private Integer changeTime; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrValue.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrValue.java new file mode 100644 index 0000000..adba753 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductAttrValue.java @@ -0,0 +1,93 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品属性值表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_attr_value") +@ApiModel(value="StoreProductAttrValue对象", description="商品属性值表") +public class StoreProductAttrValue implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "attrId") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "商品属性索引值 (attr_value|attr_value[|....])") + private String suk; + + @ApiModelProperty(value = "属性对应的库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "属性金额") + private BigDecimal price; + + @ApiModelProperty(value = "图片") + private String image; + + @TableField(value = "`unique`") + @ApiModelProperty(value = "唯一值") + private String unique; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "商品条码") + private String barCode; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "一级返佣") + private BigDecimal brokerage; + + @ApiModelProperty(value = "二级返佣") + private BigDecimal brokerageTwo; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + @ApiModelProperty(value = "活动限购数量") + private Integer quota; + + @ApiModelProperty(value = "活动限购数量显示") + private Integer quotaShow; + + @ApiModelProperty(value = "产品属性值和属性名对应关系") + private String attrValue; + + @ApiModelProperty(value = "是否删除,0-否,1-是") + private Boolean isDel; + + @ApiModelProperty(value = "并发版本控制") + private Integer version; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductCoupon.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductCoupon.java new file mode 100644 index 0000000..1b5fef4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductCoupon.java @@ -0,0 +1,49 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品优惠券 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_coupon") +@ApiModel(value="StoreProductCoupon对象", description="") +public class StoreProductCoupon implements Serializable { + + private static final long serialVersionUID=1L; + + public StoreProductCoupon() { + } + + public StoreProductCoupon(Integer productId, Integer issueCouponId, Integer addTime) { + this.productId = productId; + this.issueCouponId = issueCouponId; + this.addTime = addTime; + } + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "优惠劵id") + private Integer issueCouponId; + + @ApiModelProperty(value = "添加时间") + private Integer addTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductDescription.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductDescription.java new file mode 100644 index 0000000..6415137 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductDescription.java @@ -0,0 +1,40 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品描述表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_description") +@ApiModel(value="StoreProductDescription对象", description="商品描述表") +public class StoreProductDescription implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "商品详情") + private String description; + + @ApiModelProperty(value = "商品类型") + private Integer type; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRelation.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRelation.java new file mode 100644 index 0000000..10e5da3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRelation.java @@ -0,0 +1,50 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 商品点赞和收藏表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_relation") +@ApiModel(value="StoreProductRelation对象", description="商品点赞和收藏表") +public class StoreProductRelation implements Serializable { + + private static final long serialVersionUID=1L; + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "类型(收藏(collect)、点赞(like))") + private String type = "collect"; + + @ApiModelProperty(value = "某种类型的商品(普通商品、秒杀商品)") + private String category; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductReply.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductReply.java new file mode 100644 index 0000000..611312b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductReply.java @@ -0,0 +1,87 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 评论表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_reply") +@ApiModel(value="StoreProductReply对象", description="评论表") +public class StoreProductReply implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "评论ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "订单ID") + private Integer oid; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "商品 属性id") + @TableField(value = "`unique`") + private String unique; + + @ApiModelProperty(value = "某种商品类型(普通商品、秒杀商品)") + private String replyType; + + @ApiModelProperty(value = "商品分数") + private Integer productScore; + + @ApiModelProperty(value = "服务分数") + private Integer serviceScore; + + @ApiModelProperty(value = "评论内容") + private String comment; + + @ApiModelProperty(value = "评论图片") + private String pics; + + @ApiModelProperty(value = "管理员回复内容") + private String merchantReplyContent; + + @ApiModelProperty(value = "管理员回复时间") + private Integer merchantReplyTime; + + @ApiModelProperty(value = "0未删除1已删除") + private Boolean isDel; + + @ApiModelProperty(value = "0未回复1已回复") + private Boolean isReply; + + @ApiModelProperty(value = "用户名称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "评论时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "商品规格属性值") + private String sku; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRule.java b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRule.java new file mode 100644 index 0000000..118d7c1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/product/StoreProductRule.java @@ -0,0 +1,37 @@ +package com.yzt.common.model.product; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品规则值(规格)表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_rule") +@ApiModel(value="StoreProductRule对象", description="商品规则值(规格)表") +public class StoreProductRule implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "规格名称") + private String ruleName; + + @ApiModelProperty(value = "规格值") + private String ruleValue; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/record/UserVisitRecord.java b/fightwine-common/src/main/java/com/yzt/common/model/record/UserVisitRecord.java new file mode 100644 index 0000000..3f8e250 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/record/UserVisitRecord.java @@ -0,0 +1,40 @@ +package com.yzt.common.model.record; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户访问记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_visit_record") +@ApiModel(value="UserVisitRecord对象", description="用户访问记录表") +public class UserVisitRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "日期") + private String date; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "访问类型:1-首页,2-详情页,3-营销活动详情页,4-个人中心") + private Integer visitType; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckill.java b/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckill.java new file mode 100644 index 0000000..20c22c2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckill.java @@ -0,0 +1,124 @@ +package com.yzt.common.model.seckill; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品秒杀产品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_seckill") +@ApiModel(value="StoreSeckill对象", description="商品秒杀产品表") +public class StoreSeckill implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品秒杀产品表id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private String images; + + @ApiModelProperty(value = "活动标题") + private String title; + + @ApiModelProperty(value = "简介") + private String info = ""; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "成本") + private BigDecimal cost; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "返多少积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "内容") + private String description; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date stopTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "秒杀状态 0=关闭 1=开启") + private Integer status; + + @ApiModelProperty(value = "是否包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "删除 0未删除1已删除") + private Boolean isDel; + + @ApiModelProperty(value = "最多秒杀几个") + private Integer num; + + @ApiModelProperty(value = "显示") + private Boolean isShow; + + @ApiModelProperty(value = "时间段ID") + private Integer timeId; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "限购总数 随销量递减") + private Integer quota; + + @ApiModelProperty(value = "限购总数显示 不变") + private Integer quotaShow; + + @ApiModelProperty(value = "规格 0单 1多") + private Boolean specType; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckillManger.java b/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckillManger.java new file mode 100644 index 0000000..ad37b6e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/seckill/StoreSeckillManger.java @@ -0,0 +1,62 @@ +package com.yzt.common.model.seckill; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 商品秒杀管理表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_seckill_manger") +@ApiModel(value="StoreSeckillManger对象", description="商品秒杀管理表") +public class StoreSeckillManger implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "秒杀名称") + private String name; + + @ApiModelProperty(value = "秒杀开始时间段") + private Integer startTime; + + @ApiModelProperty(value = "秒杀结束时间段") + private Integer endTime; + + @ApiModelProperty(value = "主图") + private String img; + + @ApiModelProperty(value = "轮播图") + private String silderImgs; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态 '0'=关闭 '1'=开启") + private String status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "0未删除1已删除") + private Boolean isDel; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsRecord.java b/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsRecord.java new file mode 100644 index 0000000..efa29ad --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsRecord.java @@ -0,0 +1,58 @@ +package com.yzt.common.model.sms; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 短信发送记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_sms_record") +@ApiModel(value="SmsRecord对象", description="短信发送记录表") +public class SmsRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "短信发送记录编号") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "短信平台账号") + private String uid; + + @ApiModelProperty(value = "接受短信的手机号") + private String phone; + + @ApiModelProperty(value = "短信内容") + private String content; + + @ApiModelProperty(value = "添加记录ip") + private String addIp; + + @ApiModelProperty(value = "短信模板ID") + private String template; + + @ApiModelProperty(value = "状态码 100=成功,130=失败,131=空号,132=停机,133=关机,134=无状态") + private Integer resultcode; + + @ApiModelProperty(value = "发送记录id") + private Integer recordId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "备注") + private String memo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsTemplate.java b/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsTemplate.java new file mode 100644 index 0000000..39bf951 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/sms/SmsTemplate.java @@ -0,0 +1,57 @@ +package com.yzt.common.model.sms; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 短信模板表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_sms_template") +@ApiModel(value="SmsTemplate对象", description="短信模板表") +public class SmsTemplate implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "短信模板id") + private String tempId; + + @ApiModelProperty(value = "模板类型") + private Integer tempType; + + @ApiModelProperty(value = "模板说明") + private String title; + + @ApiModelProperty(value = "类型") + private String type; + + @ApiModelProperty(value = "模板编号") + private String tempKey; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "短息内容") + private String content; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/OssSetting.java b/fightwine-common/src/main/java/com/yzt/common/model/system/OssSetting.java new file mode 100644 index 0000000..2da9c43 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/OssSetting.java @@ -0,0 +1,121 @@ +package com.yzt.common.model.system; + +import cn.hutool.core.util.StrUtil; +import com.yzt.common.enums.OssEnum; +import lombok.Data; + +import java.io.Serializable; + +/** + * OSS设置 + * + */ + +@Data +public class OssSetting implements Serializable { + + private static final long serialVersionUID = 2975271656230801861L; + + /** + * oss类型 + */ + private String type; + + /** + * 阿里云-域名 + */ + private String aliyunOSSEndPoint = ""; + /** + * 阿里云-储存空间 + */ + private String aliyunOSSBucketName = ""; +// /** +// * 阿里云-存放路径路径 +// */ +// private String aliyunOSSPicLocation = ""; + /** + * 阿里云-密钥id + */ + private String aliyunOSSAccessKeyId = ""; + /** + * 阿里云-密钥 + */ + private String aliyunOSSAccessKeySecret = ""; + + + /** + * minio服务地址 + */ + private String m_endpoint; + + /** + * minio 前端请求地址 + */ + private String m_frontUrl; + + /** + * minio用户名 + */ + private String m_accessKey; + + /** + * minio密码 + */ + private String m_secretKey; + + /** + * minio bucket名称 + */ + private String m_bucketName; + + + /** + * 华为云-发起者的Access Key + * + * @return + */ + + String huaweicloudOBSAccessKey; + /** + * 华为云-密钥 + */ + String huaweicloudOBSSecretKey; + /** + * 华为云OBS-节点 + */ + String huaweicloudOBSEndPoint; + + /** + * 华为云OBS-桶 + */ + private String huaweicloudOBSBucketName = ""; + + /** + * 腾讯云 用户的 SecretId + */ + String tencentCOSSecretId; + /** + * 腾讯云 用户的 SecretKey + */ + String tencentCOSSecretKey; + /** + * 腾讯云 bucket 的地域 + */ + String tencentCOSRegion; + /** + * 腾讯云 bucket + */ + String tencentCOSBucket; + /** + * 腾讯云-域名 + */ + private String tencentCOSEndPoint = ""; + + public String getType() { + //默认给阿里云oss存储类型 + if (StrUtil.isEmpty(type)) { + return OssEnum.ALI_OSS.name(); + } + return type; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SmsSetting.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SmsSetting.java new file mode 100644 index 0000000..76688d3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SmsSetting.java @@ -0,0 +1,90 @@ +package com.yzt.common.model.system; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 短信配置 + * 这里在前台不做调整,方便客户直接把服务商的内容配置在我们平台 + * + * @author Chopper + * @since 2020/11/30 15:23 + */ +@Data +public class SmsSetting implements Serializable { + + /** + * 类型 + */ + private String type; + /** + * 是否测试模式 + */ + private Boolean isTestModel; + /** + * 登录短信模板CODE + */ + private String loginTemplateCode; + /** + * 注册短信模板CODE + */ + private String registerTemplateCode; + /** + * 找回密码短信模板CODE + */ + private String findPasswordTemplateCode; + /** + * 设置密码短信模板CODE + */ + private String walletPasswordTemplateCode; + /** + * 支付密码短信模板CODE + */ + private String payPasswordTemplateCode; + + /** + * key + */ + private String accessKeyId; + /** + * 密钥 + */ + private String accessSecret; + /** + * 签名 + */ + private String signName; + + + /** + * 腾讯云 用户的 SecretId + */ + String tencentSecretId; + /** + * 腾讯云 用户的 SecretKey + */ + String tencentSecretKey; + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + String tencentSdkAppId; + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + String tencentSignName; + + /** + * 华为 APP_Key + */ + String huaweiAppKey; + /** + * 华为 APP_Secret + */ + String huaweiAppSecret; + + /** + * 国内短信签名通道号或国际/港澳台短信通道号 + */ + String huaweiSender; + /** + * 签名名称 + */ + String huaweiSignature; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAdmin.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAdmin.java new file mode 100644 index 0000000..8d74458 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAdmin.java @@ -0,0 +1,73 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 后台管理员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_admin") +@ApiModel(value="SystemAdmin对象", description="后台管理员表") +public class SystemAdmin implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "后台管理员表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "后台管理员账号") + private String account; + + @ApiModelProperty(value = "后台管理员密码") + private String pwd; + + @ApiModelProperty(value = "后台管理员姓名") + private String realName; + + @ApiModelProperty(value = "后台管理员权限(menus_id)") + private String roles; + + @ApiModelProperty(value = "后台管理员最后一次登录ip") + private String lastIp; + + @ApiModelProperty(value = "后台管理员最后一次登录时间") + private Date updateTime; + + @ApiModelProperty(value = "后台管理员添加时间") + private Date createTime; + + @ApiModelProperty(value = "后台管理员级别") + private Integer level; + + @ApiModelProperty(value = "后台管理员状态 1有效0无效") + private Boolean status; + + @ApiModelProperty(value = "是否删除 1是0否") + private Boolean isDel; + + @ApiModelProperty(value = "登录次数") + private Integer loginCount; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; + + @ApiModelProperty(value = "tenantid") + private Long tenantId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAttachment.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAttachment.java new file mode 100644 index 0000000..7b69de4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemAttachment.java @@ -0,0 +1,58 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 附件管理表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_attachment") +@ApiModel(value="SystemAttachment对象", description="附件管理表") +public class SystemAttachment implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "att_id", type = IdType.AUTO) + private Integer attId; + + @ApiModelProperty(value = "附件名称") + private String name; + + @ApiModelProperty(value = "附件路径") + private String attDir; + + @ApiModelProperty(value = "压缩图片路径") + private String sattDir; + + @ApiModelProperty(value = "附件大小") + private String attSize; + + @ApiModelProperty(value = "附件类型") + private String attType; + + @ApiModelProperty(value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列") + private Integer pid; + + @ApiModelProperty(value = "图片上传类型 1本地 2七牛云 3OSS 4COS ") + private Integer imageType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemBank.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemBank.java new file mode 100644 index 0000000..c7f1c49 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemBank.java @@ -0,0 +1,39 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_bank") +@ApiModel(value="SystemBank对象", description="银行表") +public class SystemBank { + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("银行编码") + @TableField("bank_code") + private String bankCode; + + @ApiModelProperty("银行名称") + @TableField("bank_name") + private String bankName; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemCity.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemCity.java new file mode 100644 index 0000000..18ef09c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemCity.java @@ -0,0 +1,64 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 城市表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_city") +@ApiModel(value="SystemCity对象", description="城市表") +public class SystemCity implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "城市id") + private Integer cityId; + + @ApiModelProperty(value = "省市级别") + private Integer level; + + @ApiModelProperty(value = "父级id") + private Integer parentId; + + @ApiModelProperty(value = "区号") + private String areaCode; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "合并名称") + private String mergerName; + + @ApiModelProperty(value = "经度") + private String lng; + + @ApiModelProperty(value = "纬度") + private String lat; + + @ApiModelProperty(value = "是否展示") + private Boolean isShow; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemConfig.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemConfig.java new file mode 100644 index 0000000..72acc17 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemConfig.java @@ -0,0 +1,52 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 配置表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_config") +@ApiModel(value="SystemConfig对象", description="配置表") +public class SystemConfig implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "配置id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "字段名称") + private String name; + + @ApiModelProperty(value = "字段提示文字") + private String title; + + @ApiModelProperty(value = "表单id") + private Integer formId; + + @ApiModelProperty(value = "值") + private String value; + + @ApiModelProperty(value = "是否隐藏") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemFormTemp.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemFormTemp.java new file mode 100644 index 0000000..1d2033a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemFormTemp.java @@ -0,0 +1,48 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 表单模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_form_temp") +@ApiModel(value="SystemFormTemp对象", description="表单模板") +public class SystemFormTemp implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "表单模板id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "表单名称") + private String name; + + @ApiModelProperty(value = "表单简介") + private String info; + + @ApiModelProperty(value = "表单内容") + private String content; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroup.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroup.java new file mode 100644 index 0000000..b92dc9a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroup.java @@ -0,0 +1,48 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 组合数据表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group") +@ApiModel(value="SystemGroup对象", description="组合数据表") +public class SystemGroup implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "组合数据ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "数据组名称") + private String name; + + @ApiModelProperty(value = "简介") + private String info; + + @ApiModelProperty(value = "form 表单 id") + private Integer formId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroupData.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroupData.java new file mode 100644 index 0000000..4330b3a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemGroupData.java @@ -0,0 +1,51 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 组合数据详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group_data") +@ApiModel(value="SystemGroupData对象", description="组合数据详情表") +public class SystemGroupData implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "组合数据详情ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "对应的数据组id") + private Integer gid; + + @ApiModelProperty(value = "数据组对应的数据值(json数据)") + private String value; + + @ApiModelProperty(value = "数据排序") + private Integer sort; + + @ApiModelProperty(value = "状态(1:开启;0:关闭;)") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemMenu.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemMenu.java new file mode 100644 index 0000000..1d86e9f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemMenu.java @@ -0,0 +1,68 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统菜单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_menu") +@ApiModel(value="SystemMenu对象", description="系统菜单表") +public class SystemMenu implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "icon") + private String icon; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "组件路径") + private String component; + + @ApiModelProperty(value = "类型,M-目录,C-菜单,A-按钮") + private String menuType; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "显示状态") + private Boolean isShow; + + @ApiModelProperty(value = "是否删除") + @JsonIgnore + private Boolean isDelte; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + @JsonIgnore + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemNotification.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemNotification.java new file mode 100644 index 0000000..345b50d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemNotification.java @@ -0,0 +1,66 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 通知设置表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_notification") +@ApiModel(value="SystemNotification对象", description="通知设置表") +public class SystemNotification implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "标识") + private String mark; + + @ApiModelProperty(value = "通知类型") + private String type; + + @ApiModelProperty(value = "通知场景说明") + private String description; + + @ApiModelProperty(value = "公众号模板消息(0:不存在,1:开启,2:关闭)") + private Integer isWechat; + + @ApiModelProperty(value = "模板消息id") + private Integer wechatId; + + @ApiModelProperty(value = "小程序订阅消息(0:不存在,1:开启,2:关闭)") + private Integer isRoutine; + + @ApiModelProperty(value = "订阅消息id") + private Integer routineId; + + @ApiModelProperty(value = "发送短信(0:不存在,1:开启,2:关闭)") + private Integer isSms; + + @ApiModelProperty(value = "短信id") + private Integer smsId; + + @ApiModelProperty(value = "发送类型(1:用户,2:管理员)") + private Integer sendType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemPermissions.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemPermissions.java new file mode 100644 index 0000000..835b3ff --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemPermissions.java @@ -0,0 +1,48 @@ +package com.yzt.common.model.system; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * 系统权限表 + *

+ * + * @author HZW + * @since 2021-11-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +//@TableName("fw_system_permissions") +@ApiModel(value="SystemPermissions对象", description="系统权限表") +public class SystemPermissions implements Serializable { + + private static final long serialVersionUID=1L; + +// @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "权限名称") + private String name; + + @ApiModelProperty(value = "权限地址") + private String path; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否删除") + private Boolean isDelte; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRole.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRole.java new file mode 100644 index 0000000..03a1711 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRole.java @@ -0,0 +1,49 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 身份管理表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_role") +@ApiModel(value="SystemRole对象", description="身份管理表") +public class SystemRole implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "身份管理id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "身份管理名称") + private String roleName; + + @ApiModelProperty(value = "身份管理权限(menus_id)") + private String rules; + + private Integer level; + + @ApiModelProperty(value = "状态:0-关闭,1-正常") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRoleMenu.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRoleMenu.java new file mode 100644 index 0000000..c3af19a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemRoleMenu.java @@ -0,0 +1,32 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 角色菜单关联表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_role_menu") +@ApiModel(value="SystemRoleMenu对象", description="角色菜单关联表") +public class SystemRoleMenu implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "角色id") + private Integer rid; + + @ApiModelProperty(value = "权限id") + private Integer menuId; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStore.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStore.java new file mode 100644 index 0000000..c038d7a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStore.java @@ -0,0 +1,74 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门店自提 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store") +@ApiModel(value="SystemStore对象", description="门店自提") +public class SystemStore implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "门店名称") + private String name; + + @ApiModelProperty(value = "简介") + private String introduction; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "省市区") + private String address; + + @ApiModelProperty(value = "详细地址") + private String detailedAddress; + + @ApiModelProperty(value = "门店logo") + private String image; + + @ApiModelProperty(value = "纬度") + private String latitude; + + @ApiModelProperty(value = "经度") + private String longitude; + + @ApiModelProperty(value = "核销有效日期") + private String validTime; + + @ApiModelProperty(value = "每日营业开关时间") + private String dayTime; + + @ApiModelProperty(value = "是否显示") + private Boolean isShow; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStoreStaff.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStoreStaff.java new file mode 100644 index 0000000..89be47c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemStoreStaff.java @@ -0,0 +1,57 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门店店员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store_staff") +@ApiModel(value="SystemStoreStaff对象", description="门店店员表") +public class SystemStoreStaff implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "微信用户id") + private Integer uid; + + @ApiModelProperty(value = "店员头像") + private String avatar; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "店员名称") + private String staffName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "核销开关") + private Integer verifyStatus; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/SystemUserLevel.java b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemUserLevel.java new file mode 100644 index 0000000..d367c42 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/SystemUserLevel.java @@ -0,0 +1,57 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户等级表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_user_level") +@ApiModel(value="SystemUserLevel对象", description="用户等级表") +public class SystemUserLevel implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "会员名称") + private String name; + + @ApiModelProperty(value = "购买金额|经验达到") + private Integer experience; + + @ApiModelProperty(value = "是否显示 1=显示,0=隐藏") + private Boolean isShow; + + @ApiModelProperty(value = "会员等级") + private Integer grade; + + @ApiModelProperty(value = "享受折扣") + private Integer discount; + + @ApiModelProperty(value = "会员图标") + private String icon; + + @ApiModelProperty(value = "是否删除.1=删除,0=未删除") + private Boolean isDel; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/system/Tenant.java b/fightwine-common/src/main/java/com/yzt/common/model/system/Tenant.java new file mode 100644 index 0000000..3af2c77 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/system/Tenant.java @@ -0,0 +1,120 @@ +package com.yzt.common.model.system; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +@Getter +@Setter +@TableName("fw_tenant") +@ApiModel(value = "Tenant对象", description = "租户表") +public class Tenant { + + @TableId("tenant_id") + private Long tenantId; + + @ApiModelProperty("租户名称") + @TableField("tenant_name") + private String tenantName; + + @ApiModelProperty("租户名称(英文)") + @TableField("tenant_name_en") + private String tenantNameEn; + + @ApiModelProperty("租户简介") + private String introduction; + + @ApiModelProperty("协助内容") + private String helpContent; + + @ApiModelProperty("租户编码") + @TableField("code") + private String code; + + @ApiModelProperty("营业执照") + @TableField("credit_code") + private String creditCode; + + @ApiModelProperty("法人") + @TableField("person") + private String person; + + @ApiModelProperty("营业执照") + @TableField("license_url") + private String licenseUrl; + + @ApiModelProperty("地址") + @TableField("address") + private String address; + + @ApiModelProperty("地址(英文)") + @TableField("address_en") + private String addressEn; + + @ApiModelProperty("用户数量") + @TableField("user_count") + private Integer userCount; + + @ApiModelProperty("企业logo") + @TableField("logo") + private String logo; + + @ApiModelProperty("有效期") + @TableField("expire_date") + private LocalDate expireDate; + + @ApiModelProperty("业务员(后台员工)") + @TableField("business_staff") + private Long businessStaff; + + @ApiModelProperty("是否删除 0未删除 1已删除") + @TableField(value = "is_del", fill = FieldFill.INSERT) + private Integer isDel; + + @ApiModelProperty("创建时间") + @TableField(value = "created_time", fill = FieldFill.INSERT) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + + @ApiModelProperty("创建人") + @TableField(value = "created_by", fill = FieldFill.INSERT) + private Integer createdBy; + + @ApiModelProperty("修改时间") + @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + @ApiModelProperty("修改人") + @TableField(value = "updated_by", fill = FieldFill.INSERT_UPDATE) + private Integer updatedBy; + + @ApiModelProperty("状态 1正常 0停用/废弃") + @TableField(value = "status") + private Integer status; + + @ApiModelProperty("收款码") + private String wechatPayQrUrl; + + @ApiModelProperty("公司电话") + private String phone; + + @ApiModelProperty(value = "等级名称") + @TableField("level_name") + private String levelName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/User.java b/fightwine-common/src/main/java/com/yzt/common/model/user/User.java new file mode 100644 index 0000000..0bf6c6d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/User.java @@ -0,0 +1,167 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user") +@ApiModel(value="User对象", description="用户表") +public class User implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户id") + @TableId(value = "uid", type = IdType.AUTO) + private Integer uid; + + @ApiModelProperty(value = "用户账号") + private String account; + + @ApiModelProperty(value = "用户密码") + @JsonIgnore + private String pwd; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "身份证号码") + private String cardId; + + @ApiModelProperty(value = "用户备注") + private String mark; + + @ApiModelProperty(value = "合伙人id") + private Integer partnerId; + + @ApiModelProperty(value = "用户分组id") + private String groupId; + + @ApiModelProperty(value = "用户标签id") + private String tagId; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "性别") + private int sex; + + @ApiModelProperty(value = "国家") + private String country; + + @ApiModelProperty(value = "添加ip") + private String addIp; + + @ApiModelProperty(value = "最后一次登录ip") + private String lastIp; + + @ApiModelProperty(value = "用户余额") + private BigDecimal nowMoney; + + @ApiModelProperty(value = "佣金金额") + private BigDecimal brokeragePrice; + + @ApiModelProperty(value = "用户剩余积分") + private java.math.BigDecimal integral; + + @ApiModelProperty(value = "用户剩余经验") + private Integer experience; + + @ApiModelProperty(value = "连续签到天数") + private Integer signNum; + + @ApiModelProperty(value = "1为正常,0为禁止") + private Boolean status; + + @ApiModelProperty(value = "等级") + private Integer level; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "推广员关联时间") + private Date spreadTime; + + @ApiModelProperty(value = "用户类型") + private String userType; + + @ApiModelProperty(value = "是否为推广员") + private Boolean isPromoter; + + @ApiModelProperty(value = "用户购买次数") + private Integer payCount; + + @ApiModelProperty(value = "下级人数") + private Integer spreadCount; + + @ApiModelProperty(value = "详细地址") + private String addres; + + @ApiModelProperty(value = "管理员编号 ") + private Integer adminid; + + @ApiModelProperty(value = "用户登陆类型,h5,wechat,routine") + private String loginType; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "最后一次登录时间") + private Date lastLoginTime; + + @ApiModelProperty(value = "最后一次登录时间") + private Date cleanTime; + + @ApiModelProperty(value = "用户推广等级") + private String path; + + @ApiModelProperty(value = "是否关注公众号") + private Boolean subscribe; + + @ApiModelProperty(value = "成为分销员时间") + private Date promoterTime; + + @ApiModelProperty(value = "tenantid") + private Long tenantId; + + @ApiModelProperty(value = "交易密码") + @JsonIgnore + private String tradePassword; + +// @ApiModelProperty(value = "用户累计收益") +// private BigDecimal totalCommission; + @ApiModelProperty(value = "机构名称") + private String orgName; + + @ApiModelProperty(value = "是否可以更改上级经销商") + private Boolean canChange; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserAddress.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserAddress.java new file mode 100644 index 0000000..f88100e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserAddress.java @@ -0,0 +1,84 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户地址表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_address") +@ApiModel(value="UserAddress对象", description="用户地址表") +public class UserAddress implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户地址id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "收货人姓名") + private String realName; + + @ApiModelProperty(value = "收货人电话") + private String phone; + + @ApiModelProperty(value = "收货人所在省") + private String province; + + @ApiModelProperty(value = "收货人所在市") + private String city; + + @ApiModelProperty(value = "城市id") + private Integer cityId; + + @ApiModelProperty(value = "收货人所在区") + private String district; + + @ApiModelProperty(value = "收货人详细地址") + private String detail; + + @ApiModelProperty(value = "邮编") + private Integer postCode; + + @ApiModelProperty(value = "经度") + private String longitude; + + @ApiModelProperty(value = "纬度") + private String latitude; + + @ApiModelProperty(value = "是否默认") + private Boolean isDefault; + + @TableLogic + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "性别") + private int sex; + + @ApiModelProperty(value = "客户类型") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserBankCard.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBankCard.java new file mode 100644 index 0000000..1823cff --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBankCard.java @@ -0,0 +1,81 @@ +package com.yzt.common.model.user; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 用户银行卡表 + */ +@Data +@Accessors(chain = true) +@TableName("fw_user_bank_card") +@ApiModel(value="UserBankCard对象", description="用户银行卡") +public class UserBankCard { + /** + * 银行卡ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + private Integer uid; + + /** + * 持卡人姓名 + */ + private String holderName; + + /** + * 绑定手机号 + */ + private String phone; + + /** + * 开户行 + */ + private String bankName; + + /** + * 银行编码 + */ + private String bankCode; + + /** + * 银行卡号 + */ + private String cardNo; + + /** + * 是否默认银行卡:0-否,1-是 + */ + private Boolean isDefault; + + /** + * 是否删除:0-正常,1-已删除 + */ + private Boolean isDel; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserBill.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBill.java new file mode 100644 index 0000000..73a9975 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBill.java @@ -0,0 +1,74 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户账单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_bill") +@ApiModel(value="UserBill对象", description="用户账单表") +public class UserBill implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户账单id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id") + private String linkId; + + @ApiModelProperty(value = "关联类型:personal_recharge-个人充值, transfer_in-他人转账, queue_reward-免单奖励, sale_reward-销售奖励, incubator_reward-孵化奖励, manage_reward-管理奖励, subsidy_reward-补贴奖励, order_refund-订单退款, extract_fail-提现不通过退回, system_add-后台增加, order_pay-下单支付, transfer_out-个人转账, extract-个人提现, system_sub-后台划扣") + private String linkType; + + @ApiModelProperty(value = "0 = 支出 1 = 获得") + private int pm; + + @ApiModelProperty(value = "账单标题") + private String title; + + @ApiModelProperty(value = "明细种类") + private String category; + + @ApiModelProperty(value = "明细类型") + private String type; + + @ApiModelProperty(value = "明细数字") + private BigDecimal number; + + @ApiModelProperty(value = "剩余") + private BigDecimal balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "0 = 带确定 1 = 有效 -1 = 无效") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + @JsonProperty(value = "add_time") + @ApiModelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserBrokerageRecord.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBrokerageRecord.java new file mode 100644 index 0000000..153652e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserBrokerageRecord.java @@ -0,0 +1,106 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户佣金记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_brokerage_record") +@ApiModel(value="UserBrokerageRecord对象", description="用户佣金记录表") +public class UserBrokerageRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "记录id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id(orderNo,提现id)") + private String linkId; + + @ApiModelProperty(value = "关联类型(sale_reward销售奖励,queue免单奖,incubator_reward/queue_incubator/manage_incubator_reward孵化奖,manage_reward管理奖)") + private String linkType; + + @ApiModelProperty(value = "类型:1-增加,2-扣减(提现)") + private Integer type; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "金额") + private BigDecimal price; + + @ApiModelProperty(value = "剩余") + private BigDecimal balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "状态:1-订单创建,2-冻结期,3-完成,4-失效(订单退款),5-提现申请") + private Integer status; + + @ApiModelProperty(value = "冻结期时间(天)") + private Integer frozenTime; + + @ApiModelProperty(value = "解冻时间") + private Long thawTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "分销等级") + private Integer brokerageLevel; + + @ApiModelProperty(value = "奖励商品类型(0=会员,1=加盟店,2=会馆)") + private Integer attrType; + + @ApiModelProperty(value = "用户昵称") + @TableField(exist = false) + private String userName; + + @ApiModelProperty(value = "归属公司名称") + @TableField(exist = false) + private String tenantName; + + @ApiModelProperty(value = "手机号码") + @TableField(exist = false) + private String phone; + + @ApiModelProperty(value = "结算时间") + @TableField(exist = false) + private Date settleTime; + + @ApiModelProperty(value = "已结算总收益") + @TableField(exist = false) + private BigDecimal totalIncome; + + @ApiModelProperty(value = "今日已结算收益") + @TableField(exist = false) + private BigDecimal todayIncome; + + @ApiModelProperty(value = "待结算总收益") + @TableField(exist = false) + private BigDecimal pendingIncome; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserExperienceRecord.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserExperienceRecord.java new file mode 100644 index 0000000..a7a2d9d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserExperienceRecord.java @@ -0,0 +1,66 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户经验记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_experience_record") +@ApiModel(value="UserExperienceRecord对象", description="用户经验记录表") +public class UserExperienceRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "记录id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id-orderNo,(sign,system默认为0)") + private String linkId; + + @ApiModelProperty(value = "关联类型(order,sign,system)") + private String linkType; + + @ApiModelProperty(value = "类型:1-增加,2-扣减") + private Integer type; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "经验") + private Integer experience; + + @ApiModelProperty(value = "剩余") + private Integer balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "状态:1-成功(保留字段)") + private Integer status; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserGroup.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserGroup.java new file mode 100644 index 0000000..c8e3db5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserGroup.java @@ -0,0 +1,34 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户分组表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_group") +@ApiModel(value="UserGroup对象", description="用户分组表") +public class UserGroup implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户分组名称") + private String groupName; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserIntegralRecord.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserIntegralRecord.java new file mode 100644 index 0000000..ba4a140 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserIntegralRecord.java @@ -0,0 +1,73 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.math.BigDecimal; + +/** + * 用户积分记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_integral_record") +@ApiModel(value="UserIntegralRecord对象", description="用户积分记录表") +public class UserIntegralRecord implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "记录id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id-orderNo,(sign,system默认为0),extract关联提现id") + private String linkId; + + @ApiModelProperty(value = "关联类型(order,sign,system,extract)") + private String linkType; + + @ApiModelProperty(value = "类型:1-增加,2-扣减") + private Integer type; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "积分") + private BigDecimal integral; + + @ApiModelProperty(value = "剩余") + private BigDecimal balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "状态:1-订单创建,2-冻结期,3-完成,4-失效(订单退款)") + private Integer status; + + @ApiModelProperty(value = "冻结期时间(天)") + private Integer frozenTime; + + @ApiModelProperty(value = "解冻时间") + private Long thawTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevel.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevel.java new file mode 100644 index 0000000..0296d64 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevel.java @@ -0,0 +1,61 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户等级记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_level") +@ApiModel(value="UserLevel对象", description="用户等级记录表") +public class UserLevel implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "等级vip") + private Integer levelId; + + @ApiModelProperty(value = "会员等级") + private Integer grade; + + @ApiModelProperty(value = "0:禁止,1:正常") + private Boolean status; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "是否已通知") + private Boolean remind; + + @ApiModelProperty(value = "是否删除,0=未删除,1=删除") + private Boolean isDel; + + @ApiModelProperty(value = "享受折扣") + private Integer discount; + + @ApiModelProperty(value = "创建时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevelUpgradeAudit.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevelUpgradeAudit.java new file mode 100644 index 0000000..1b84a6c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserLevelUpgradeAudit.java @@ -0,0 +1,65 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/22 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("fw_user_level_upgrade_audit") +@ApiModel(description = "用户晋升审核记录") +public class UserLevelUpgradeAudit { + + @ApiModelProperty("主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户ID") + private Integer uid; + + @ApiModelProperty("客户名称") + private String userName; + + @ApiModelProperty("手机号(用于搜索)") + private String phone; + + @ApiModelProperty("当前身份等级,如:拼团会员") + private String currentLevel; + + @ApiModelProperty("申请晋升身份,如:加盟店") + private String targetLevel; + + @ApiModelProperty("申请描述,如:购买了指定商品") + private String description; + + @ApiModelProperty("营业执照URL,用于证明具备酒类销售资质") + private String businessLicenseUrl; + + @ApiModelProperty("1=待审核 2=通过 3=拒绝") + private Integer status; + + @ApiModelProperty("审核备注(拒绝时必填)") + private String auditRemark; + + @ApiModelProperty("审核人ID(后台管理员)") + private Long auditorId; + + @ApiModelProperty("申请时间") + @TableField(fill = FieldFill.INSERT) + private Date applyTime; + + @ApiModelProperty("审核时间") + private Date auditTime; + + @ApiModelProperty("记录来源:1=自动生成,2=后台手动添加") + private Integer sourceType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserRechargeApplication.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserRechargeApplication.java new file mode 100644 index 0000000..5f6537a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserRechargeApplication.java @@ -0,0 +1,55 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/18 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("fw_recharge_application") +@ApiModel(description = "用户充值兑换积分申请表") +public class UserRechargeApplication { + + @ApiModelProperty("主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户ID") + private Integer uid; + + @ApiModelProperty("充值金额(人民币,单位:元)") + private BigDecimal amount; + + @ApiModelProperty("付款凭证图片URL") + private String paymentProofUrl; + + @ApiModelProperty("状态:0-待处理,1-已审核,2-已拒绝") + private Integer status; + + @ApiModelProperty("审核人ID") + private Integer reviewerId; + + @ApiModelProperty("审核时间") + private Date reviewedTime; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("申请创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createdTime; + + @ApiModelProperty("最后更新时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updatedTime; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserSign.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserSign.java new file mode 100644 index 0000000..61a3947 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserSign.java @@ -0,0 +1,53 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 签到记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_sign") +@ApiModel(value="UserSign对象", description="签到记录表") +public class UserSign implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "签到说明") + private String title; + + @ApiModelProperty(value = "获得积分") + private Integer number; + + @ApiModelProperty(value = "剩余积分") + private Integer balance; + + @ApiModelProperty(value = "类型,1积分,2经验") + private Integer type; + + @ApiModelProperty(value = "签到日期") + private Date createDay; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserTag.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserTag.java new file mode 100644 index 0000000..88d2834 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserTag.java @@ -0,0 +1,34 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户标签表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_tag") +@ApiModel(value="UserTag对象", description="用户标签表") +public class UserTag implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "标签名称") + private String name; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/user/UserToken.java b/fightwine-common/src/main/java/com/yzt/common/model/user/UserToken.java new file mode 100644 index 0000000..abf0289 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/user/UserToken.java @@ -0,0 +1,50 @@ +package com.yzt.common.model.user; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户token表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_token") +@ApiModel(value="UserToken对象", description="") +public class UserToken implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户 id") + private Integer uid; + + @ApiModelProperty(value = "token") + private String token; + + @ApiModelProperty(value = "类型, 1公众号, 2小程序, 5AppIos,6AppAndroid,7ios") + private int type; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "到期事件") + private Date expiresTime; + + @ApiModelProperty(value = "登录ip") + private String loginIp; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/TemplateMessage.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/TemplateMessage.java new file mode 100644 index 0000000..9b6a808 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/TemplateMessage.java @@ -0,0 +1,57 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 微信模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_template_message") +@ApiModel(value="TemplateMessage对象", description="微信模板") +public class TemplateMessage implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "模板id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "0=订阅消息,1=微信模板消息") + private Boolean type; + + @ApiModelProperty(value = "模板编号") + private String tempKey; + + @ApiModelProperty(value = "模板名") + @JsonProperty + private String name; + + @ApiModelProperty(value = "回复内容") + private String content; + + @ApiModelProperty(value = "模板ID") + private String tempId; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatCallback.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatCallback.java new file mode 100644 index 0000000..6af315b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatCallback.java @@ -0,0 +1,56 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 微信回调表 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_callback") +@ApiModel(value="WechatCallback对象", description="微信回调表") +public class WechatCallback implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商家小程序名称") + private String toUserName; + + @ApiModelProperty(value = "微信团队的 OpenID(固定值)") + private String fromUserName; + + @ApiModelProperty(value = "事件时间,Unix时间戳") + private Long createTime; + + @ApiModelProperty(value = "消息类型") + private String msgType; + + @ApiModelProperty(value = "事件类型") + private String event; + + @ApiModelProperty(value = "内容") + private String content; + + @ApiModelProperty(value = "创建时间") + private Date addTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatExceptions.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatExceptions.java new file mode 100644 index 0000000..8d3c2bb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatExceptions.java @@ -0,0 +1,51 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 微信异常表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_exceptions") +@ApiModel(value="WechatExceptions对象", description="微信异常表") +public class WechatExceptions implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "错误码") + private String errcode; + + @ApiModelProperty(value = "错误信息") + private String errmsg; + + @ApiModelProperty(value = "回复数据") + private String data; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatMerchantConfig.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatMerchantConfig.java new file mode 100644 index 0000000..bcc6a33 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatMerchantConfig.java @@ -0,0 +1,68 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("fw_wechat_merchant_config") +@ApiModel(value = "微信商户配置") +public class WechatMerchantConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "租户ID") + private Long tenantId; + + @ApiModelProperty(value = "微信商户号(mch_id)") + private String mchId; + + @ApiModelProperty(value = "AppId") + private String appid; + + @ApiModelProperty(value = "API密钥(加密存储)") + private String apiKeyEncrypted; + + @ApiModelProperty(value = "商户证书路径") + private String certFilePath; + + @ApiModelProperty(value = "私钥文件路径") + private String privateKeyFilePath; + + @ApiModelProperty(value = "APIv3证书序列号") + private String serialNo; + + @ApiModelProperty(value = "状态:1-启用,0-禁用") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建人ID") + private Integer createBy; + + @ApiModelProperty(value = "最后更新人ID") + private Integer updateBy; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "更新时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatPayInfo.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatPayInfo.java new file mode 100644 index 0000000..f4a6d1f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatPayInfo.java @@ -0,0 +1,124 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 微信订单表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_pay_info") +@ApiModel(value="WechatPayInfo对象", description="微信订单表") +public class WechatPayInfo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "公众号唯一标识") + private String appId; + + @ApiModelProperty(value = "商户号") + private String mchId; + + @ApiModelProperty(value = "设备号,PC网页或公众号内支付可以传-WEB") + private String deviceInfo; + + @ApiModelProperty(value = "用户的唯一标识") + private String openId; + + @ApiModelProperty(value = "随机字符串") + private String nonceStr; + + @ApiModelProperty(value = "签名") + private String sign; + + @ApiModelProperty(value = "签名类型,默认为MD5,支持HMAC-SHA256和MD5") + private String signType; + + @ApiModelProperty(value = "商品描述") + private String body; + + @ApiModelProperty(value = "商品详细描述,对于使用单品优惠的商户,该字段必须按照规范上传") + private String detail; + + @ApiModelProperty(value = "附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用") + private String attach; + + @ApiModelProperty(value = "商户订单号,要求32个字符内") + private String outTradeNo; + + @ApiModelProperty(value = "标价币种:CNY:人民币 GBP:英镑 HKD:港币 USD:美元 JPY:日元 CAD:加拿大元 AUD:澳大利亚元 EUR:欧元 NZD:新西兰元 KRW:韩元 THB:泰铢") + private String feeType; + + @ApiModelProperty(value = "标价金额") + private Integer totalFee; + + @ApiModelProperty(value = "终端IP") + private String spbillCreateIp; + + @ApiModelProperty(value = "交易起始时间") + private String timeStart; + + @ApiModelProperty(value = "交易结束时间") + private String timeExpire; + + @ApiModelProperty(value = "通知地址") + private String notifyUrl; + + @ApiModelProperty(value = "交易类型,取值为:JSAPI,NATIVE,APP等") + private String tradeType; + + @ApiModelProperty(value = "商品ID") + private String productId; + + @ApiModelProperty(value = "场景信息") + private String sceneInfo; + + @ApiModelProperty(value = "错误代码") + private String errCode; + + @ApiModelProperty(value = "预支付交易会话标识") + private String prepayId; + + @ApiModelProperty(value = "二维码链接") + private String codeUrl; + + @ApiModelProperty(value = "是否关注公众账号") + private String isSubscribe; + + @ApiModelProperty(value = "交易状态") + private String tradeState; + + @ApiModelProperty(value = "付款银行") + private String bankType; + + @ApiModelProperty(value = "现金支付金额") + private Integer cashFee; + + @ApiModelProperty(value = "代金券金额") + private Integer couponFee; + + @ApiModelProperty(value = "微信支付订单号") + private String transactionId; + + @ApiModelProperty(value = "支付完成时间") + private String timeEnd; + + @ApiModelProperty(value = "交易状态描述") + private String tradeStateDesc; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramMyTemp.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramMyTemp.java new file mode 100644 index 0000000..ae7b1cc --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramMyTemp.java @@ -0,0 +1,60 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 小程序我的模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_program_my_temp") +@ApiModel(value="WechatProgramMyTemp对象", description="小程序我的模板") +public class WechatProgramMyTemp implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "微信模板id") + private Integer tid; + + @ApiModelProperty(value = "模版标题") + private String title; + + @ApiModelProperty(value = "模板关键字id,多个逗号分割") + private String kid; + + @ApiModelProperty(value = "场景描述") + private String sceneDesc; + + @ApiModelProperty(value = "微信模板id") + private String tempId; + + @ApiModelProperty(value = "扩展字段") + private String extra; + + @ApiModelProperty(value = "状态 0,禁用,1启用") + private Boolean status; + + @ApiModelProperty(value = "应用场景") + private String type; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramPublicTemp.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramPublicTemp.java new file mode 100644 index 0000000..1569c14 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatProgramPublicTemp.java @@ -0,0 +1,48 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * WechatProgramPublicTemp对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_program_public_temp") +@ApiModel(value="WechatProgramPublicTemp对象", description="") +public class WechatProgramPublicTemp implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "微信模板id") + private Integer tid; + + @ApiModelProperty(value = "模版标题") + private String title; + + @ApiModelProperty(value = "模版类型,2 为一次性订阅,3 为长期订阅") + private Integer type; + + @ApiModelProperty(value = "模版所属类目 id") + private Integer categoryId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatQrcode.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatQrcode.java new file mode 100644 index 0000000..4694736 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatQrcode.java @@ -0,0 +1,63 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 微信二维码管理表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_qrcode") +@ApiModel(value="WechatQrcode对象", description="微信二维码管理表") +public class WechatQrcode implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "微信二维码ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "二维码类型") + private String thirdType; + + @ApiModelProperty(value = "用户id") + private Integer thirdId; + + @ApiModelProperty(value = "二维码参数") + private String ticket; + + @ApiModelProperty(value = "二维码有效时间") + private Integer expireSeconds; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "微信访问url") + private String url; + + @ApiModelProperty(value = "微信二维码url") + private String qrcodeUrl; + + @ApiModelProperty(value = "被扫的次数") + private Integer scan; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatReply.java b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatReply.java new file mode 100644 index 0000000..ded3ee1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/model/wechat/WechatReply.java @@ -0,0 +1,51 @@ +package com.yzt.common.model.wechat; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 微信关键字回复表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_reply") +@ApiModel(value="WechatReply对象", description="微信关键字回复表") +public class WechatReply implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "微信关键字回复id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "关键字") + private String keywords; + + @ApiModelProperty(value = "回复类型") + private String type; + + @ApiModelProperty(value = "回复数据") + private String data; + + @ApiModelProperty(value = "0=不可用 1 =可用") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/page/CommonPage.java b/fightwine-common/src/main/java/com/yzt/common/page/CommonPage.java new file mode 100644 index 0000000..d695d11 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/page/CommonPage.java @@ -0,0 +1,87 @@ +package com.yzt.common.page; + +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import lombok.Data; +import org.springframework.beans.BeanUtils; +import org.springframework.data.domain.Page; + +import java.util.ArrayList; +import java.util.List; + +/** + * 公共分页对象 + * + */ +@Data +public class CommonPage { + private Integer page = Constants.DEFAULT_PAGE; + private Integer limit = Constants.DEFAULT_LIMIT; + private Integer totalPage = 0; + private Long total = 0L ; + private List list = new ArrayList<>(); + + + /** + * 将PageHelper分页后的list转为分页信息 + */ + public static CommonPage restPage(List list) { + CommonPage result = new CommonPage(); + PageInfo pageInfo = new PageInfo(list); + result.setTotalPage(pageInfo.getPages()); + result.setPage(pageInfo.getPageNum()); + result.setLimit(pageInfo.getPageSize()); + result.setTotal(pageInfo.getTotal()); + result.setList(pageInfo.getList()); + return result; + } + + /** + * 将SpringData分页后的list转为分页信息 + */ + public static CommonPage restPage(Page pageInfo) { + CommonPage result = new CommonPage(); + result.setTotalPage(pageInfo.getTotalPages()); + result.setPage(pageInfo.getNumber()); + result.setLimit(pageInfo.getSize()); + result.setTotal(pageInfo.getTotalElements()); + result.setList(pageInfo.getContent()); + return result; + } + + /** + * 将PageHelper分页后的 PageInfo 转为分页信息 + * @return + */ + public static CommonPage restPage(PageInfo pageInfo) { + CommonPage result = new CommonPage(); + result.setTotalPage(pageInfo.getPages()); + result.setPage(pageInfo.getPageNum()); + result.setLimit(pageInfo.getPageSize()); + result.setTotal(pageInfo.getTotal()); + result.setList(pageInfo.getList()); + return result; + } + + /** + * 对象A复制对象B的分页信息 // 多次数据查询导致分页数据异常解决办法 + */ + public static PageInfo copyPageInfo(com.github.pagehelper.Page originPageInfo, List list) { + PageInfo pageInfo = new PageInfo<>(list); + BeanUtils.copyProperties(originPageInfo, pageInfo, "list"); + return pageInfo; + } + + /** + * 对象A复制对象B的分页信息 // 多次数据查询导致分页数据异常解决办法 + */ + public static PageInfo copyPageInfo(PageInfo originPageInfo, List list) { + PageInfo pageInfo = new PageInfo<>(list); + pageInfo.setPages(originPageInfo.getPages()); + pageInfo.setPageNum(originPageInfo.getPageNum()); + pageInfo.setPageSize(originPageInfo.getPageSize()); + pageInfo.setTotal(originPageInfo.getTotal()); + pageInfo.setList(list); + return pageInfo; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ActivityEnrollSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ActivityEnrollSearchRequest.java new file mode 100644 index 0000000..55b977b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ActivityEnrollSearchRequest.java @@ -0,0 +1,23 @@ +package com.yzt.common.request; + +/** + * @Author: pengsz + * @Date: 2025/12/02 + * @Description: + */ + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +/** + * 活动报名对象 + * + */ +@Data +public class ActivityEnrollSearchRequest { + + @ApiModelProperty(value = "活动名称") + private String name; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleRequest.java new file mode 100644 index 0000000..6582944 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleRequest.java @@ -0,0 +1,50 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 活动维护对象 + * + */ +@Data +public class ActivityStyleRequest { + + @ApiModelProperty(value = "主键") + private Integer id; + + @ApiModelProperty(value = "活动名称") + @NotEmpty(message = "活动名称不能为空") + private String name; + + @ApiModelProperty(value = "活动类型0=活动边框,1=活动背景") + private Boolean type; + + @ApiModelProperty(value = "开始时间") + @NotEmpty(message = "开始时间不能为空") + private String starttime; + + @ApiModelProperty(value = "结束时间") + @NotEmpty(message = "结束时间不能为空") + private String endtime; + + @ApiModelProperty(value = "活动边框素材地址") + @NotEmpty(message = "活动素材 不能为空") + private String style; + + @ApiModelProperty(value = "状态 0=关闭1=开启") + private Boolean status; + + @ApiModelProperty(value = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与") + @NotNull(message = "活动参与类型不能为空") + @Range(min = 0, max = 4, message = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与, 4=指定商户产品") + private Integer method; + + @ApiModelProperty(value = "参与活动商品") + private String products; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleSearchRequest.java new file mode 100644 index 0000000..005da4e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleSearchRequest.java @@ -0,0 +1,60 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + + +/** + * 活动样式搜索对象 + * + */ +@Data +public class ActivityStyleSearchRequest { + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "活动名称不能为空") + private String name; + + @ApiModelProperty(value = "活动类型0=活动边框,1=活动背景") + private Boolean type; + + @ApiModelProperty(value = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date starttime; + + @ApiModelProperty(value = "结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endtime; + + @ApiModelProperty(value = "状态 0=关闭1=开启") + private Boolean status; + + @ApiModelProperty(value = "状态 -1=已结束,0=未开始,1=进行中") + private Integer runningStatus; + + @ApiModelProperty(value = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与, 4=指定商户产品") + @Range(min = 0, max = 4, message = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与, 4=指定商户产品") + private Integer method; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createtime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private Date updatetime; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleUpdateStatusRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleUpdateStatusRequest.java new file mode 100644 index 0000000..45364a4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ActivityStyleUpdateStatusRequest.java @@ -0,0 +1,20 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 活动边框 更新状态 描述对应的业务场景 + * + */ +@Data +public class ActivityStyleUpdateStatusRequest { + @ApiModelProperty(value = "主键") + @NotNull(message = "id 不能为空") + private Integer id; + + @ApiModelProperty(value = "状态 0=关闭1=开启") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/AdminAccountDetectionRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/AdminAccountDetectionRequest.java new file mode 100644 index 0000000..0edcd09 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/AdminAccountDetectionRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * 管理端账号检测请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="AdminAccountDetectionRequest", description="管理端账号检测请求对象") +public class AdminAccountDetectionRequest implements Serializable { + + private static final long serialVersionUID = -5291081138040044258L; + + @ApiModelProperty(value = "后台管理员账号", example = "userName") + @NotEmpty(message = "账号 不能为空") + @Length(max = 32, message = "账号长度不能超过32个字符") + private String account; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/AdminIntegralSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/AdminIntegralSearchRequest.java new file mode 100644 index 0000000..4de7d88 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/AdminIntegralSearchRequest.java @@ -0,0 +1,46 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 后台积分查询请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="AdminIntegralSearchRequest对象", description="后台积分查询请求对象") +public class AdminIntegralSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "添加时间") + private String dateLimit; + + @ApiModelProperty(value = "客户昵称(模糊查询)") + private String keywords; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "身份类型(用户等级):1、2、3、4、5、6") + private Integer level; + + @ApiModelProperty(value = "流水类型:1-收入,2-支出") + private Integer flowType; + + @ApiModelProperty(value = "流水状态:3-正常,4-失效") + private Integer status; + + @ApiModelProperty(value = "具体流水类型,仅在指定流水类型(flowType)时生效:flowType=1(收入)时可选 brokerage_release-奖励收益手续费转积分、extract-提现手续费转积分、transfer_in-他人转入;flowType=2(支出)时可选 transfer_out-转出、activity_deduction-购买活动商品") + private String linkType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ArticleRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ArticleRequest.java new file mode 100644 index 0000000..7699865 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ArticleRequest.java @@ -0,0 +1,71 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 文章管理 Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ArticleRequest对象", description="文章管理表") +public class ArticleRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "分类id", required = true) + @NotBlank(message = "请选择分类") + private String cid; + + @ApiModelProperty(value = "文章标题", required = true) + @NotBlank(message = "请填写文章标题") + @Length(max = 200, message = "文章标题最多200个字符") + private String title; + + @ApiModelProperty(value = "文章作者", required = true) + @NotBlank(message = "请填写文章作者") + @Length(max = 50, message = "文章作者最多50个字符") + private String author; + + @ApiModelProperty(value = "文章图片", required = true) + @NotBlank(message = "请上传文章图片") + @Length(max = 255, message = "文章图片名称最多255个字符") + private String imageInput; + + @ApiModelProperty(value = "文章简介", required = true) + @Length(max = 200, message = "文章简介最多200个字符") + @NotBlank(message = "请填写文章简介") + private String synopsis; + + @ApiModelProperty(value = "文章分享标题", required = true) + @NotBlank(message = "请填写文章分享标题") + @Length(max = 200, message = "文章分享标题最多200个字符") + private String shareTitle; + + @ApiModelProperty(value = "文章分享简介", required = true) + @NotBlank(message = "请填写文章分享简介") + @Length(max = 200, message = "文章分享简介最多200个字符") + private String shareSynopsis; + + @ApiModelProperty(value = "是否热门(小程序)", example = "false") + @NotNull(message = "是否热门(小程序)不能为空") + private Boolean isHot; + + @ApiModelProperty(value = "是否轮播图(小程序)" , example = "true") + @NotNull(message = "是否轮播图(小程序)不能为空") + private Boolean isBanner; + + @ApiModelProperty(value = "文章内容", required = true) + @NotBlank(message = "请填写文章内容") + private String content; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ArticleSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ArticleSearchRequest.java new file mode 100644 index 0000000..8933783 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ArticleSearchRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * + * 文章管理 搜索Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ArticleSearchRequest对象", description="文章管理表") +public class ArticleSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "分类id") + private String cid; + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/BargainFrontRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/BargainFrontRequest.java new file mode 100644 index 0000000..f6e861b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/BargainFrontRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * H5 砍价公共请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainFrontRequest对象", description="砍价公共请求对象") +public class BargainFrontRequest { + + @ApiModelProperty(value = "砍价商品ID", required = true) + @NotNull(message = "砍价商品编号不能为空") + private Integer bargainId; + + @ApiModelProperty(value = "用户砍价活动ID") + private Integer bargainUserId; + + @ApiModelProperty(value = "用户砍价活动Uid") + private Integer bargainUserUid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/BrokerageRecordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/BrokerageRecordRequest.java new file mode 100644 index 0000000..96ce65a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/BrokerageRecordRequest.java @@ -0,0 +1,46 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import java.io.Serializable; + +/** + * 资金监控 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BrokerageRecordRequest对象", description="佣金记录请求对象") +public class BrokerageRecordRequest implements Serializable { + + private static final long serialVersionUID = 3362714265772774491L; + + @ApiModelProperty(value = "客户昵称(模糊查询)") + private String keywords; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "身份类型(用户等级):1、2、3、4、5、6") + private Integer level; + + @ApiModelProperty(value = "结算状态:1-待结算,3-已结算,4-已取消,不传查全部") + private Integer status; + + @ApiModelProperty(value = "收益类型 linkType:sale_reward销售奖励,queue免单奖,incubator_all孵化奖,manage_reward管理奖,subsidy_reward补贴奖励") + private String linkType; + + @ApiModelProperty(value = "创建时间") + private String createDateLimit; + + @ApiModelProperty(value = "结算时间,仅对已结算数据生效") + private String settleDateLimit; + + @ApiModelProperty(value = "订单号(link_id)") + private String orderNo; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CartNumRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CartNumRequest.java new file mode 100644 index 0000000..82c00e6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CartNumRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 购物车数量请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CartRequest对象", description="购物车数量请求对象") +public class CartNumRequest implements Serializable { + + private static final long serialVersionUID = -1186533756329913311L; + + @ApiModelProperty(value = "数量类型:total-商品数量,sum-购物数量", required = true) + @NotNull(message = "数量类型不能为空") + private String type; + + @ApiModelProperty(value = "商品类型:true-有效商品,false-无效商品", required = true) + @NotNull(message = "商品类型不能为空") + private Boolean numType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CartRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CartRequest.java new file mode 100644 index 0000000..d4d5189 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CartRequest.java @@ -0,0 +1,38 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 添加购物车参数 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CartRequest对象", description="购物车") +public class CartRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品ID", required = true) + @NotNull(message = "商品id不能为空") + private Integer productId; + + @ApiModelProperty(value = "商品属性 -- attr 对象的id") + @NotBlank(message = "商品属性id不能为空") + private String productAttrUnique; + + @ApiModelProperty(value = "商品数量", required = true) + @NotNull(message = "商品数量不能为空") + @Min(value = 1, message = "商品数量不能小于1") + @Max(value = 99, message = "单个商品数量不能大于99") + private Integer cartNum; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CartResetRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CartResetRequest.java new file mode 100644 index 0000000..ac43d1b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CartResetRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 购物车重选Request对象类 + * + */ +@Data +public class CartResetRequest { + + @ApiModelProperty(value = "购物车id") + @NotNull(message = "id 不能为空") + private Long id; + + @ApiModelProperty(value = "购物车数量") + @NotNull(message = "num 不能为空") + private Integer num; + + @ApiModelProperty(value = "商品id") + @NotNull(message = "productId 不能为空") + private Integer productId; + + @ApiModelProperty(value = "AttrValue Id") + @NotNull(message = "unique 不能为空") + private Integer unique; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CategoryRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CategoryRequest.java new file mode 100644 index 0000000..8a80729 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CategoryRequest.java @@ -0,0 +1,61 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 分类表 Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_category") +@ApiModel(value="Category对象", description="分类表") +public class CategoryRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "父级ID") + @NotNull(message = "请选择父级分类") + @Min(value = 0, message = "请选择父级分类") + private Integer pid; + + @ApiModelProperty(value = "分类名称") + @NotBlank(message = "分类名称必须填写") + @Length(max = 50, message = "分类名称不能超过50个字符") + private String name; + + @ApiModelProperty(value = "类型,类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置") + @NotNull(message = "类型必须选择") + @Range(min = 1, max = 6, message = "类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置之间") //取值范围 + private Integer type; + + @ApiModelProperty(value = "地址") +// @NotBlank(message = "地址名称必须填写") + private String url; + + @ApiModelProperty(value = "扩展字段") + private String extra; + + @ApiModelProperty(value = "状态, 0正常,1失效") + @NotNull(message = "状态必须选择") + private Boolean status; + + @ApiModelProperty(value = "排序") + @NotNull(message = "排序数字为空") //不可为空 + @Min(value = 0, message = "排序数字必须大于等于0") //数字最小值为0 + private Integer sort; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CategorySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CategorySearchRequest.java new file mode 100644 index 0000000..1baf637 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CategorySearchRequest.java @@ -0,0 +1,37 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 分类表 搜索Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_category") +@ApiModel(value="Category对象", description="分类表") +public class CategorySearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "类型ID | 类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置") + private Integer type; + + @ApiModelProperty(value = "状态, 1正常,0失效 -1全部") + private Integer status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/CreateOrderRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/CreateOrderRequest.java new file mode 100644 index 0000000..0129271 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/CreateOrderRequest.java @@ -0,0 +1,79 @@ +package com.yzt.common.request; + +import com.yzt.common.vo.InvoiceRequestVo; +import com.yzt.common.vo.VirtualRemarkVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 创建订单请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CreateOrderRequest对象", description="创建订单请求对象") +public class CreateOrderRequest implements Serializable { + + private static final long serialVersionUID = -6133994384185333872L; + + @ApiModelProperty(value = "预下单订单号") + @NotBlank(message = "预下单订单号不能为空") + private String preOrderNo; + + @ApiModelProperty(value = "快递类型: 1-快递配送,2-到店自提,3-虚拟商品,无需发货") + @NotNull(message = "快递类型不能为空") + @Range(min = 1, max = 5, message = "未知的快递类型") + private Integer shippingType; + + @ApiModelProperty(value = "收货地址id") + private Integer addressId; + + @ApiModelProperty(value = "优惠券编号") + private Integer couponId; + +// @ApiModelProperty(value = "支付类型:weixin-微信支付,yue-余额支付,alipay-支付宝支付") +// @NotBlank(message = "支付类型不能为空") +// private String payType; +// +// @ApiModelProperty(value = "支付渠道:weixinh5-微信H5支付,public-公众号支付,routine-小程序支付,weixinAppIos-微信appios支付,weixinAppAndroid-微信app安卓支付,alipay-支付宝支付,appAliPay-App支付宝支付") +// @NotBlank(message = "支付渠道不能为空") +// private String payChannel; + + @ApiModelProperty(value = "是否使用积分") + @NotNull(message = "是否使用积分不能为空") + private Boolean useIntegral; + + @ApiModelProperty(value = "订单备注") + private String mark; + + // 以下为到店自提参数 + + @ApiModelProperty(value = "自提点id") + private Integer storeId; + + @ApiModelProperty(value = "真实名称") + private String realName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "客户地址") + private List virtualRemarkList; + + @ApiModelProperty(value = "发票信息") + private InvoiceRequestVo invoiceInfo; + + @ApiModelProperty(value = "订单类型 0-普通,1-视频,2-活动订单") + private Integer type; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/EnrollSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/EnrollSearchRequest.java new file mode 100644 index 0000000..04dd293 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/EnrollSearchRequest.java @@ -0,0 +1,21 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="EnrollSearchRequest", description="客户请求") +public class EnrollSearchRequest { + @ApiModelProperty(value = "ID", example = "36", required = true) + private Integer id; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ExpressSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ExpressSearchRequest.java new file mode 100644 index 0000000..8d4ef08 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ExpressSearchRequest.java @@ -0,0 +1,26 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 快递公司 搜索Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ExpressSearchRequest对象", description="快递公司") +public class ExpressSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字", required = true) + private String keywords; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateRequest.java new file mode 100644 index 0000000..457fb9a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateRequest.java @@ -0,0 +1,50 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 快递公司编辑请求体 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_express") +@ApiModel(value="ExpressRequest对象", description="快递公司编辑请求体") +public class ExpressUpdateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "快递公司id") + @NotNull(message = "快递公司id不能为空") + private Integer id; + + @ApiModelProperty(value = "账号") + private String account; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "网点名称") + private String netName; + + @ApiModelProperty(value = "排序") + @NotNull(message = "排序不能为空") + private Integer sort; + +// @ApiModelProperty(value = "是否显示") +// @NotNull(message = "是否显示不能为空") +// private Boolean isShow; + + @ApiModelProperty(value = "是否可用") + @NotNull(message = "是否可用不能为空") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateShowRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateShowRequest.java new file mode 100644 index 0000000..cd5be06 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ExpressUpdateShowRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 快递公司编辑请求体 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_express") +@ApiModel(value="ExpressRequest对象", description="快递公司编辑请求体") +public class ExpressUpdateShowRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "快递公司id") + @NotNull(message = "快递公司id不能为空") + private Integer id; + + @ApiModelProperty(value = "是否显示") + @NotNull(message = "是否显示不能为空") + private Boolean isShow; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorRequest.java new file mode 100644 index 0000000..0e7cddc --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorRequest.java @@ -0,0 +1,49 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 资金监控 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="FundsMonitorRequest对象", description="资金监控") +public class FundsMonitorRequest implements Serializable { + + private static final long serialVersionUID = 3362714265772774491L; + + @ApiModelProperty(value = "客户昵称(模糊查询)") + private String keywords; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "身份类型(用户等级):1、2、3、4、5、6") + private Integer level; + + @ApiModelProperty(value = "流水状态:1=有效,-1=无效,不传查全部") + private Integer status; + + @ApiModelProperty(value = "流水类型:0=支出,1=获得,不传查全部") + private Integer pm; + + @ApiModelProperty(value = "关联类型 linkType") + private String linkType; + + @ApiModelProperty(value = "添加时间") + private String dateLimit; + + @ApiModelProperty(value = "明细类型:recharge-充值支付,admin-后台操作,productRefund商品退款,payProduct购买商品") + @StringContains(limitValues = {"recharge", "admin", "productRefund", "payProduct"}, message = "请选择正确的明细类型") + private String title; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorSearchRequest.java new file mode 100644 index 0000000..b05fc09 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/FundsMonitorSearchRequest.java @@ -0,0 +1,58 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 资金监控 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="FundsMonitorSearchRequest对象", description="资金监控") +public class FundsMonitorSearchRequest implements Serializable { + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + + @ApiModelProperty(value = "类型") + private String category; + + @ApiModelProperty(value = "类型") + private String type; + + @ApiModelProperty(value = "添加时间") + private String dateLimit; + + @ApiModelProperty(value = "最大佣金") + private BigDecimal max; + + @ApiModelProperty(value = "最小佣金") + private BigDecimal min; + + @ApiModelProperty(value = "排序 asc/desc") + private String sort; + + @JsonIgnore + @ApiModelProperty(value = "关联id") + private String linkId; + + @JsonIgnore + @ApiModelProperty(value = "操作类型") + private Integer pm; + + @ApiModelProperty(value = "用户id list") + private List userIdList; + + @ApiModelProperty(value = "用户id list") + private Integer uid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/GetProductReply.java b/fightwine-common/src/main/java/com/yzt/common/request/GetProductReply.java new file mode 100644 index 0000000..e63fccf --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/GetProductReply.java @@ -0,0 +1,23 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 获取商品评论对象 + * + */ +@Data +public class GetProductReply { + + @ApiModelProperty(value = "商品attrid") + @NotBlank(message = "商品uniId不能为空") + private String uni; + + @ApiModelProperty(value = "订单id") + @NotNull(message = "订单id不能为空") + private Integer orderId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdatePasswordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdatePasswordRequest.java new file mode 100644 index 0000000..c633bba --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdatePasswordRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * 登录用户修改密码请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "LoginAdminUpdatePasswordRequest", description = "登录用户修改密码请求对象") +public class LoginAdminUpdatePasswordRequest { + + @ApiModelProperty(value = "后台管理员密码", required = true) + @NotBlank(message = "管理员密码不能为空") + @Length(min = 6, max = 30, message = "密码长度在6-30个字符") + private String password; + + @ApiModelProperty(value = "后台管理员密码", required = true) + @NotBlank(message = "管理员确认密码不能为空") + @Length(min = 6, max = 30, message = "密码长度在6-30个字符") + private String confirmPassword; + + @ApiModelProperty(value = "后台管理员原密码", required = true) + @NotBlank(message = "管理员原密码不能为空") + @Length(min = 6, max = 30, message = "原密码长度在6-30个字符") + private String oldPassword; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdateRequest.java new file mode 100644 index 0000000..e8a03ab --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/LoginAdminUpdateRequest.java @@ -0,0 +1,25 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Size; + +/** + * 登录用户修改信息请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "LoginAdminUpdateRequest", description = "登录用户修改信息请求对象") +public class LoginAdminUpdateRequest { + + @ApiModelProperty(value = "后台管理员昵称", required = true) + @Size(max = 16, message = "后台管理员昵称长度不能超过16个字符") + private String realName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/LoginMobileRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/LoginMobileRequest.java new file mode 100644 index 0000000..7fdc89a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/LoginMobileRequest.java @@ -0,0 +1,42 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 手机号注册 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="LoginMobileRequest对象", description="手机号注册") +public class LoginMobileRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "手机号", required = true) + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "手机号码格式错误") + private String phone; + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + private String captcha; + + @ApiModelProperty(value = "推广人id") + @JsonProperty(value = "spread_spid") + private Integer spreadPid; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/LoginRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/LoginRequest.java new file mode 100644 index 0000000..3e2afaf --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/LoginRequest.java @@ -0,0 +1,44 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 移动端手机密码登录请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="LoginRequest对象", description="移动端手机密码登录请求对象") +public class LoginRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "手机号", required = true, example = "18888888") + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "手机号码格式错误") + @JsonProperty(value = "account") + private String phone; + + @ApiModelProperty(value = "密码", required = true, example = "1~[6,18]") + @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + private String password; + + @ApiModelProperty(value = "验证码") +// @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + private String validateCode; + + @ApiModelProperty(value = "推广人id") + @JsonProperty(value = "spread_spid") + private Integer spreadPid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/MealCodeRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/MealCodeRequest.java new file mode 100644 index 0000000..c77c538 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/MealCodeRequest.java @@ -0,0 +1,48 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 套餐购买请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "MealCodeRequest对象", description = "套餐购买请求对象") +public class MealCodeRequest { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "套餐ID", required = true) + @NotNull(message = "套餐ID不能为空") + private Integer mealId; + + @ApiModelProperty(value = "套餐金额", required = true) + @NotNull(message = "套餐金额不能为空") + private BigDecimal price; + + @ApiModelProperty(value = "套餐量", required = true) + @NotNull(message = "套餐量不能为空") + private Integer num; + + @ApiModelProperty(value = "套餐类型:sms,短信;copy,产品复制;expr_query,物流查询;expr_dump,电子面单", required = true) + @NotBlank(message = "套餐类型不能为空") + @StringContains(limitValues = {"sms","copy","expr_query","expr_dump"}, message = "未知的套餐类型") + private String type; + + @ApiModelProperty(value = "支付类型 weixin:微信支付/alipay:支付宝支付", required = true) + @NotBlank(message = "支付类型不能为空") + @StringContains(limitValues = {"weixin","alipay"}, message = "未知的支付类型") + private String payType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/NotificationInfoRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/NotificationInfoRequest.java new file mode 100644 index 0000000..cefcc95 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/NotificationInfoRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 系统通知详情请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="NotificationInfoRequest对象", description="系统通知详情请求对象") +public class NotificationInfoRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "通知id") + @NotNull(message = "通知id不能为空") + private Integer id; + + @ApiModelProperty(value = "wechat-公众号模板消息,routine-小程序订阅消息,sms-短信") + @NotEmpty(message = "详情类型不能为空") + private String detailType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/NotificationSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/NotificationSearchRequest.java new file mode 100644 index 0000000..d9d9d71 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/NotificationSearchRequest.java @@ -0,0 +1,28 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import java.io.Serializable; + +/** + * 系统通知查询对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="NotificationSearchRequest对象", description="系统通知查询对象") +public class NotificationSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "发送类型(1:通知会员,2:通知平台)") + @Range(min = 1, max = 2, message = "未知的发送类型") + private Integer sendType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/NotificationUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/NotificationUpdateRequest.java new file mode 100644 index 0000000..4aa4d2c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/NotificationUpdateRequest.java @@ -0,0 +1,39 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 系统通知修改请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="NotificationUpdateRequest对象", description="系统通知修改请求对象") +public class NotificationUpdateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "通知id") + @NotNull(message = "通知id不能为空") + private Integer id; + + @ApiModelProperty(value = "wechat-公众号模板消息,routine-小程序订阅消息,sms-短信") + @NotEmpty(message = "详情类型不能为空") + private String detailType; + + @ApiModelProperty(value = "模板id(wechat、routine)") + private String tempId; + + @ApiModelProperty(value = "状态,1-开启,2-关闭") + @NotNull(message = "状态不能为空") + private Integer status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/OrderComputedPriceRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/OrderComputedPriceRequest.java new file mode 100644 index 0000000..9f7583a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/OrderComputedPriceRequest.java @@ -0,0 +1,42 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 计算订单价格请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderComputedPriceRequest对象", description="计算订单价格请求对象") +public class OrderComputedPriceRequest { + + @ApiModelProperty(value = "预下单订单号") + @NotBlank(message = "预下单订单号不能为空") + private String preOrderNo; + + @ApiModelProperty(value = "地址id") + private Integer addressId; + + @ApiModelProperty(value = "优惠券id") + private Integer couponId; + + @ApiModelProperty(value = "快递类型: 1-快递配送,2-到店自提") + @NotNull(message = "快递类型不能为空") + @Range(min = 1, max = 2, message = "未知的快递类型") + private Integer shippingType; + + @ApiModelProperty(value = "是否使用积分") + @NotNull(message = "是否使用积分不能为空") + private Boolean useIntegral; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/OrderPayRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/OrderPayRequest.java new file mode 100644 index 0000000..807c9de --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/OrderPayRequest.java @@ -0,0 +1,42 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * 支付订单参数 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderPayRequest对象", description="订单支付") +public class OrderPayRequest { + + @ApiModelProperty(value = "订单id") +// @NotNull(message = "订单id不能为空") + private String uni; + + @ApiModelProperty(value = "订单编号") + @NotNull(message = "订单编号不能为空") + private String orderNo; + + @ApiModelProperty(value = "支付类型:weixin-微信支付,yue-余额支付,offline-线下支付,alipay-支付包支付") + @NotNull(message = "支付类型不能为空") + private String payType; + + @ApiModelProperty(value = "支付渠道:weixinh5-微信H5支付,public-公众号支付,routine-小程序支付,weixinAppIos-微信appios支付,weixinAppAndroid-微信app安卓支付,alipay-支付包支付,appAliPay-App支付宝支付") + @NotNull(message = "支付渠道不能为空") + private String payChannel; + + @ApiModelProperty(value = "支付平台") + private String from; + + @ApiModelProperty(value = "下单时小程序的场景值") + private Integer scene; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/OrderRefundApplyRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/OrderRefundApplyRequest.java new file mode 100644 index 0000000..ef49392 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/OrderRefundApplyRequest.java @@ -0,0 +1,51 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; + +/** + * 添加购物车参数Request对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderRefundApplyRequest对象", description="订单申请退款") +public class OrderRefundApplyRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "退款原因", required = true) + @NotNull(message = "退款原因必须填写") + @Length(max = 255, message = "退款原因不能超过255个字符") + private String text; + + @ApiModelProperty(value = "订单id", required = true) + private Integer id; + + @ApiModelProperty(value = "退款凭证图片(多个图片请用,(英文逗号)隔开)") + @JsonProperty("refund_reason_wap_img") + private String reasonImage; + + @ApiModelProperty(value = "备注说明") + @JsonProperty("refund_reason_wap_explain") + private String explain; + + @ApiModelProperty(value = "退款类型 0=仅退款 1=退货退款", required = true) + @NotNull(message = "退款类型不能为空") + private Integer refundType; + + @ApiModelProperty(value = "货物状态 0=未收到货 1=已收到货") + @JsonProperty("goods_status") + private Integer goodsStatus; + + @ApiModelProperty(value = "待退款订单") + @NotNull(message = "待退款订单 不能为空") + private String uni; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PageParamRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PageParamRequest.java new file mode 100644 index 0000000..e5bdafd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PageParamRequest.java @@ -0,0 +1,20 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.Constants; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 分页公共请求对象 + * + */ +@Data +public class PageParamRequest { + + @ApiModelProperty(value = "页码", example= Constants.DEFAULT_PAGE + "") + private int page = Constants.DEFAULT_PAGE; + + @ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "") + private int limit = Constants.DEFAULT_LIMIT; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PasswordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PasswordRequest.java new file mode 100644 index 0000000..357f073 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PasswordRequest.java @@ -0,0 +1,46 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 绑定手机号 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PasswordRequest对象", description="修改密码") +public class PasswordRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "手机号", required = true) + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "手机号码格式错误") + @JsonProperty(value = "account") + private String phone; + + @ApiModelProperty(value = "密码", required = true) + @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + private String password; + + @ApiModelProperty(value = "密码", required = true) + private String repeatPassword; + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + @JsonProperty(value = "captcha") + private String validateCode; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PayComponentProductAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PayComponentProductAddRequest.java new file mode 100644 index 0000000..1dc1069 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PayComponentProductAddRequest.java @@ -0,0 +1,81 @@ +package com.yzt.common.request; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 组件商品添加Request对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PayComponentProductAddRequest对象", description="组件商品添加Request对象") +public class PayComponentProductAddRequest implements Serializable { + + private static final long serialVersionUID = -2196197495866986580L; + + @ApiModelProperty(value = "商品ID(更新时必填)") + private Integer id; + + @ApiModelProperty(value = "主商品ID", required = true) + @NotNull(message = "请先选择主商品") + private Integer primaryProductId; + + @ApiModelProperty(value = "标题", required = true) + @NotNull(message = "标题不能为空") + private String title; + + @ApiModelProperty(value = "轮播图,多张", required = true) + @NotNull(message = "轮播图不能为空") + private String headImg; + + @ApiModelProperty(value = "商品资质图片,多张") + private String qualificationPics; + + @ApiModelProperty(value = "第三级类目ID", required = true) + @NotNull(message = "第三级类目不能为空") + private Integer thirdCatId; + + @ApiModelProperty(value = "品牌id") + private Integer brandId; + + @ApiModelProperty(value = "商品详情") + private String descInfo; + + @ApiModelProperty(value = "商品详情图片,多图") + private String descImgs; + + @ApiModelProperty(value = "运费模板ID", required = true) + @NotNull(message = "运费模板不能为空") + private Integer tempId; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "单位名", required = true) + private String unitName; + + @ApiModelProperty(value = "获得积分", required = true) + private Integer giveIntegral; + + @ApiModelProperty(value = "虚拟销量", required = true) + private Integer ficti; + + @ApiModelProperty(value = "规格 0单 1多", required = true) + private Boolean specType; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PinkQueryRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PinkQueryRequest.java new file mode 100644 index 0000000..72a006e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PinkQueryRequest.java @@ -0,0 +1,24 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ +@Data +@ApiModel("拼团查询请求") +public class PinkQueryRequest { + + @ApiModelProperty(value = "用户ID", required = true) + @NotNull(message = "用户ID不能为空") + private Integer uid; + + @ApiModelProperty(value = "队列类型: 1-会员队列, 2-会馆队列") + private Integer queueType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PreOrderDetailRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PreOrderDetailRequest.java new file mode 100644 index 0000000..325667b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PreOrderDetailRequest.java @@ -0,0 +1,49 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 预下单详情请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PreOrderRequest对象", description="预下单详情请求对象") +public class PreOrderDetailRequest { + + @ApiModelProperty(value = "购物车编号,购物车预下单时必填") + private Long shoppingCartId; + + @ApiModelProperty(value = "商品id(立即购买必填)") + private Integer productId; + + @ApiModelProperty(value = "商品规格属性id(立即购买、活动购买必填)") + private Integer attrValueId; + + @ApiModelProperty(value = "商品数量(立即购买、活动购买必填)") + private Integer productNum; + + @ApiModelProperty(value = "订单编号(再次购买必填)") + private String orderNo; + + @ApiModelProperty(value = "砍价商品id") + private Integer bargainId = 0; + + @ApiModelProperty(value = "用户砍价活动id") + private Integer bargainUserId = 0; + + @ApiModelProperty(value = "拼团商品id") + private Integer combinationId = 0; + + @ApiModelProperty(value = "拼团团长id") + private Integer pinkId = 0; + + @ApiModelProperty(value = "秒杀商品id") + private Integer seckillId = 0; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/PreOrderRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/PreOrderRequest.java new file mode 100644 index 0000000..1c8a0d9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/PreOrderRequest.java @@ -0,0 +1,29 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 预下单请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PreOrderRequest对象", description="预下单请求对象") +public class PreOrderRequest { + + @ApiModelProperty(value = "预下单类型(“shoppingCart”:购物车下单,“buyNow”:立即购买,”again“: 再次购买,”video“: 视频号商品下单)") + @NotBlank(message = "预下单类型不能为空") + private String preOrderType; + + @ApiModelProperty(value = "订单详情列表") + private List orderDetails; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ProductAddStockRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ProductAddStockRequest.java new file mode 100644 index 0000000..d1bca92 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ProductAddStockRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 商品添加库存对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductAddStockRequest对象", description="商品添加库存对象") +public class ProductAddStockRequest implements Serializable { + + private static final long serialVersionUID = -259657957101524526L; + + @ApiModelProperty(value = "商品ID", required = true) + @NotNull(message = "商品ID不能为空") + private Integer id; + + @Valid + @ApiModelProperty(value = "商品规格属性列表", required = true) + @NotEmpty(message = "商品规格属性列表不能为空") + private List attrValueList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ProductAttrValueAddStockRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ProductAttrValueAddStockRequest.java new file mode 100644 index 0000000..fcd32bd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ProductAttrValueAddStockRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 商品规格属性添加库存对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductAttrValueAddStockRequest对象", description="商品规格属性添加对象") +public class ProductAttrValueAddStockRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID", required = true) + @NotNull(message = "商品规格属性ID不能为空") + private Integer id; + + @ApiModelProperty(value = "商品规格属性添加库存", required = true) + @NotNull(message = "添加库存不能为空") + @Min(value = 0, message = "添加库存不能小于0") + private Integer addStock; + + @ApiModelProperty(value = "并发版本控制,前端不传值") + private Integer version; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ProductListRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ProductListRequest.java new file mode 100644 index 0000000..6fdfeb4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ProductListRequest.java @@ -0,0 +1,29 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品列表请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductListRequest对象", description="商品列表请求对象") +public class ProductListRequest implements Serializable { + + private static final long serialVersionUID = 3481659942630712958L; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; + + @ApiModelProperty(value = "分类id") + private Integer cid; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ProductRankingRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ProductRankingRequest.java new file mode 100644 index 0000000..509680b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ProductRankingRequest.java @@ -0,0 +1,38 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.Constants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 商品排行请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductRankingRequest对象", description="商品排行请求对象") +public class ProductRankingRequest implements Serializable { + + private static final long serialVersionUID = 3362714265772774491L; + + @ApiModelProperty(value = "排序参数:pageviews-浏览量,collectNum-收藏数,addCartNum-加购数,salesNum-销量,salesAmount-销售额") + @NotBlank(message = "请选择排序参数") + private String sortKey; + + @ApiModelProperty(value = "时间参数") + @NotBlank(message = "请先选择时间") + private String dateLimit; + + @ApiModelProperty(value = "页码", example= Constants.DEFAULT_PAGE + "") + private int page = Constants.DEFAULT_PAGE; + + @ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "") + private int limit = Constants.DEFAULT_LIMIT; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ProductRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ProductRequest.java new file mode 100644 index 0000000..814e3ba --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ProductRequest.java @@ -0,0 +1,37 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品搜索 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductRequest对象", description="商品搜索") +public class ProductRequest implements Serializable { + + private static final long serialVersionUID = 3481659942630712958L; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; + + @ApiModelProperty(value = "分类id") + private String cid; + + @ApiModelProperty(value = "价格排序", allowableValues = "range[asc,desc]") + private String priceOrder; + + @ApiModelProperty(value = "销量排序", allowableValues = "range[asc,desc]") + private String salesOrder; + + @ApiModelProperty(value = "是否新品") + private Boolean news; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/RegisterAppWxRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/RegisterAppWxRequest.java new file mode 100644 index 0000000..8e72209 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/RegisterAppWxRequest.java @@ -0,0 +1,50 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * App微信注册/登录请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RegisterAppWxRequest对象", description="App微信注册/登录请求对象") +public class RegisterAppWxRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户openId") + private String openId; + + @ApiModelProperty(value = "用户unionId") + private String unionId; + + @ApiModelProperty(value = "用户昵称", required = true) + private String nickName; + + @ApiModelProperty(value = "性别:0未知,1-男,2-女", required = true) + private String gender; + + @ApiModelProperty(value = "用户个人资料填写的省份") + private String province; + + @ApiModelProperty(value = "普通用户个人资料填写的城市") + private String city; + + @ApiModelProperty(value = "国家,如中国为CN") + private String country; + + @ApiModelProperty(value = "微信App用户头像", required = true) + private String avatarUrl; + + @ApiModelProperty(value = "微信App类型:iosWx-苹果微信,androidWx-安卓微信", required = true) + private String type; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/RegisterRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/RegisterRequest.java new file mode 100644 index 0000000..dfc8eed --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/RegisterRequest.java @@ -0,0 +1,53 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * @Author: pengsz + * @Date: 2025/11/11 + * @Description: + */ +@Data +public class RegisterRequest { + + @NotBlank(message = "姓名不能为空") + @ApiModelProperty(value = "姓名") + private String name; + + @NotBlank(message = "登录密码不能为空") + @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + @ApiModelProperty(value = "登录密码") + private String password; + + @NotBlank(message = "交易密码不能为空") + @Size(min = 6, message = "交易密码至少6位") + @ApiModelProperty(value = "交易密码") + private String tradePassword; + + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + @ApiModelProperty(value = "手机号") + private String phone; + + @NotBlank(message = "短信验证码不能为空") + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + @ApiModelProperty(value = "短信验证码") + private String validateCode; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "租户(公司)id") + private Long tenantId; // 公司ID + /** + * 机构名称(选填) + */ + @ApiModelProperty(value = "机构名称") + private String orgName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/RegisterThirdUserRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/RegisterThirdUserRequest.java new file mode 100644 index 0000000..cfe8481 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/RegisterThirdUserRequest.java @@ -0,0 +1,54 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户地址表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RegisterThirdUserRequest对象", description="三方用户注册对象") +public class RegisterThirdUserRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户昵称", required = true) + private String nickName; + + @ApiModelProperty(value = "性别", required = true) + private String sex; + + @ApiModelProperty(value = "用户个人资料填写的省份") + private String province; + + @ApiModelProperty(value = "普通用户个人资料填写的城市") + private String city; + + @ApiModelProperty(value = "国家,如中国为CN") + private String country; + + @ApiModelProperty(value = "微信小程序用户头像", required = true) + private String avatar; + + @ApiModelProperty(value = "推广人id") + @JsonProperty(value = "spread_spid", defaultValue = "0") + private Integer spreadPid; + + @ApiModelProperty(value = "微信公众号用户头像", required = true) + private String headimgurl; + + @ApiModelProperty(value = "用户类型:wechat-公众号,routine-小程序,h5-H5,iosWx-苹果微信,androidWx-安卓微信") + private String type; + + @ApiModelProperty(value = "用户openId") + private String openId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/RetailShopRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/RetailShopRequest.java new file mode 100644 index 0000000..a3dfed1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/RetailShopRequest.java @@ -0,0 +1,68 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 分销设置参数 + * + */ +@Data +public class RetailShopRequest { + + public RetailShopRequest() { + } + + @ApiModelProperty(value = "是否启用分销:1-启用,0-禁止") + @NotNull(message = "是否启用分销 不能为空") + private Integer brokerageFuncStatus; + +// @ApiModelProperty(value = "分销模式:1-指定分销,2-人人分销,3-满额分销") +// @NotNull(message = "分销模式 不能为空") +// private String storeBrokerageStatus; + + @ApiModelProperty(value = "分销额度:-1-关闭,0--用户购买金额大于等于设置金额时,用户自动成为分销员") + @NotNull(message = "分销额度 不能为空") + @Min(value = -1, message = "分销额度,不能小于-1") + private Integer storeBrokerageQuota; + + @ApiModelProperty(value = "一级返佣比例") + @NotNull(message = "一级返佣比例 不能为空") + @Range(min = 0, max = 100, message = "一级返佣比例请在0-100中选择") + private Integer storeBrokerageRatio; + + @ApiModelProperty(value = "二级返佣比例") + @NotNull(message = "二级返佣比例 不能为空") + @Range(min = 0, max = 100, message = "二级返佣比例在0-100中选择") + private Integer storeBrokerageTwo; + + @ApiModelProperty(value = "分销关系绑定:0-所有用户,1-新用户") + @NotNull(message = "分销关系绑定 不能为空") + private Integer brokerageBindind; + + @ApiModelProperty(value = "用户提现最低金额") + @NotNull(message = "用户提现最低金额 不能为空") + @DecimalMin(value = "0", message = "用户提现最低金额最小为0") + private BigDecimal userExtractMinPrice; + + @ApiModelProperty(value = "提现银行") + @NotNull(message = "提现银行 不能为空") + private String userExtractBank; + + @ApiModelProperty(value = "冻结时间") + @NotNull(message = "冻结时间 不能为空") + @Min(value = 0, message = "冻结时间最少为0天") + private Integer extractTime; + + @ApiModelProperty(value = "是否展示分销气泡:0-展示,1-展示") + @NotNull(message = "是否展示分销气泡 不能为空") + @Range(min = 0, max = 1, message = "是否展示分销气泡只能选择0-1") + private Integer storeBrokerageIsBubble; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/RetailShopStairUserRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/RetailShopStairUserRequest.java new file mode 100644 index 0000000..d6e2474 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/RetailShopStairUserRequest.java @@ -0,0 +1,34 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * 推广列表参数 + * + */ +@Data +@ApiModel(value = "RetailShopStairUserRequest对象", description = "推广等级参数") +public class RetailShopStairUserRequest { + + @ApiModelProperty(value = "搜索关键字") + private String nickName; + + @ApiModelProperty(value = "时间参数 today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + + // 类型 0 = 全部 1=一级推广人 2=二级推广人 + @ApiModelProperty(value = "类型 0 = 全部 1=一级推广人 2=二级推广人") + @NotNull(message = "推广人类型不能为空") + @Range(min = 0, max = 3, message = "请选择正确的用户类型") + private Integer type; + + @ApiModelProperty(value = "用户id") + @Min(value = 1, message = "用户id不能为空") + private Integer uid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SaveConfigRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SaveConfigRequest.java new file mode 100644 index 0000000..2480cd6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SaveConfigRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 保存config请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "SaveConfigRequest对象", description = "保存config请求对象") +public class SaveConfigRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "config值", required = true) + @NotBlank(message = "config值不能为空") + private String value; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobLogSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobLogSearchRequest.java new file mode 100644 index 0000000..ecfa169 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobLogSearchRequest.java @@ -0,0 +1,35 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 定时任务日志搜索请求参数 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ScheduleJobLogSearchRequest对象", description = "定时任务日志搜索请求参数") +public class ScheduleJobLogSearchRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "任务id") + private Integer jobId; + + @ApiModelProperty(value = "spring bean名称") + private String beanName; + + @ApiModelProperty(value = "方法名") + private String methodName; + + @ApiModelProperty(value = "任务状态 1:成功 0:失败") + private Integer status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobRequest.java new file mode 100644 index 0000000..2acc66a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ScheduleJobRequest.java @@ -0,0 +1,44 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 定时任务请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ScheduleJobRequest对象", description = "定时任务请求对象") +public class ScheduleJobRequest implements Serializable { + + private static final long serialVersionUID = -452373239606480650L; + + @ApiModelProperty(value = "任务id,编辑时必传") + private Integer jobId; + + @ApiModelProperty(value = "spring bean名称", required = true) + @NotBlank(message = "spring bean名称不能为空") + private String beanName; + + @ApiModelProperty(value = "方法名", required = true) + @NotBlank(message = "方法名不能为空") + private String methodName; + + @ApiModelProperty(value = "参数") + private String params; + + @ApiModelProperty(value = "cron表达式", required = true) + @NotBlank(message = "cron表达式不能为空") + private String cronExpression; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SearchAndPageRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SearchAndPageRequest.java new file mode 100644 index 0000000..2d46569 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SearchAndPageRequest.java @@ -0,0 +1,25 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.Constants; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 查询分页公共请求对象 + * + */ +@Data +public class SearchAndPageRequest { + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + + @ApiModelProperty(value = "页码", example= Constants.DEFAULT_PAGE + "") + private int page = Constants.DEFAULT_PAGE; + + @ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "") + private int limit = Constants.DEFAULT_LIMIT; + + @ApiModelProperty(value = "优惠券类型:1-手动领取,3-赠送券") + private Integer type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ServiceOpenRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ServiceOpenRequest.java new file mode 100644 index 0000000..d026d35 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ServiceOpenRequest.java @@ -0,0 +1,50 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 服务开通请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ServiceOpenRequest对象", description = "服务开通请求对象") +public class ServiceOpenRequest { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "服务类型:sms,短信;copy,产品复制;expr_query,物流查询;expr_dump,电子面单", required = true) + @NotBlank(message = "服务类型不能为空") + @StringContains(limitValues = {"sms","copy","expr_query","expr_dump"}, message = "未知的服务类型") + private String type; + + @ApiModelProperty(value = "短信签名,短信开通必填") + private String sign; + + @ApiModelProperty(value = "快递公司简称,电子面单开通必填") + private String com; + + @ApiModelProperty(value = "快递公司模板Id、电子面单开通必填") + private String tempId; + + @ApiModelProperty(value = "快递面单发货人姓名,电子面单开通必填") + private String toName; + + @ApiModelProperty(value = "快递面单发货人电话,电子面单开通必填") + private String toTel; + + @ApiModelProperty(value = "发货人详细地址,电子面单开通必填") + private String toAddress; + + @ApiModelProperty(value = "电子面单打印机编号,电子面单开通必填") + private String siid; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesFreeRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesFreeRequest.java new file mode 100644 index 0000000..146bef8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesFreeRequest.java @@ -0,0 +1,44 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 免费模版 Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_shipping_templates_free") +@ApiModel(value="ShippingTemplatesFreeRequest对象", description="免费") +public class ShippingTemplatesFreeRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "城市ID, 多个逗号分割。 全国 all", required = true, example = "1,2,3,4") + @NotNull(message = "请选择城市") + private String cityId; + + @ApiModelProperty(value = "城市名称描述") + private String title; + + @ApiModelProperty(value = "包邮件数", required = true, example = "1") +// @Min(value = 1, message = "请填写包邮件数") + @DecimalMin(value = "0.1", message = "包邮不能低于0.1") + private BigDecimal number; + + @ApiModelProperty(value = "包邮金额", required = true, example = "0.1") + @NotNull(message = "请填写包邮金额") + @DecimalMin(value = "0", message = "包邮金额不能低于0") + private BigDecimal price; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRegionRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRegionRequest.java new file mode 100644 index 0000000..21e4daf --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRegionRequest.java @@ -0,0 +1,51 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 运费模板区域请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ShippingTemplatesRegionRequest对象", description = "运费模板区域请求对象") +public class ShippingTemplatesRegionRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "城市ID(只要最后一级城市ID), 多个逗号分割。全国 0", required = true, example = "1,2,3,4") + @NotNull(message = "请选择城市") + private String cityId; + + @ApiModelProperty(value = "城市名称描述") + private String title; + + @ApiModelProperty(value = "首件", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "首件金额不能低于0.1") + private BigDecimal first; + + @ApiModelProperty(value = "首件运费", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "首件运费金额不能低于0.1") + private BigDecimal firstPrice; + + @ApiModelProperty(value = "续件", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "续件不能低于0.1") + private BigDecimal renewal; + + @ApiModelProperty(value = "续件运费", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "续件运费金额不能低于0.1") + private BigDecimal renewalPrice; + + @ApiModelProperty(value = "分组唯一值") + private String uniqid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRequest.java new file mode 100644 index 0000000..03209a1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesRequest.java @@ -0,0 +1,53 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 运费模板请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ShippingTemplatesRequest对象", description = "运费模板请求对象") +public class ShippingTemplatesRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "模板名称", required = true) + @NotBlank(message = "模板名称必须填写") + @Length(max = 200, message = "模板名称不能超过200个字符") + private String name; + + @ApiModelProperty(value = "计费方式 0(未选择),1(按件数), 2(按重量),3(按体积)", example = "0", required = true) + @NotNull(message = "计费方式必须选择") + @Range(min = 0, max = 3, message = "计费方式选择区间 1(按件数), 2(按重量),3(按体积)") + private Integer type; + + @ApiModelProperty(value = "包邮类型:0-全国包邮,1-部分包邮,2-自定义", example = "0", required = true) + @NotNull(message = "指定包邮必须选择") + @Range(min = 0, max = 2, message = "未知的包邮类型") + private Integer appoint; + + @ApiModelProperty(value = "排序", example = "0") + @NotNull(message = "排序数字必须填写") + @Range(min = 0, max = 9999, message = "排序范围为0~9999") + private Integer sort; + + @ApiModelProperty(value = "配送区域及运费,部分包邮、自定义模板时必传") + private List shippingTemplatesRegionRequestList; + + @ApiModelProperty(value = "包邮区域设置,自定义模板时有值传递") + private List shippingTemplatesFreeRequestList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesSearchRequest.java new file mode 100644 index 0000000..719e1df --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ShippingTemplatesSearchRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 模板搜索Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_shipping_templates") +@ApiModel(value="ShippingTemplatesSearchRequest对象", description="模板搜索") +public class ShippingTemplatesSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "模板名称") + private String keywords; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/ShopUploadImgRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/ShopUploadImgRequest.java new file mode 100644 index 0000000..c225f1e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/ShopUploadImgRequest.java @@ -0,0 +1,21 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 自定义组件上传图片请求对象 + * + */ +@Data +public class ShopUploadImgRequest { + + @ApiModelProperty(value = "0:media_id(目前只用于品牌申请品牌和类目),1:返回链接, 2:返回微信支付media_id图片要求") + private Integer respType; + + @ApiModelProperty(value = "0:图片流(resp_type=2需指定filename),1:图片url") + private Integer uploadType; + + @ApiModelProperty(value = "upload_type=1时必传") + private String imgUrl; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SmsApplyTempRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SmsApplyTempRequest.java new file mode 100644 index 0000000..63e204d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SmsApplyTempRequest.java @@ -0,0 +1,39 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 申请短信模板请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SmsApplyTempRequest对象", description="申请短信模板请求对象") +public class SmsApplyTempRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "模板标题") + @NotBlank(message = "模板标题不能为空") + private String title; + + @ApiModelProperty(value = "模板内容(仅内容,不需要签名)") + @NotBlank(message = "模板内容不能为空") + private String content; + + @ApiModelProperty(value = "模板类型:1验证码,2通知,3推广") + @NotNull(message = "模板类型不能为空") + @Range(min = 1, max = 3, message = "未知的模板类型") + private Integer type; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SmsModifySignRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SmsModifySignRequest.java new file mode 100644 index 0000000..b7127d4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SmsModifySignRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 短信修改签名请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "SmsModifySignRequest对象", description = "短信修改签名请求对象") +public class SmsModifySignRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "新的短信签名", required = true) + @NotBlank(message = "短信签名不能为空") + private String sign; + + @ApiModelProperty(value = "账号绑定的手机号", required = true) + @NotBlank(message = "手机号不能为空") + private String phone; + + @ApiModelProperty(value = "短信验证码", required = true) + @NotBlank(message = "短信验证码不能为空") + private String code; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainRequest.java new file mode 100644 index 0000000..a7b2ce3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainRequest.java @@ -0,0 +1,120 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 砍价商品Request + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreBargain对象", description="砍价表") +public class StoreBargainRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "砍价商品id|新增时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + @NotNull(message = "商品编号不能为空") + @Min(value = 1, message = "关联商品ID不能小于1") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + @NotBlank(message = "砍价活动名称不能为空") + @Length(max = 200, message = "砍价活动名称不能超过200个字符") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + @NotBlank(message = "砍价活动图片不能为空") + @Length(max = 150, message = "砍价活动图片不能超过150个字符") + private String image; + + @ApiModelProperty(value = "单位名称") + @NotBlank(message = "单位名称不能为空") + @Length(max = 16, message = "单位名称不能超过16个字符") + private String unitName; + + @ApiModelProperty(value = "砍价商品轮播图") + @NotBlank(message = "轮播图不能为空") + @Length(max = 2000, message = "砍价商品轮播图不能超过2000个字符") + private String images; + + @ApiModelProperty(value = "砍价开启时间") + @NotBlank(message = "砍价开启时间不能为空") + private String startTime; + + @ApiModelProperty(value = "砍价结束时间") + @NotBlank(message = "砍价结束时间不能为空") + private String stopTime; + + @ApiModelProperty(value = "砍价商品名称") + @NotBlank(message = "砍价商品名称不能为空") + @Length(max = 200, message = "砍价商品名称不能超过200个字符") + private String storeName; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal price; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "购买数量限制") + @NotNull(message = "购买数量限制不能为空") + @Min(value = 1, message = "购买数量限制必须大于0") + private Integer num; + +// @ApiModelProperty(value = "用户每次砍价的最大金额") +// private BigDecimal bargainMaxPrice; + +// @ApiModelProperty(value = "用户每次砍价的最小金额") +// private BigDecimal bargainMinPrice; + + @ApiModelProperty(value = "帮砍次数") + @NotNull(message = "帮砍次数不能为空") + @Min(value = 1, message = "帮砍次数必须大于0") + private Integer bargainNum; + + @ApiModelProperty(value = "砍价状态 0(到砍价时间不自动开启) 1(到砍价时间自动开启时间)") + @NotNull(message = "砍价活动状态不能为空") + private Boolean status; + +// @ApiModelProperty(value = "砍价活动简介") +// @NotBlank(message = "砍价活动简介不能为空") +// private String info; + +// @ApiModelProperty(value = "砍价规则") +// private String rule; + + @ApiModelProperty(value = "运费模板ID") + @NotNull(message = "运费模板ID不能为空") + private Integer tempId; + + @ApiModelProperty(value = "砍价活动发起人数") + @Min(value = 2, message = "砍价人数最少两人") + @Max(value = 9999, message = "砍价人数最多9999") + private Integer peopleNum; + + @ApiModelProperty(value = "商品属性") + @NotEmpty(message = "商品属性不能为空") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + @NotEmpty(message = "商品属性详情不能为空") + private List attrValue; + + @ApiModelProperty(value = "商品描述") + private String content; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainSearchRequest.java new file mode 100644 index 0000000..8d936f2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainSearchRequest.java @@ -0,0 +1,29 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 砍价商品查询Request + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreBargain对象", description="砍价表") +public class StoreBargainSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字 商品id或者名称") + private String keywords; + + @ApiModelProperty(value = "砍价状态 0(到砍价时间不自动开启) 1(到砍价时间自动开启时间)") + private Integer status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainUserSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainUserSearchRequest.java new file mode 100644 index 0000000..d728aab --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreBargainUserSearchRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户参与砍价查询Request + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_bargain_user") +@ApiModel(value="StoreBargainUser对象", description="用户参与砍价表") +public class StoreBargainUserSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "状态 1参与中 2 活动结束参与失败 3活动结束参与成功") + private Integer status; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationRequest.java new file mode 100644 index 0000000..a822fc8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationRequest.java @@ -0,0 +1,111 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 拼团商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCombinationRequest对象", description="拼团商品请求对象") +public class StoreCombinationRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团商品ID|新增时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "商品id") + @NotNull(message = "商品编号不能为空") + @Min(value = 1, message = "商品编号不能小于1") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + @NotNull(message = "商品主图不能为空") + @Length(max = 255, message = "推荐图不能超过255个字符") + private String image; + + @ApiModelProperty(value = "轮播图") + @NotNull(message = "轮播图不能为空") + @Length(max = 2000, message = "轮播图不能超过2000个字符") + private String images; + + @ApiModelProperty(value = "活动标题") + @NotNull(message = "拼团名称不能为空") + @Length(max = 200, message = "活动标题不能超过200个字符") + private String title; + + @ApiModelProperty(value = "参团人数") + @Min(value = 2, message = "拼团人数不能小于2") + @Max(value = 2000000000, message = "拼团人数不能大于2000000000") + private Long people; + +// @ApiModelProperty(value = "简介") +// @NotNull(message = "拼团简介不能为空") +// private String info; + + @ApiModelProperty(value = "活动状态") + @NotNull(message = "活动状态不能为空") + private Boolean isShow; + + @ApiModelProperty(value = "拼团开始时间") + @NotNull(message = "开始时间不能为空") + private String startTime; + + @ApiModelProperty(value = "拼团结束时间") + @NotNull(message = "结束时间不能为空") + private String stopTime; + + @ApiModelProperty(value = "拼团订单有效时间(小时)") + @NotNull(message = "拼团时效不能为空") + @Min(value = 1, message = "拼团订单有效时间不能小于1") + private Long effectiveTime; + + @ApiModelProperty(value = "单位名") + @NotNull(message = "单位不能为空") + @Length(max = 32, message = "单位名不能超过32个字符") + private String unitName; + + @ApiModelProperty(value = "运费模板ID") + @NotNull(message = "运费模板不能为空") + private Integer tempId; + + @ApiModelProperty(value = "购买数量") + @Min(value = 1, message = "购买数量限制不能小于1") + private Integer num; + + @ApiModelProperty(value = "单次购买数量") + @Min(value = 1, message = "单次购买数量限制不能小于1") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟成团数量") + @Min(value = 0, message = "虚拟成团数量不能小于0") + private Integer virtualRation; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + @NotEmpty(message = "商品属性不能为空") + private List attrValue; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "规格 0单 1多") + private Boolean specType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationSearchRequest.java new file mode 100644 index 0000000..5363c63 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCombinationSearchRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 拼团商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_combination") +@ApiModel(value="StoreCombination对象", description="拼团商品表") +public class StoreCombinationSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字 商品id或者名称") + private String keywords; + + @ApiModelProperty(value = "砍价状态 0(不开启) 1(开启)") + private Integer isShow; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCopyProductRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCopyProductRequest.java new file mode 100644 index 0000000..513b09a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCopyProductRequest.java @@ -0,0 +1,25 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 复制商品请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCopyProductRequest对象", description="复制商品请求对象") +public class StoreCopyProductRequest { + + @ApiModelProperty(value = "复制商品地址") + @NotBlank(message = "复制商品地址 不能为空") + private String url; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponRequest.java new file mode 100644 index 0000000..c296fd2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponRequest.java @@ -0,0 +1,94 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠卷表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon") +@ApiModel(value="StoreCouponRequest对象", description="优惠券表") +public class StoreCouponRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券名称", required = true) + @NotBlank(message = "请填写优惠券名称") + @Length(max = 64, message = "优惠券名称长度不能超过64个字符") + private String name; + + @ApiModelProperty(value = "兑换的优惠券面值", required = true) + @NotNull(message = "请填写优惠券兑换的优惠券面值") + @DecimalMax(value = "99999.99", message = "优惠券面值不能大于99999.99") + private BigDecimal money; + + @ApiModelProperty(value = "是否限量, 默认0 否, 1是", required = true) + @NotNull(message = "请设置是否限量") + private Boolean isLimited; + + @ApiModelProperty(value = "发放总数") + private Integer total; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + @Range(min = 1, max = 3, message = "请选择优惠券使用类型") + private Integer useType; + + @ApiModelProperty(value = "主键id 商品id/分类id", required = true) + private String primaryKey; + + @ApiModelProperty(value = "最低消费,0代表不限制", required = true) + @DecimalMax(value = "99999.99", message = "最低消费 面值不能大于99999.99") + private BigDecimal minPrice; + + @ApiModelProperty(value = "是否固定领取时间, 默认0 否, 1是", required = true) + @NotNull(message = "请选择领取是否限时") + private Boolean isForever; + + @ApiModelProperty(value = "可领取开始时间") + private Date receiveStartTime; + + @ApiModelProperty(value = "可领取结束时间") + private Date receiveEndTime; + + @ApiModelProperty(value = "请设置是否固定使用时间, 默认0 否, 1是", required = true) + @NotNull(message = "请设置是否固定使用时间") + private Boolean isFixedTime; + + @ApiModelProperty(value = "可使用时间范围 开始时间") + private Date useStartTime; + + @ApiModelProperty(value = "可使用时间范围 结束时间") + private Date useEndTime; + + @ApiModelProperty(value = "天数") + @Max(value = 999, message = "天数不能超过999天") + private Integer day; + + @ApiModelProperty(value = "优惠券类型 1 手动领取, 2 新人券, 3 赠送券") + @Range(min = 1, max = 3, message = "请选择优惠券领取方式") + private Integer type; + + @ApiModelProperty(value = "排序") + @NotNull(message = "排序不能为空") + @Min(value = 0, message = "排序不能小于0") + private Integer sort; + + @ApiModelProperty(value = "状态(0:关闭,1:开启)") + @NotNull(message = "优惠券状态不能为空") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponSearchRequest.java new file mode 100644 index 0000000..ce19fed --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponSearchRequest.java @@ -0,0 +1,37 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 优惠卷模板搜索 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon") +@ApiModel(value="StoreCouponSearchRequest对象", description="优惠券模板搜索") +public class StoreCouponSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "优惠券类型 1 手动领取, 2 新人券, 3 赠送券") + private Integer type; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "状态(0:关闭,1:开启)") + private Boolean status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserRequest.java new file mode 100644 index 0000000..8b9915a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserRequest.java @@ -0,0 +1,34 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 优惠券领取 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon_user") +@ApiModel(value="StoreCouponUserRequest对象", description="优惠券领取") +public class StoreCouponUserRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券发布id") + @NotNull(message = "优惠券id不能为空") + private Integer couponId; + + @ApiModelProperty(value = "领取人id, 多个id逗号分割") + @NotBlank(message = "领取人不能为空") + private String uid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserSearchRequest.java new file mode 100644 index 0000000..5b4cae1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreCouponUserSearchRequest.java @@ -0,0 +1,42 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 优惠卷领取搜索 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_coupon_user") +@ApiModel(value="StoreCouponUser对象", description="优惠券领取搜索") +public class StoreCouponUserSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券所属用户") + private Integer uid; + + @ApiModelProperty(value = "优惠券id") + private Integer couponId; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "状态(0:未使用,1:已使用, 2:已过期)") + private Integer status; + + @ApiModelProperty(value = "最低消费多少金额可用优惠券") + private BigDecimal minPrice; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreDateRangeSqlPram.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreDateRangeSqlPram.java new file mode 100644 index 0000000..45776c3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreDateRangeSqlPram.java @@ -0,0 +1,19 @@ +package com.yzt.common.request; + +import lombok.Data; + +/** + * 订单时间参数,开始时间结束时间 + * + */ +@Data +public class StoreDateRangeSqlPram { + + public StoreDateRangeSqlPram(String startTime, String endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + private String startTime; + private String endTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreNearRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreNearRequest.java new file mode 100644 index 0000000..a03b319 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreNearRequest.java @@ -0,0 +1,28 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 附近的门店 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreNearRequest对象", description="附近的门店") +public class StoreNearRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "纬度") + private String latitude; + + @ApiModelProperty(value = "经度") + private String longitude; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderRefundRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderRefundRequest.java new file mode 100644 index 0000000..b7c839d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderRefundRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; + +/** + * 订单退款表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderRefundRequest对象", description="订单退款") +public class StoreOrderRefundRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单编号") + @NotBlank(message = "订单编号不能为空") + private String orderNo; + + @ApiModelProperty(value = "退款金额") + @DecimalMin(value = "0.00", message = "退款金额不能少于0.00") + private BigDecimal amount; + + private Integer orderId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSearchRequest.java new file mode 100644 index 0000000..fe2f7c7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSearchRequest.java @@ -0,0 +1,41 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 订单列表请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_order") +@ApiModel(value="StoreOrderSearchRequest对象", description="订单列表请求对象") +public class StoreOrderSearchRequest implements Serializable { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "创建时间区间") + private String dateLimit; + + @ApiModelProperty(value = "订单状态(all 总数; 未支付 unPaid; 未发货 notShipped;待收货 spike;待评价 bargain;已完成 complete;待核销 toBeWrittenOff;退款中:refunding;已退款:refunded;已删除:deleted") + @StringContains(limitValues = {"all","unPaid","notShipped","spike","bargain","complete","toBeWrittenOff","refunding","refunded","deleted"}, message = "未知的订单状态") + private String status; + + @ApiModelProperty(value = "订单类型:0普通订单,1-视频号订单, 2-活动订单,3-全部商品") + @NotNull(message = "订单类型不能为空") + @Range(min = 0, max = 3, message = "未知的订单类型") + private Integer type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSendRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSendRequest.java new file mode 100644 index 0000000..749a86f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderSendRequest.java @@ -0,0 +1,66 @@ +package com.yzt.common.request; + +import com.yzt.common.request.onepass.OnePassShipmentCreateOrderRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 订单发货对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderSendRequest对象", description="订单发货对象") +public class StoreOrderSendRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单id") + private Integer id; + + @ApiModelProperty(value = "订单编号") + @NotBlank(message = "订单编号不能为空") + private String orderNo; + + @ApiModelProperty(value = "类型, express 发货,send 送货,fictitious虚拟", allowableValues = "express,send,fictitious", required = true) + @NotBlank(message = "请选择类型") + private String deliveryType; + + @ApiModelProperty(value = "快递公司名,发货类型必传") + private String expressName; + + @ApiModelProperty(value = "快递公司编码,发货类型必传") + private String expressCode; + + @ApiModelProperty(value = "快递单号,发货类型必传") + private String expressNumber; + + @ApiModelProperty(value = "发货记录类型,1快递发货、2电子面单, 3一号通-商家发货") + private String expressRecordType; + + @ApiModelProperty(value = "电子面单模板,电子面单必传") + private String expressTempId; + + @ApiModelProperty(value = "寄件人姓名,电子面单必传") + private String toName; + + @ApiModelProperty(value = "寄件人电话,电子面单必传") + private String toTel; + + @ApiModelProperty(value = "寄件人地址,电子面单必传") + private String toAddr; + + @ApiModelProperty(value = "送货人姓名,送货类型必传") + private String deliveryName; + + @ApiModelProperty(value = "送货人电话,送货类型必传") + private String deliveryTel; + + @ApiModelProperty(value = "商家发货一号通内置功能") + private OnePassShipmentCreateOrderRequest shipment; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStaticsticsRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStaticsticsRequest.java new file mode 100644 index 0000000..6515d39 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStaticsticsRequest.java @@ -0,0 +1,28 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.yzt.common.constants.Constants; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 订单统计详情request + * + */ +@Data +public class StoreOrderStaticsticsRequest { + @ApiModelProperty(value = "页码", example= Constants.DEFAULT_PAGE + "") + private int page = Constants.DEFAULT_PAGE; + + @ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "") + private int limit = Constants.DEFAULT_LIMIT; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + + @JsonIgnore + private String startTime; + + @JsonIgnore + private String endTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStatusSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStatusSearchRequest.java new file mode 100644 index 0000000..b5ab37c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderStatusSearchRequest.java @@ -0,0 +1,23 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 订单操作记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderStatusSearchRequest对象", description="订单操作记录公共查询对象") +public class StoreOrderStatusSearchRequest { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单编号") + private String orderNo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderUpdatePriceRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderUpdatePriceRequest.java new file mode 100644 index 0000000..952d873 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreOrderUpdatePriceRequest.java @@ -0,0 +1,35 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 订单修改对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderUpdatePriceRequest对象", description="订单修改价格请求对象") +public class StoreOrderUpdatePriceRequest { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单编号") + @NotBlank(message = "订单编号不能为空") + private String orderNo; + + @ApiModelProperty(value = "实际支付金额") + @NotNull(message = "实际支付金额不能为空") + @DecimalMin(value = "0.01", message = "实际支付金额不能小于1分") + private BigDecimal payPrice; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StorePinkRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StorePinkRequest.java new file mode 100644 index 0000000..928d587 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StorePinkRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 拼团表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_pink") +@ApiModel(value="StorePink对象", description="拼团表") +public class StorePinkRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团ID") + private Integer id; + + @ApiModelProperty(value = "拼团商品id") + private Integer cid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StorePinkSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StorePinkSearchRequest.java new file mode 100644 index 0000000..6de8bda --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StorePinkSearchRequest.java @@ -0,0 +1,41 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 拼团表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_pink") +@ApiModel(value="StorePink对象", description="拼团表") +public class StorePinkSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "状态1进行中2已完成3未完成") + private Integer status; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + + @ApiModelProperty(value = "客户昵称") + private String name; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "队列类型: 1-会员队列, 2-会馆队列") + private Integer queueType; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAddRequest.java new file mode 100644 index 0000000..00e1818 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAddRequest.java @@ -0,0 +1,124 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 商品添加对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product") +@ApiModel(value="StoreProductAddRequest对象", description="商品添加对象") +public class StoreProductAddRequest implements Serializable { + + private static final long serialVersionUID = -452373239606480650L; + + @ApiModelProperty(value = "商品id|添加时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "商品图片", required = true) + @NotBlank(message = "商品图片不能为空") + @Length(max = 255, message = "商品图片名称长度不能超过255个字符") + private String image; + + @ApiModelProperty(value = "轮播图", required = true) + @NotBlank(message = "轮播图不能为空") + @Length(max = 2000, message = "轮播图名称长度不能超过2000个字符") + private String sliderImage; + + @ApiModelProperty(value = "商品名称", required = true) + @NotBlank(message = "商品名称不能为空") + @Length(max = 128, message = "商品名称长度不能超过128个字符") + private String storeName; + +// @ApiModelProperty(value = "商品简介", required = true) +// @NotBlank(message = "商品简介不能为空") +// @Length(max = 256, message = "商品简介长度不能超过256个字符") +// private String storeInfo; + + @ApiModelProperty(value = "关键字", required = true) + @Length(max = 255, message = "关键字长度不能超过255个字符") + @NotBlank(message = "关键字不能为空") + private String keyword; + + @ApiModelProperty(value = "分类id|逗号分隔", required = true) + @NotBlank(message = "商品分类不能为空") + @Length(max = 64, message = "商品分类组合长度不能超过64个字符") + private String cateId; + + @ApiModelProperty(value = "单位名", required = true) + @NotBlank(message = "单位名称不能为空") + @Length(max = 32, message = "单位名长度不能超过32个字符") + private String unitName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否热卖") + private Boolean isHot; + + @ApiModelProperty(value = "是否优惠") + private Boolean isBenefit; + + @ApiModelProperty(value = "是否精品") + private Boolean isBest; + + @ApiModelProperty(value = "是否新品") + private Boolean isNew; + + @ApiModelProperty(value = "是否优品推荐") + private Boolean isGood; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "是否单独分佣", required = true) + @NotNull(message = "是否单独分佣不能为空") + private Boolean isSub; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "运费模板ID", required = true) + @NotNull(message = "运费模板不能为空") + private Integer tempId; + + @ApiModelProperty(value = "规格 0单 1多", required = true) + @NotNull(message = "商品规格类型不能为空") + private Boolean specType; + + @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团") + private List activity; + + @ApiModelProperty(value = "商品属性", required = true) + @NotEmpty(message = "商品属性不能为空") + private List attr; + + @ApiModelProperty(value = "商品属性详情", required = true) + @NotEmpty(message = "商品属性详情不能为空") + private List attrValue; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "优惠券id集合") + private List couponIds; + + @ApiModelProperty(value = "展示图") + @Length(max = 1000, message = "展示图名称长度不能超过1000个字符") + private String flatPattern; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrAddRequest.java new file mode 100644 index 0000000..f3fe227 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrAddRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品属性添加对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductAttrAddRequest对象", description="商品属性添加对象") +public class StoreProductAttrAddRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "attrID|新增时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "属性名", required = true) + private String attrName; + + @ApiModelProperty(value = "属性值|逗号分隔", required = true) + private String attrValues; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueAddRequest.java new file mode 100644 index 0000000..3446f8b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueAddRequest.java @@ -0,0 +1,105 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品属性值表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductAttrValueAddRequest对象", description="商品规格属性添加对象") +public class StoreProductAttrValueAddRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "商品ID|添加时为0,修改时为商品id", example = "0", required = true) + @Min(value = 0, message = "请选择商品") + private Integer productId; + + @ApiModelProperty(value = "商品规格属性库存", required = true) + @NotNull(message = "商品规格属性库存不能为空") + @Min(value = 0, message = "库存不能小于0") + private Integer stock; + + @ApiModelProperty(value = "sku|活动商品必传") + private String suk; + +// @ApiModelProperty(value = "销量", required = true) +// @NotNull(message = "销量不能为空") +// @Min(value = 0, message = "销量不能小于0") +// private Integer sales; + + @ApiModelProperty(value = "规格属性金额", required = true) + @NotNull(message = "规格属性金额不能为空") + @DecimalMin(value = "0", message = "金额不能小于0") + private BigDecimal price; + + @ApiModelProperty(value = "图片", required = true) + @NotBlank(message = "商品规格属性图片不能为空") + private String image; + + @ApiModelProperty(value = "成本价", required = true) + @NotNull(message = "规格属性成本价不能为空") + @DecimalMin(value = "0", message = "成本价不能小于0") + private BigDecimal cost; + + @ApiModelProperty(value = "原价", required = true) + @NotNull(message = "规格属性原价不能为空") + @DecimalMin(value = "0", message = "原价不能小于0") + private BigDecimal otPrice; + + @ApiModelProperty(value = "重量", required = true) + @NotNull(message = "规格属性重量不能为空") + @DecimalMin(value = "0", message = "重量不能小于0") + private BigDecimal weight; + + @ApiModelProperty(value = "体积", required = true) + @NotNull(message = "规格属性体积不能为空") + @DecimalMin(value = "0", message = "体积不能小于0") + private BigDecimal volume; + + @ApiModelProperty(value = "一级返佣", required = true) + @NotNull(message = "规格属性一级返佣不能为空") + @DecimalMin(value = "0", message = "一级返佣不能小于0") + private BigDecimal brokerage; + + @ApiModelProperty(value = "二级返佣", required = true) + @NotNull(message = "规格属性二级返佣不能为空") + @DecimalMin(value = "0", message = "二级返佣不能小于0") + private BigDecimal brokerageTwo; + + @ApiModelProperty(value = "attr_values 创建更新时的属性对应", required = true, example = "{\"尺码\":\"2XL\",\"颜色\":\"DX027白色\"}") + @NotBlank(message = "attr_values不能为空") + private String attrValue; + + @ApiModelProperty(value = "活动限购数量|活动商品专用字段") + private Integer quota; + + @ApiModelProperty(value = "活动限购数量显示|活动商品专用字段,添加时不传") + private Integer quotaShow; + +// @ApiModelProperty(value = "是否选中-秒杀用") +// private Boolean checked; + + @ApiModelProperty(value = "砍价商品最低价|砍价专用") + private BigDecimal minPrice; + + @ApiModelProperty(value = "商品条码") + private String barCode; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueRequest.java new file mode 100644 index 0000000..55653ea --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductAttrValueRequest.java @@ -0,0 +1,94 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品属性值表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductAttrValueRequest对象", description="商品属性值表") +public class StoreProductAttrValueRequest implements Serializable { + + private static final long serialVersionUID=1L; + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "商品ID", example = "0") + @Min(value = 0, message = "请选择商品") + private Integer productId; + + @ApiModelProperty(value = "商品属性索引值 (attr_value|attr_value[|....])") + private String suk; + + @ApiModelProperty(value = "属性对应的库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "属性金额") + private BigDecimal price; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "唯一值") + private String unique; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "商品条码") + private String barCode; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "一级返佣") + private BigDecimal brokerage; + + @ApiModelProperty(value = "二级返佣") + private BigDecimal brokerageTwo; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + @ApiModelProperty(value = "活动限购数量") + private Integer quota; + + @ApiModelProperty(value = "活动限购数量显示") + private Integer quotaShow; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "attrValue字段,前端传递后用作sku字段") + private String attrValue; + + @ApiModelProperty(value = "是否选中-秒杀用") + private Boolean checked; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductHeaderRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductHeaderRequest.java new file mode 100644 index 0000000..5616dec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductHeaderRequest.java @@ -0,0 +1,25 @@ +package com.yzt.common.request; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 商品管理头部统计-搜索条件 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class StoreProductHeaderRequest { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "分类ID, 多个逗号分隔") + private String cateId; + + @ApiModelProperty(value = "关键字搜索, 支持(商品名称, 关键字, 商品条码)") + private String keywords; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyAddRequest.java new file mode 100644 index 0000000..a0aa548 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyAddRequest.java @@ -0,0 +1,64 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 评论添加对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductReplyAddRequest对象", description="评论添加对象") +public class StoreProductReplyAddRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单编号, 移动端必须传递此参数") + private String orderNo; + + @ApiModelProperty(value = "用户id, 后端必须传递此参数") + private Integer userId; + + @ApiModelProperty(value = "商品id", required = true) + @Min(value = 1, message = "请选择商品") + private Integer productId; + + @ApiModelProperty(value = "商品 属性id") + private String unique; + + @ApiModelProperty(value = "商品分数", example = "5", required = true) + @Range(min = 1, max = 5, message = "商品分数为1-5") + private Integer productScore; + + @ApiModelProperty(value = "服务分数", example = "5", required = true) + @Range(min = 1, max = 5, message = "服务分数为1-5") + private Integer serviceScore; + + @ApiModelProperty(value = "评论内容", required = true) + @NotBlank(message = "请填写评论内容") + @Length(max = 512, message = "评论内容长度不能超过512个字符") + private String comment; + + @ApiModelProperty(value = "评论图片", required = true) + private String pics; + + @ApiModelProperty(value = "评论人头像 [虚拟评论参数]") + private String avatar; + + @ApiModelProperty(value = "评论人昵称 [虚拟评论参数]") + private String nickname; + + @ApiModelProperty(value = "商品规格属性值,多规格时用英文逗号拼接") + private String sku; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyCommentRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyCommentRequest.java new file mode 100644 index 0000000..2da05da --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplyCommentRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 回复商品评论对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductReplyCommentRequest对象", description="回复商品评论对象") +public class StoreProductReplyCommentRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "评论id", required = true) + @NotNull(message = "评论id不能为空") + private Integer ids; + + @ApiModelProperty(value = "管理员回复内容", required = true) + @NotBlank(message = "请填写评论内容") + private String merchantReplyContent; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplySearchRequest.java new file mode 100644 index 0000000..be453c1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductReplySearchRequest.java @@ -0,0 +1,34 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品评论查询对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductReplySearchRequest对象", description="商品评论查询对象") +public class StoreProductReplySearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品名称") + private String productSearch; + + @ApiModelProperty(value = "0未回复1已回复") + private Boolean isReply; + + @ApiModelProperty(value = "用户名称(支持模糊搜索)") + private String nickname; + + @ApiModelProperty(value = "时间区间") + private String dateLimit; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRequest.java new file mode 100644 index 0000000..9efe1d4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRequest.java @@ -0,0 +1,172 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 商品请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product") +@ApiModel(value="StoreProductRequest对象", description="商品请求对象") +public class StoreProductRequest implements Serializable { + + private static final long serialVersionUID = -452373239606480650L; + + @ApiModelProperty(value = "商品id") + private Integer id; + + @ApiModelProperty(value = "商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)") + private Integer merId; + + @ApiModelProperty(value = "商品图片") + @NotNull(message = "商拼图片不能为空") + private String image; + + @ApiModelProperty(value = "轮播图") + @NotNull(message = "轮播图不能为空") + private String sliderImage; + + @ApiModelProperty(value = "商品名称") + @NotNull(message = "商品名称不能为空") + private String storeName; + +// @ApiModelProperty(value = "商品简介") +// @NotNull(message = "商品简介不能为空") +// private String storeInfo; + + @ApiModelProperty(value = "关键字") + @NotNull(message = "关键字不能为空") + private String keyword; + + @ApiModelProperty(value = "商品条码(一维码)") + private String barCode; + + @ApiModelProperty(value = "分类id") + @NotNull(message = "分类id不能为空") + private String cateId; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "会员价格") + private BigDecimal vipPrice; + + @ApiModelProperty(value = "市场价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "单位名") + @NotNull(message = "单位名称不能为空") + private String unitName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "状态(0:未上架,1:上架)") + private Boolean isShow; + + @ApiModelProperty(value = "是否热卖") + private Boolean isHot; + + @ApiModelProperty(value = "是否优惠") + private Boolean isBenefit; + + @ApiModelProperty(value = "是否精品") + private Boolean isBest; + + @ApiModelProperty(value = "是否新品") + private Boolean isNew; + + @ApiModelProperty(value = "添加时间") + private Integer addTime; + + @ApiModelProperty(value = "是否包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "商户是否代理 0不可代理1可代理") + private Boolean merUse; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "秒杀状态 0 未开启 1已开启") + private Boolean isSeckill; + + @ApiModelProperty(value = "砍价状态 0未开启 1开启") + private Boolean isBargain; + + @ApiModelProperty(value = "是否优品推荐") + private Boolean isGood; + + @ApiModelProperty(value = "是否单独分佣") + private Boolean isSub; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "浏览量") + private Integer browse; + + @ApiModelProperty(value = "商品二维码地址(用户小程序海报)") + private String codePath; + + @ApiModelProperty(value = "淘宝京东1688类型") + private String soureLink; + + @ApiModelProperty(value = "主图视频链接") + private String videoLink; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "规格 0单 1多") + @NotNull(message = "商品规格不能为空") + private Boolean specType; + + @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团") + private List activity; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; + + @ApiModelProperty(value = "商品分类") + private List cateIds; + + @ApiModelProperty(value = "商品描述") +// @NotNull(message = "商品描述不能为空") + private String content; + + @ApiModelProperty(value = "优惠券id集合") + private List couponIds; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleRequest.java new file mode 100644 index 0000000..ed1bedd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleRequest.java @@ -0,0 +1,38 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 商品规则值(规格)表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_rule") +@ApiModel(value="StoreProductRuleRequest对象", description="商品规则值(规格)表") +public class StoreProductRuleRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "规则id") + private Integer id; + + @ApiModelProperty(value = "规格名称") + @NotBlank(message = "规格名称不能为空") + @Length(max = 32, message = "规格名称长度不能超过32个字符") + private String ruleName; + + @ApiModelProperty(value = "规格值【JSON字符串】 [{\\\"detail\\\": [\\\"string\\\"],\\\"title\\\": \\\"string\\\"}]") + @NotBlank(message = "规格值不能为空") + private String ruleValue; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleSearchRequest.java new file mode 100644 index 0000000..b48e63c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductRuleSearchRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品规则值(规格)表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_rule") +@ApiModel(value="StoreProductRuleSearchRequest对象", description="商品规则值(规格)表") +public class StoreProductRuleSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字") + private String keywords; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductSearchRequest.java new file mode 100644 index 0000000..2b2bf6c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductSearchRequest.java @@ -0,0 +1,47 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product") +@ApiModel(value="StoreProduct对象", description="商品表") +public class StoreProductSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "类型(1:出售中(已上架),2:仓库中(未上架),3:已售罄,4:警戒库存,5:回收站)") + @NotNull(message = "商品类型不能为空") + @Range(min = 1, max = 5, message = "未知的商品类型") + private int type; + + @ApiModelProperty(value = "分类ID, 多个逗号分隔") + private String cateId; + + @ApiModelProperty(value = "分类名称") + private String cateName; + + @ApiModelProperty(value = "关键字搜索, 支持(商品名称, 关键字, 商品条码)") + private String keywords; + + @ApiModelProperty(value = "价格排序", allowableValues = "range[asc,desc]") + private String priceOrder; + + @ApiModelProperty(value = "销量排序", allowableValues = "range[asc,desc]") + private String salesOrder; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreProductStockRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductStockRequest.java new file mode 100644 index 0000000..fd07d42 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreProductStockRequest.java @@ -0,0 +1,53 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * 商品库存 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductStockRequest对象", description="库存修改") +public class StoreProductStockRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品ID", required = true) + @NotEmpty(message = "请选择商品") + private Integer productId; + + private Integer seckillId; + + private Integer bargainId; + + private Integer combinationId; + + @ApiModelProperty(value = "商品属性ID集合", required = true) + @NotEmpty(message = "请选择商品属性id集合") + private Integer attrId; + + @ApiModelProperty(value = "类型, 增加 add | 减少 diff", required = true) + @NotBlank(message = "请选择类型") + private String operationType; + + @ApiModelProperty(value = "数量", required = true) + @Min(value = 0, message = "请填写数量") + private Integer num; + + @ApiModelProperty(value = "商品类型 0=普通 1=秒杀", required = false) + private Integer type; + + @ApiModelProperty(value = "商品SKU信息") + private String suk; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillAddRequest.java new file mode 100644 index 0000000..36729eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillAddRequest.java @@ -0,0 +1,100 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 秒杀商品添加请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreSeckillAddRequest对象", description="秒杀商品添加请求对象") +public class StoreSeckillAddRequest { + + @ApiModelProperty(value = "商品秒杀产品表id|新增时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "主商品id", required = true) + @NotNull(message = "主商品id不能为空") + private Integer productId; + + @ApiModelProperty(value = "推荐图", required = true) + @NotBlank(message = "推荐图不能为空") + @Length(max = 255, message = "推荐图名称长度不能超过255个字符") + private String image; + + @ApiModelProperty(value = "轮播图", required = true) + @NotBlank(message = "轮播图不能为空") + @Length(max = 2000, message = "轮播图长度不能超过2000个字符") + private String images; + + @ApiModelProperty(value = "活动标题", required = true) + @NotBlank(message = "活动标题不能为空") + @Length(max = 255, message = "活动标题长度不能超过255个字符") + private String title; + +// @ApiModelProperty(value = "简介", required = true) +// @NotBlank(message = "简介不能为空") +// @Length(max = 255, message = "简介长度不能超过255个字符") +// private String info; + + @ApiModelProperty(value = "单位名", required = true) + @NotBlank(message = "单位名不能为空") + @Length(max = 16, message = "单位名长度不能超过16个字符") + private String unitName; + + @ApiModelProperty(value = "开始时间", required = true) + @NotBlank(message = "开始时间不能为空") + private String startTime; + + @ApiModelProperty(value = "结束时间", required = true) + @NotBlank(message = "结束时间不能为空") + private String stopTime; + + @ApiModelProperty(value = "秒杀状态 0=关闭 1=开启", required = true) + @NotNull(message = "秒杀状态不能为空") + @Range(min = 0, max = 1, message = "未知的秒杀状态") + private Integer status; + + @ApiModelProperty(value = "当天参加秒杀次数", required = true) + @NotNull(message = "当天参加秒杀次数不能为空") + private Integer num; + + @ApiModelProperty(value = "时间段ID", required = true) + @NotNull(message = "时间段不能为空") + private Integer timeId; + + @ApiModelProperty(value = "运费模板ID", required = true) + @NotNull(message = "运费模板不能为空") + private Integer tempId; + + @ApiModelProperty(value = "商品属性", required = true) + @NotEmpty(message = "商品属性不能为空") + private List attr; + + @ApiModelProperty(value = "商品属性详情|只传选中项", required = true) + @NotEmpty(message = "商品属性详情不能为空") + private List attrValue; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "规格 0单 1多", required = true) + @NotNull(message = "规格类型不能为空") + private Boolean specType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerRequest.java new file mode 100644 index 0000000..5464091 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerRequest.java @@ -0,0 +1,57 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 秒杀商品管理Request对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreSeckillMangerRequest对象", description="") +public class StoreSeckillMangerRequest { + + @ApiModelProperty(value = "秒杀配置id") + private Integer id; + + @ApiModelProperty(value = "秒杀时段名称") + @NotBlank(message = "秒杀时段名称不能为空") + @Length(max = 255, message = "秒杀时段名称不能超过255个字符") + private String name; + +// @ApiModelProperty(value = "秒杀开始时间段") +// private Integer startTime; +// +// @ApiModelProperty(value = "秒杀结束时间段") +// private Integer endTime; + + @ApiModelProperty(value = "秒杀结束时间段") + @NotBlank(message = "秒杀时间段不能为空") + private String time; // 接收参数一个字段,入库时分割为startTime/endTime + + @ApiModelProperty(value = "主图") + private String img; + + @ApiModelProperty(value = "轮播图") + @NotBlank(message = "轮播图不能为空") + private String silderImgs; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态 '0'=关闭 '1'=开启") + @NotNull(message = "状态不能为空") + private String status; + + @ApiModelProperty(value = "0未删除1已删除") + private Boolean isDel; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerSearchRequest.java new file mode 100644 index 0000000..46375c7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillMangerSearchRequest.java @@ -0,0 +1,26 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 商品秒杀配置 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("StoreSeckillMangerSearchRequest") +@ApiModel(value="StoreSeckillMangerSearchRequest", description="商品秒杀配置") +public class StoreSeckillMangerSearchRequest { + + @ApiModelProperty(value = "秒杀名称") + private String name; + + @ApiModelProperty(value = "状态 '0'=关闭 '1'=开启") + private String status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillSearchRequest.java new file mode 100644 index 0000000..31637f9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/StoreSeckillSearchRequest.java @@ -0,0 +1,22 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 秒杀搜索参数 + * + */ +@Data +public class StoreSeckillSearchRequest { + + @ApiModelProperty(value = "搜索关键字 商品id或者名称") + private String keywords; + + @ApiModelProperty(value = "秒杀时段") + private Integer timeId; + + @ApiModelProperty(value = "是否显示关键字 0/1") + private Integer status; +} + diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminAddRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminAddRequest.java new file mode 100644 index 0000000..b4f0d31 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminAddRequest.java @@ -0,0 +1,60 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 后台管理员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_admin") +@ApiModel(value="SystemAdminAddRequest对象", description="后台管理员表") +public class SystemAdminAddRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "后台管理员账号", required = true) + @NotNull(message = "后台管理员账号不能为空") + @Length(max = 32, message = "账号长度不能超过32个字符") + private String account; + + @ApiModelProperty(value = "后台管理员密码", required = true) + @NotNull(message = "管理员密码不能为空") + @Length(max = 32, message = "密码长度不能超过32个字符") + private String pwd; + + @ApiModelProperty(value = "后台管理员姓名", required = true) + @NotNull(message = "管理姓名不能为空") + @Length(max = 16, message = "姓名长度不能超过16个字符") + private String realName; + + @ApiModelProperty(value = "后台管理员角色(menus_id)", required = true) + @NotNull(message = "后台管理员角色不能为空") + @Length(max = 128, message = "角色组合长度不能超过128个字符") + private String roles; + + @ApiModelProperty(value = "后台管理员状态 1有效0无效", required = true) + @NotNull(message = "status 字段不能为空") + @Range(min = 0, max = 1, message = "未知的状态") + private Boolean status; + + @ApiModelProperty(value = "手机号") + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "请填写正确的手机号") + private String phone; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginCaptchaRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginCaptchaRequest.java new file mode 100644 index 0000000..9a5138a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginCaptchaRequest.java @@ -0,0 +1,24 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * PC登录请求对象 行为验证码 + * + */ +@Data +public class SystemAdminLoginCaptchaRequest { + + @ApiModelProperty(required = true) + String captchaVerification; + + @ApiModelProperty(required = true) + String token; + + @ApiModelProperty(required = true) + String secretKey; + + +} + diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginRequest.java new file mode 100644 index 0000000..c939eb0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminLoginRequest.java @@ -0,0 +1,28 @@ +package com.yzt.common.request; + +import com.anji.captcha.model.vo.CaptchaVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotEmpty; + +/** + * PC登录请求对象 + * + */ +@Data +public class SystemAdminLoginRequest { + @ApiModelProperty(value = "后台管理员账号", example = "userName") + @NotEmpty(message = "账号 不能为空") + @Length(max = 32, message = "账号长度不能超过32个字符") + private String account; + + @ApiModelProperty(value = "后台管理员密码", example = "userPassword") + @NotEmpty(message = "密码 不能为空") + @Length(min = 6, max = 30 ,message = "密码长度在6-30个字符") + private String pwd; + + @ApiModelProperty(value = "行为验证码对象") + private CaptchaVO captchaVO; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminRequest.java new file mode 100644 index 0000000..5cd1f5f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 后台管理员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemAdminRequest对象", description="后台管理员请求对象") +public class SystemAdminRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "后台管理员姓名") + private String realName; + + @ApiModelProperty(value = "后台管理员权限(menus_id)") + private String roles; + + @ApiModelProperty(value = "后台管理员状态 1有效0无效") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminUpdateRequest.java new file mode 100644 index 0000000..cce4341 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAdminUpdateRequest.java @@ -0,0 +1,62 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 后台管理员修改对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemAdminUpdateRequest对象", description="后台管理员修改对象") +public class SystemAdminUpdateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "后台管理员表ID") + @NotNull(message = "管理员id不能为空") + private Integer id; + + @ApiModelProperty(value = "后台管理员账号", required = true) + @NotNull(message = "后台管理员账号不能为空") + @Length(max = 32, message = "账号长度不能超过32个字符") + private String account; + + @ApiModelProperty(value = "后台管理员密码", required = true) + @NotNull(message = "管理员密码不能为空") + @Length(max = 32, message = "密码长度不能超过32个字符") + private String pwd; + + @ApiModelProperty(value = "后台管理员姓名", required = true) + @NotNull(message = "管理姓名不能为空") + @Length(max = 16, message = "姓名长度不能超过16个字符") + private String realName; + + @ApiModelProperty(value = "后台管理员权限(menus_id)") + @NotBlank(message = "后台管理员权限不能为空") + @Length(max = 128, message = "角色组合长度不能超过128个字符") + private String roles; + + @ApiModelProperty(value = "后台管理员状态 1有效0无效") + @NotNull(message = "status 字段不能为空") + @Range(min = 0, max = 1, message = "未知的状态") + private Boolean status; + + @ApiModelProperty(value = "手机号码") + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "请填写正确的手机号") + private String phone; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentMoveRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentMoveRequest.java new file mode 100644 index 0000000..0d5d642 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentMoveRequest.java @@ -0,0 +1,24 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 系统附件移动Request对象 + * + */ +@Data +public class SystemAttachmentMoveRequest { + + + @ApiModelProperty(value = "父级id") + @NotNull(message = "父级id不能为空") + private Integer pid; + + @ApiModelProperty(value = "附件id") + @NotBlank(message = "请选择附件") + private String attrId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentRequest.java new file mode 100644 index 0000000..fa8f38f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemAttachmentRequest.java @@ -0,0 +1,47 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 系统附件类 + * + */ +@Data +public class SystemAttachmentRequest { + private static final long serialVersionUID=1L; + + private Integer attId; + + @ApiModelProperty(value = "附件名称") + private String name; + + @ApiModelProperty(value = "附件路径") + private String attDir; + + @ApiModelProperty(value = "压缩图片路径") + private String sattDir; + + @ApiModelProperty(value = "服务器上存储的绝对地址") + private String rootDir; + + @ApiModelProperty(value = "附件大小") + private String attSize; + + @ApiModelProperty(value = "附件类型") + private String attType; + + @ApiModelProperty(value = "模块,store") + private String model; + + @ApiModelProperty(value = "图片上传类型 1本地 2七牛云 3OSS 4COS ") + private Integer imageType; + + @ApiModelProperty(value = "图片上传模块类型 1 后台上传 2 用户生成") + private Integer moduleType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemCityRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemCityRequest.java new file mode 100644 index 0000000..69db7a5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemCityRequest.java @@ -0,0 +1,39 @@ +package com.yzt.common.request; + + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 城市表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_city") +@ApiModel(value="SystemCity对象", description="城市表") +public class SystemCityRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "父级id", required = true, example= "0") + @NotNull(message = "父级id不能为空") //不可为空 + @DecimalMin(value = "0", message = "父级id必须大于等于0") //数字最小值为0 + private Integer parentId; + + @ApiModelProperty(value = "名称") + @NotNull(message = "城市名称不能为空") + @Length(max = 100, message = "城市名称不能超过100个字符") + private String name; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemCitySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemCitySearchRequest.java new file mode 100644 index 0000000..2821497 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemCitySearchRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 城市表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_city") +@ApiModel(value="SystemCitySearchRequest对象", description="城市表列表搜索条件") +public class SystemCitySearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "父级id", required = true, example= "0") + @NotNull(message = "父级id不能为空") //不可为空 + @DecimalMin(value = "0", message = "父级id必须大于等于0") //数字最小值为0 + private Integer parentId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemConfigAdminRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemConfigAdminRequest.java new file mode 100644 index 0000000..48645e9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemConfigAdminRequest.java @@ -0,0 +1,48 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 系统配置请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemConfigAdminRequest对象", description="系统配置请求对象") +public class SystemConfigAdminRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "配置id") + @NotNull(message = "配置id不能为空") + private Integer id; + + @ApiModelProperty(value = "字段名称") + @NotBlank(message = "字段名称不能为空") + private String name; + + @ApiModelProperty(value = "字段提示文字") + @NotBlank(message = "字段提示文字不能为空") + private String title; + + @ApiModelProperty(value = "表单id") + @NotNull(message = "表单id不能为空") + private Integer formId; + + @ApiModelProperty(value = "值") + @NotBlank(message = "值不能为空") + private String value; + + @ApiModelProperty(value = "是否隐藏") + @NotNull(message = "状态不能为空") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemFormCheckRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormCheckRequest.java new file mode 100644 index 0000000..69c8edd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormCheckRequest.java @@ -0,0 +1,42 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.List; + +/** + * 整体保存表单数据 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemFormCheckRequest对象", description="整体保存表单数据") +public class SystemFormCheckRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "表单名称", required = true) + @Min(value = 0, message = "请选择表单") + private Integer id; + + @ApiModelProperty(value = "排序", required = true) + private Integer sort; + + @ApiModelProperty(value = "状态(1:开启;0:关闭;)") + private Boolean status; + + @ApiModelProperty(value = "字段值列表", required = true) + @NotEmpty(message = "fields 至少要有一组数据") + @Size(min = 1, message = "fields 至少要有一组数据") + private List fields; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemFormItemCheckRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormItemCheckRequest.java new file mode 100644 index 0000000..b88c1a6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormItemCheckRequest.java @@ -0,0 +1,34 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 配置表表单字段明细 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemFormItemCheckRequest对象", description="表单字段明细") +public class SystemFormItemCheckRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "字段名称", required = true) + @NotBlank(message = "请设置 SystemFormItemCheckRequest 对象的 name 属性") + private String name; + + @ApiModelProperty(value = "字段值", required = true) + private String value; + + @ApiModelProperty(value = "字段显示文字", required = true) + private String title; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempRequest.java new file mode 100644 index 0000000..6b2acd6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempRequest.java @@ -0,0 +1,41 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 表单模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_form_temp") +@ApiModel(value="SystemFormTempRequest对象", description="表单模板") +public class SystemFormTempRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "表单名称", required = true) + @NotBlank(message = "请填写表单名称") + @Length(max = 500, message = "表单名称长度不能超过500个字符") + private String name; + + @ApiModelProperty(value = "表单简介", required = true) + @NotBlank(message = "请填写表单简介") + @Length(max = 500, message = "表单简介长度不能超过500个字符") + private String info; + + @ApiModelProperty(value = "表单内容", required = true) + @NotBlank(message = "请填写表单内容") + private String content; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempSearchRequest.java new file mode 100644 index 0000000..a329bb5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemFormTempSearchRequest.java @@ -0,0 +1,28 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 表单模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_form_temp") +@ApiModel(value="SystemFormTempSearchRequest对象", description="表单模板") +public class SystemFormTempSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataRequest.java new file mode 100644 index 0000000..69864b3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 组合数据详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group_data") +@ApiModel(value="SystemGroupDataRequest对象", description="组合数据详情表") +public class SystemGroupDataRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "对应的数据组id") + private Integer gid; + + @ApiModelProperty(value = "表单数据") + private SystemFormCheckRequest form; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataSearchRequest.java new file mode 100644 index 0000000..47f9dec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupDataSearchRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 组合数据详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group_data") +@ApiModel(value="SystemGroupDataSearchRequest对象", description="组合数据详情表") +public class SystemGroupDataSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + @ApiModelProperty(value = "关键字") + private String keywords; + + @ApiModelProperty(value = "分组id") + private Integer gid; + + @ApiModelProperty(value = "状态(1:开启;2:关闭;)") + private Boolean status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupRequest.java new file mode 100644 index 0000000..9fd2165 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupRequest.java @@ -0,0 +1,37 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import java.io.Serializable; + +/** + * 组合数据表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group") +@ApiModel(value="SystemGroupRequest对象", description="组合数据表") +public class SystemGroupRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "数据组名称") + @Length(max = 50, message = "数据组名称长度不能超过50个字符") + private String name; + + @ApiModelProperty(value = "简介") + @Length(max = 256, message = "数据组名称长度不能超过256个字符") + private String info; + + @ApiModelProperty(value = "form 表单 id") + private Integer formId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupSearchRequest.java new file mode 100644 index 0000000..659eb76 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemGroupSearchRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 组合数据表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_group") +@ApiModel(value="SystemGroupSearchRequest对象", description="组合数据表") +public class SystemGroupSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "关键字") + private String keywords; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuRequest.java new file mode 100644 index 0000000..dac5b8f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuRequest.java @@ -0,0 +1,67 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + *

+ * 系统菜单请求对象 + *

+ * + * @author HZW + * @since 2021-11-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemMenu对象", description="系统菜单请求对象") +public class SystemMenuRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "菜单ID,新增时不填,修改时必填") + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @NotEmpty(message = "菜单名称不能为空") + @ApiModelProperty(value = "名称") + @Length(max = 100, message = "菜单名称不能超过100个字符") + private String name; + + @ApiModelProperty(value = "icon") + private String icon; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "组件路径") + private String component; + + @NotEmpty(message = "菜单类型不能为空") + @ApiModelProperty(value = "类型,M-目录,C-菜单,A-按钮") + @StringContains(limitValues = {"M","C","A"}, message = "未知的菜单类型") + private String menuType; + + @ApiModelProperty(value = "排序") + @NotNull(message = "排序不能为空") + @Min(value = 0, message = "排序最小为0") + private Integer sort; + + @ApiModelProperty(value = "显示状态") + @NotNull(message = "显示状态不能为空") + private Boolean isShow; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuSearchRequest.java new file mode 100644 index 0000000..d74e6db --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemMenuSearchRequest.java @@ -0,0 +1,23 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 菜单搜索Request对象 + * + */ +@Data +@ApiModel(value="SystemMenuSearchRequest对象", description="菜单搜索Request对象") +public class SystemMenuSearchRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "菜单名称") + private String name; + + @ApiModelProperty(value = "菜单类型:M-目录,C-菜单,A-按钮") + @StringContains(limitValues = {"M","C","A"}, message = "未知的菜单类型") + private String menuType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleRequest.java new file mode 100644 index 0000000..fcf9753 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleRequest.java @@ -0,0 +1,40 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 身份管理请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemRoleRequest对象", description="身份管理请求对象") +public class SystemRoleRequest implements Serializable { + + private static final long serialVersionUID = -7616469901068422271L; + + @ApiModelProperty(value = "角色id(添加时不填,修改时必填)") + private Integer id; + + @ApiModelProperty(value = "身份管理名称", required = true) + @NotNull(message = "身份管理名称不能为空") + @Length(max = 32, message = "身份管理名称不能超过32个字符") + private String roleName; + + @ApiModelProperty(value = "权限字符串(英文逗号拼接)", required = true) + @NotNull(message = "权限不能为空") + private String rules; + + @ApiModelProperty(value = "状态:0-关闭,1-正常", required = true) + @NotNull(message = "状态不能为空") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleSearchRequest.java new file mode 100644 index 0000000..4acc735 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemRoleSearchRequest.java @@ -0,0 +1,19 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 身份管理搜索Request对象 + * + */ +@Data +public class SystemRoleSearchRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "身份管理名称") + private String roleName; + + @ApiModelProperty(value = "状态") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreRequest.java new file mode 100644 index 0000000..e70215c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreRequest.java @@ -0,0 +1,66 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 门店自提 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemStoreRequest对象", description="提货点") +public class SystemStoreRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "门店名称") + @NotBlank(message = "请填写门店名称") + @Length(max = 100, message = "门店名称不能超过100个字符") + private String name; + + @ApiModelProperty(value = "简介") + private String introduction; + + @ApiModelProperty(value = "手机号码") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "手机号码格式错误") + private String phone; + + @ApiModelProperty(value = "提货点地址省市区") + @NotBlank(message = "提货点地址") + @Length(max = 255, message = "提货点地址不能超过255个字符") + private String address; + + @ApiModelProperty(value = "详细地址") + @NotBlank(message = "请填写详细地址") + @Length(max = 255, message = "详细地址不能超过255个字符") + private String detailedAddress; + + @ApiModelProperty(value = "每日营业开关时间") + private String dayTime; + + @ApiModelProperty(value = "门店logo") + @NotBlank(message = "请上传门店logo") + @Length(max = 255, message = "门店logo不能超过255个字符") + private String image; + + @ApiModelProperty(value = "纬度") + @NotBlank(message = "请选择经纬度") + private String latitude; + + @ApiModelProperty(value = "经度", example = "1,2") + private String longitude; + + @ApiModelProperty(value = "核销有效日期") + private String validTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreSearchRequest.java new file mode 100644 index 0000000..7fd3a86 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreSearchRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import java.io.Serializable; + +/** + * 提货点搜索 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store") +@ApiModel(value="SystemStoreSearchRequest对象", description="提货点搜索") +public class SystemStoreSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字,支持 门店名称|简介|手机号码||省市区|详细地址") + private String keywords; + + @ApiModelProperty(value = "状态,0隐藏,1显示,2回收站", example = "1") + @Range(min = 0, max = 2, message = "未知的状态") + private int status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreStaffRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreStaffRequest.java new file mode 100644 index 0000000..a6f01fe --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemStoreStaffRequest.java @@ -0,0 +1,54 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 门店店员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store_staff") +@ApiModel(value="SystemStoreStaff对象", description="门店店员表") +public class SystemStoreStaffRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "管理员 id") + @Min(value = 1, message = "请选择管理员") + private Integer uid; + + @ApiModelProperty(value = "管理员头像") + private String avatar; + + @ApiModelProperty(value = "提货点id") + @Min(value = 1, message = "请选择提货点") + private Integer storeId; + + @ApiModelProperty(value = "核销员 名称 [昵称]") + @NotBlank(message = "核销员名称不能为空") + @Length(max = 64,message = "核销员名称不能超过64个字符") + private String staffName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "核销开关") + private boolean verifyStatus = false; + + @ApiModelProperty(value = "状态") + private boolean status = false; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelRequest.java new file mode 100644 index 0000000..da869ac --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelRequest.java @@ -0,0 +1,61 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 设置用户等级表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_user_level") +@ApiModel(value="SystemUserLevelRequest对象", description="设置用户等级表") +public class SystemUserLevelRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "等级id") + private Integer id; + + @ApiModelProperty(value = "等级名称") + @NotBlank(message = "等级名称不能为空") + @Length(max = 50, message = "等级名称不能超过50个字符") + private String name; + + @ApiModelProperty(value = "达到多少升级经验") + @NotNull(message = "等级经验不能为空") + private Integer experience; + + @ApiModelProperty(value = "会员等级") + @NotNull(message = "会员等级不能为空") + @Min(value = 1, message = "会员等级最小为1") + private Integer grade; + + @ApiModelProperty(value = "享受折扣") + @NotNull(message = "折扣不能为空") + @Min(value = 1, message = "折扣值不能小于1") + @Max(value = 100, message = "折扣值不能大于100") + private Integer discount; + + @ApiModelProperty(value = "会员图标") + @NotBlank(message = "会员图标不能为空") + private String icon; + + @ApiModelProperty(value = "是否显示 1=显示,0=隐藏") + @NotNull(message = "是否显示不能为空") + private Boolean isShow; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelUpdateShowRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelUpdateShowRequest.java new file mode 100644 index 0000000..18620d0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemUserLevelUpdateShowRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 设置用户等级表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemUserLevelUpdateShowRequest对象", description="等级更改显示状态请求") +public class SystemUserLevelUpdateShowRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "等级id") + @NotNull(message = "等级id不能为空") + private Integer id; + + @ApiModelProperty(value = "是否显示 1=显示,0=隐藏") + @NotNull(message = "是否显示不能为空") + private Boolean isShow; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/SystemWriteOffOrderSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/SystemWriteOffOrderSearchRequest.java new file mode 100644 index 0000000..b65eaae --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/SystemWriteOffOrderSearchRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 核销 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemWriteOffOrderSearchRequest对象", description="核销订单搜索") +public class SystemWriteOffOrderSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "核销点ID") + private Integer storeId; + + @ApiModelProperty(value = "时间") + private String dateLimit; + + @ApiModelProperty(value = "关键字") + private String keywords; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/TenantPageRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/TenantPageRequest.java new file mode 100644 index 0000000..579e8af --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/TenantPageRequest.java @@ -0,0 +1,85 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: pengsz + * @Date: 2025/11/11 + * @Description: + */ +@Data +public class TenantPageRequest { + + @ApiModelProperty("租户id") + private Long tenantId; + + @ApiModelProperty("租户名称") + private String tenantName; + + @ApiModelProperty("租户名称(英文)") + private String tenantNameEn; + + @ApiModelProperty("租户编码") + private String code; + + @ApiModelProperty("租户供应商编码") + private String supplierCode; + + @ApiModelProperty("公司电话") + private String phone; + + @ApiModelProperty("营业执照") + private String creditCode; + + @ApiModelProperty("法人") + private String person; + + @ApiModelProperty("营业执照") + private String licenseUrl; + + @ApiModelProperty("状态 1正常 0停用/废弃") + @TableField(value = "status") + private Integer status; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("地址(英文)") + private String addressEn; + + @ApiModelProperty("用户数量") + private Integer userCount; + + @ApiModelProperty("企业logo") + private String logo; + + @ApiModelProperty("有效期") + private LocalDate expireDate; + + @ApiModelProperty("业务员(后台员工)") + private Long businessStaff; + + @ApiModelProperty("创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("创建人") + @TableField(value = "created_by", fill = FieldFill.INSERT) + private Long createdBy; + + @ApiModelProperty("修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedTime; + + @ApiModelProperty("创建时间-结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/TenantSaveRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/TenantSaveRequest.java new file mode 100644 index 0000000..b0afc0e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/TenantSaveRequest.java @@ -0,0 +1,72 @@ +package com.yzt.common.request; + +import com.yzt.common.vo.WechatMerchantConfigVo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDate; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +@Data +public class TenantSaveRequest { + + private Long tenantId; + + @ApiModelProperty("租户名称") + private String tenantName; + + @ApiModelProperty("租户名称(英文)") + private String tenantNameEn; + + @ApiModelProperty("租户简介") + private String introduction; + + @ApiModelProperty("租户编码") + private String code; + + @ApiModelProperty("公司电话") + private String phone; + + @ApiModelProperty("租户供应商编码") + private String supplierCode; + + @ApiModelProperty("营业执照") + private String creditCode; + + @ApiModelProperty("法人") + private String person; + + @ApiModelProperty("营业执照") + private String licenseUrl; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("地址(英文)") + private String addressEn; + + @ApiModelProperty("用户数量") + private Integer userCount; + + @ApiModelProperty("企业logo") + private String logo; + + @ApiModelProperty("有效期") + private LocalDate expireDate; + + @ApiModelProperty("业务员(后台员工)") + private Long businessStaff; + + @ApiModelProperty("协助内容") + private String helpContent; + + @ApiModelProperty("收款码") + private String wechatPayQrUrl; + + @ApiModelProperty("微信商户配置") + WechatMerchantConfigVo wechatMerchantConfigVo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UpdateSpreadUserRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UpdateSpreadUserRequest.java new file mode 100644 index 0000000..0a32a25 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UpdateSpreadUserRequest.java @@ -0,0 +1,24 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +/** + * @Author: pengsz + * @Date: 2025/11/27 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UpdateSpreadUserRequest", description="更新上级经销商对象") +public class UpdateSpreadUserRequest { + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + private String phone; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UpdateUserLevelRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UpdateUserLevelRequest.java new file mode 100644 index 0000000..497e4b1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UpdateUserLevelRequest.java @@ -0,0 +1,35 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 更新用户会员等级 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UpdateUserLevelRequest", description="更新用户会员等级对象") +public class UpdateUserLevelRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "uid") + @NotNull(message = "用户id不能为空") + private Integer uid; + + @ApiModelProperty(value = "会员等级") + @NotNull(message = "等级id不能为空") + private Integer levelId; + + @ApiModelProperty(value = "是否扣减积分,true-扣减,false-不扣减") + private Boolean isSub; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserAddressCityRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressCityRequest.java new file mode 100644 index 0000000..0073d1f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressCityRequest.java @@ -0,0 +1,39 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 用户地址详细对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserAddressCityRequest对象", description="用户地址详细对象") +public class UserAddressCityRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "收货人所在省", required = true) + @NotBlank(message = "收货人所在省不能为空") + private String province; + + @ApiModelProperty(value = "收货人所在市", required = true) + @NotBlank(message = "收货人所在市不能为空") + private String city; + + @ApiModelProperty(value = "城市id") + private Integer cityId = 0; + + @ApiModelProperty(value = "收货人所在区", required = true) + @NotBlank(message = "收货人所在区不能为空") + private String district; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserAddressDelRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressDelRequest.java new file mode 100644 index 0000000..ba1e8fd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressDelRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import java.io.Serializable; + +/** + * 用户地址表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserAddressDelRequest对象", description="用户地址") +public class UserAddressDelRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户地址id") + @Min(value = 1, message = "请选择用户地址") + private Integer id; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserAddressRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressRequest.java new file mode 100644 index 0000000..29346e1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserAddressRequest.java @@ -0,0 +1,57 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 新增用户地址对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserAddressRequest对象", description="新增用户地址对象") +public class UserAddressRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户地址id") + private Integer id; + + @ApiModelProperty(value = "姓名", required = true) + @NotBlank(message = "姓名不能为空") + @Length(max = 32, message = "收货人姓名不能超过32个字符") + private String realName; + + @ApiModelProperty(value = "电话", required = true) + @NotBlank(message = "电话不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "请填写正确的收货人电话") + private String phone; + + @ApiModelProperty(value = "收货人详细地址", required = true) + @Length(max = 256, message = "详细地址不能超过32个字符") + private String detail; + + @ApiModelProperty(value = "是否默认", example = "false", required = true) + private Boolean isDefault; + + @Valid + @ApiModelProperty(value = "城市信息", required = true) + private UserAddressCityRequest address; + + @ApiModelProperty(value = "'性别,0-未知,1-男,2-女,3-保密'") + private int sex; + + @ApiModelProperty(value = "客户类型") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserBankCardRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserBankCardRequest.java new file mode 100644 index 0000000..d59f7ef --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserBankCardRequest.java @@ -0,0 +1,66 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ +@Data +public class UserBankCardRequest { + + /** + * 持卡人姓名 + */ + @NotBlank(message = "持卡人姓名不能为空") + @Size(max = 50, message = "持卡人姓名长度不能超过50个字符") + @ApiModelProperty(value = "持卡人姓名") + private String holderName; + + /** + * 绑定手机号 + */ + @ApiModelProperty(value = "绑定手机号", required = true) + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + private String phone; + + /** + * 开户行(银行名称) + */ + @ApiModelProperty(value = "开户行", required = true) + @NotBlank(message = "开户行不能为空") + @Size(max = 100, message = "开户行名称长度不能超过100个字符") + private String bankName; + + /** + * 银行编码 + */ + @ApiModelProperty(value = "银行编码", required = true) + @NotBlank(message = "银行编码不能为空") + @Size(max = 20, message = "银行编码长度不能超过20个字符") + private String bankCode; + + /** + * 银行卡号 + */ + @ApiModelProperty(value = "银行卡号", required = true) + @NotBlank(message = "银行卡号不能为空") + @Pattern( + regexp = "^[1-9]\\d{15,29}$", + message = "银行卡号格式不正确(应为16-30位数字,且不能以0开头)" + ) + private String cardNo; + + /** + * 是否默认银行卡:0-否,1-是 + */ + @ApiModelProperty(value = "是否默认银行卡") + private Boolean isDefault; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserBindingPhoneUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserBindingPhoneUpdateRequest.java new file mode 100644 index 0000000..7c509a4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserBindingPhoneUpdateRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 换绑手机号请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserBindingPhoneUpdateRequest", description="换绑手机号请求对象") +public class UserBindingPhoneUpdateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "手机号", required = true) + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "手机号码格式错误") + private String phone; + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + private String captcha; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserCollectAllRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserCollectAllRequest.java new file mode 100644 index 0000000..329950f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserCollectAllRequest.java @@ -0,0 +1,34 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * 商品点赞和收藏表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductRelationRequest对象", description="商品点赞和收藏表") +public class UserCollectAllRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品ID") + @JsonProperty("id") + @Size(min = 1, message = "请选择产品") + private Integer[] productId; + + @ApiModelProperty(value = "产品类型|store=普通产品,product_seckill=秒杀产品(默认 普通产品 store)") + @NotBlank(message = "请选择产品类型") + private String category; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserCollectRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserCollectRequest.java new file mode 100644 index 0000000..2346473 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserCollectRequest.java @@ -0,0 +1,37 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 商品点赞和收藏表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_relation") +@ApiModel(value="UserCollectRequest对象", description="商品点赞和收藏表") +public class UserCollectRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品ID") + @JsonProperty("id") + @Min(value = 1, message = "请选择产品") + private Integer productId; + + @ApiModelProperty(value = "产品类型|store=普通产品,product_seckill=秒杀产品(默认 普通产品 store)") + @JsonProperty("category") + @NotBlank(message = "请选择产品类型") + private String category; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserCouponReceiveRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserCouponReceiveRequest.java new file mode 100644 index 0000000..655e370 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserCouponReceiveRequest.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 用户领取优惠券请求对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserCouponReceiveRequest对象", description="用户领取优惠券请求对象") +public class UserCouponReceiveRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券id") + @NotNull(message = "优惠券编号不能为空") + private Integer couponId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserCreateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserCreateRequest.java new file mode 100644 index 0000000..bda2775 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserCreateRequest.java @@ -0,0 +1,96 @@ +package com.yzt.common.request; + +/** + * @Author: pengsz + * @Date: 2025/11/26 + * @Description: + */ + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; +import java.io.Serializable; + +/** + * 用户创建请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserCreateRequest", description="用户创建请求对象") +public class UserCreateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @NotBlank(message = "姓名不能为空") + @ApiModelProperty(value = "姓名") + private String nickname; + + @NotBlank(message = "登录密码不能为空") + @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + @ApiModelProperty(value = "登录密码") + private String password; + + @NotBlank(message = "交易密码不能为空") + @Size(min = 6, message = "交易密码至少6位") + @ApiModelProperty(value = "交易密码") + private String tradePassword; + + @NotBlank(message = "手机号不能为空") + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "租户(公司)id") + private Long tenantId; // 公司ID + /** + * 机构名称(选填) + */ + @ApiModelProperty(value = "机构名称") + private String orgName; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "身份证号码") + private String cardId; + + @ApiModelProperty(value = "用户备注") + private String mark; + + @ApiModelProperty(value = "状态是否正常, 0 = 禁止, 1 = 正常") + @NotNull(message = "状态不能为空") + private Boolean status; + + @ApiModelProperty(value = "详细地址") + private String addres; + + @ApiModelProperty(value = "等级") + private Integer level; + + @ApiModelProperty(value = "用户分组id") + private String groupId; + + @ApiModelProperty(value = "用户标签id") + private String tagId; + + @ApiModelProperty(value = "是否为推广员") +// @NotNull(message = "是否为推广员不能为空") + private Boolean isPromoter; + +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserEditRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserEditRequest.java new file mode 100644 index 0000000..8fc3e3e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserEditRequest.java @@ -0,0 +1,45 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 用户编辑Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserEditRequest对象", description="修改个人资料") +public class UserEditRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户昵称") + @NotBlank(message = "请填写用户昵称") + @Length(max = 255, message = "用户昵称不能超过255个字符") + private String nickname; + + @ApiModelProperty(value = "用户头像") + @NotBlank(message = "请上传用户头像") + @Length(max = 255, message = "用户头像不能超过255个字符") + private String avatar; + + @ApiModelProperty(value = "机构名称") + @Length(max = 255, message = "用户头像不能超过255个字符") + private String orgName; + + @ApiModelProperty(value = "生日") + @Length(max = 255, message = "用户头像不能超过255个字符") + private String birthday; + + @ApiModelProperty(value = "性别") + private Integer sex; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserExtractRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserExtractRequest.java new file mode 100644 index 0000000..1a60735 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserExtractRequest.java @@ -0,0 +1,72 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户提现表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "UserExtractRequest对象", description = "用户提现") +public class UserExtractRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + + + @ApiModelProperty(value = "姓名") + @NotBlank(message = "提现用户名称必须填写") + @Length(max = 64, message = "提现用户名称不能超过64个字符") + @JsonProperty(value = "name") + private String realName; + + @ApiModelProperty(value = "提现方式| alipay=支付宝,bank=银行卡,weixin=微信", allowableValues = "range[alipay,weixin,bank]") + @NotBlank(message = "请选择提现方式, 支付宝|微信|银行卡") + private String extractType; + + @ApiModelProperty(value = "银行卡") + @JsonProperty(value = "cardum") + private String bankCode; + + @ApiModelProperty(value = "提现银行名称") + private String bankName; + + @ApiModelProperty(value = "支付宝账号") + private String alipayCode; + + @ApiModelProperty(value = "提现金额") + @JsonProperty(value = "money") + @NotNull(message = "请输入提现金额") + @DecimalMin(value = "0.01", message = "提现金额不能小于0.01") + private BigDecimal extractPrice; + + @ApiModelProperty(value = "微信号") + private String wechat; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "微信收款码") + private String qrcodeUrl; + + @ApiModelProperty(value = "是否从余额(now_money)提现") + @JsonProperty(value = "fromNowMoney") + private Boolean fromNowMoney; + + @ApiModelProperty(value = "交易密码") + private String tradePassword; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserExtractSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserExtractSearchRequest.java new file mode 100644 index 0000000..cebb7c6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserExtractSearchRequest.java @@ -0,0 +1,49 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户提现表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_extract") +@ApiModel(value="UserExtract对象", description="用户提现表") +public class UserExtractSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "客户名称(模糊查询)") + private String keywords; + + @ApiModelProperty(value = "bank = 银行卡 alipay = 支付宝 weixin = 微信") + private String extractType; + + @ApiModelProperty(value = "-1 未通过 0 审核中 1 已提现") + private Integer status; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "身份类型(用户等级)") + private Integer level; + + @ApiModelProperty(value = "审核时间范围") + private String auditDateLimit; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserGroupRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserGroupRequest.java new file mode 100644 index 0000000..57edf0a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserGroupRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 用户分组表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_group") +@ApiModel(value="UserGroup对象", description="用户分组表") +public class UserGroupRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户分组名称") + @NotBlank(message = "请填写分组名称") + @Length(max = 64, message = "用户分组名称不能超过64个字符") + private String groupName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserIntegralTransferRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserIntegralTransferRequest.java new file mode 100644 index 0000000..c7ebee1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserIntegralTransferRequest.java @@ -0,0 +1,43 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 用户积分转让请求 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserIntegralTransferRequest", description="用户积分转让请求") +public class UserIntegralTransferRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "收款人手机号") + @NotBlank(message = "请输入收款人手机号") + private String phone; + + @ApiModelProperty(value = "转让积分") + @NotNull(message = "请输入转让积分") + @Min(value = 1, message = "转让积分必须大于0") + private Integer integral; + + @ApiModelProperty(value = "交易密码") + @NotBlank(message = "请输入交易密码") + private String tradePassword; + + @ApiModelProperty(value = "转账类型:integral-积分,now_money-余额") + @NotBlank(message = "请输入转账类型") + private String transferType; +} + + diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditQueryRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditQueryRequest.java new file mode 100644 index 0000000..b8cfff0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditQueryRequest.java @@ -0,0 +1,40 @@ +package com.yzt.common.request; + +/** + * @Author: pengsz + * @Date: 2025/11/28 + * @Description: + */ + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 用户等级晋升审核请求 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "UserLevelUpgradeAuditQueryRequest", description = "用户等级晋升审核查询请求") +public class UserLevelUpgradeAuditQueryRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "审核备注") + private String auditRemark; + + @ApiModelProperty("客户名称") + private String userName; + + @ApiModelProperty("手机号(用于搜索)") + private String phone; + + @ApiModelProperty("1=待审核 2=通过 3=拒绝") + private Integer status; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditRequest.java new file mode 100644 index 0000000..9ceacd3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserLevelUpgradeAuditRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 用户等级晋升审核请求 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "UserLevelUpgradeAuditRequest", description = "用户等级晋升审核请求") +public class UserLevelUpgradeAuditRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "审核记录ID", required = true) + @NotNull(message = "审核记录ID不能为空") + private Long id; + + @ApiModelProperty(value = "审核备注") + private String auditRemark; + + @ApiModelProperty(value = "营业执照URL") + private String businessLicenseUrl; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserOperateIntegralMoneyRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserOperateIntegralMoneyRequest.java new file mode 100644 index 0000000..a1307ef --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserOperateIntegralMoneyRequest.java @@ -0,0 +1,51 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.*; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 资金操作 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="资金操作", description="资金操作") +public class UserOperateIntegralMoneyRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "uid") + @NotNull + @Min(value = 1, message = "请输入正确的uid") + private Integer uid; + + @ApiModelProperty(value = "积分类型, 1 = 增加, 2 = 减少") + @NotNull + @Range(min = 1, max = 2, message = "请选择正确的类型, 【1 = 增加, 2 = 减少】") + private Integer integralType; + + @ApiModelProperty(value = "积分") + @Min(value = 0) + @Max(value = 999999) + private Integer integralValue; + + @ApiModelProperty(value = "余额类型, 1 = 增加, 2 = 减少") + @NotNull + @Range(min = 1, max = 2, message = "请选择正确的类型, 【1 = 增加, 2 = 减少】") + private Integer moneyType; + + @ApiModelProperty(value = "余额") + @DecimalMin(value = "0.00") + @DecimalMax(value = "999999.99") + private BigDecimal moneyValue; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserPasswordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserPasswordRequest.java new file mode 100644 index 0000000..97c8799 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserPasswordRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Pattern; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserPasswordRequest", description="修改密码") +public class UserPasswordRequest { + + @ApiModelProperty(value = "密码", required = true) + @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + private String password; + + @ApiModelProperty(value = "密码", required = true) + private String repeatPassword; + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + @JsonProperty(value = "captcha") + private String validateCode; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationRequest.java new file mode 100644 index 0000000..8aecc40 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationRequest.java @@ -0,0 +1,45 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @Author: pengsz + * @Date: 2025/11/18 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="充值申请", description="充值申请") +public class UserRechargeApplicationRequest { + + @ApiModelProperty(value = "充值金额") +// @DecimalMin(value = "1", message = "充值金额不能小于1") todo 测试完后放开 + private BigDecimal amount; + + //payment_proof_url + @ApiModelProperty(value = "支付凭证") + private String paymentProofUrl; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty("状态:0-待处理,1-已审核,2-已拒绝") + private Integer status; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty("主键ID") + private Long id; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationSearchRequest.java new file mode 100644 index 0000000..50da1a4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeApplicationSearchRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Author: pengsz + * @Date: 2025/12/01 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="充值申请", description="充值申请") +public class UserRechargeApplicationSearchRequest { + + @ApiModelProperty("状态:0-待处理,1-已审核,2-已拒绝") + private Integer status; + + @ApiModelProperty(value = "客户昵称") + private String name; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeRequest.java new file mode 100644 index 0000000..e49ecd6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeRequest.java @@ -0,0 +1,52 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 充值 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeRequest对象", description="充值") +public class UserRechargeRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "充值金额") +// @DecimalMin(value = "1", message = "充值金额不能小于1") todo 测试完后放开 + private BigDecimal price; + + @ApiModelProperty(value = "选择金额组合数据id") + @JsonProperty(value = "rechar_id") + private Integer groupDataId; + + @ApiModelProperty(value = "支付方式| weixin = 微信,alipay = 支付宝") + private String payType = "weixin"; + + @ApiModelProperty(value = "来源 | public = 微信公众号, weixinh5 =微信H5支付, routine = 小程序,weixinAppIos-微信appios支付,weixinAppAndroid-微信app安卓支付,alipay-支付包支付,appAliPay-App支付宝支付") + @JsonProperty(value = "from") + private String fromType; + + @ApiModelProperty(value = "客户端ip") + @JsonIgnore + private String clientIp; + + @ApiModelProperty(value = "用户id") + @JsonIgnore + private Integer userId; + + @ApiModelProperty(value = "赠送金额") + @JsonIgnore + private BigDecimal givePrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeSearchRequest.java new file mode 100644 index 0000000..653525d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserRechargeSearchRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户充值记录查询对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeSearchRequest对象", description="用户充值记录查询对象") +public class UserRechargeSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "搜索关键字") + private String keywords; + + @ApiModelProperty(value = "today,yesterday,lately7,lately30,month,year,/yyyy-MM-dd hh:mm:ss,yyyy-MM-dd hh:mm:ss/") + private String dateLimit; + + @ApiModelProperty(value = "用户uid") + private Integer uid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserSearchRequest.java new file mode 100644 index 0000000..6cfc3ec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserSearchRequest.java @@ -0,0 +1,81 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 用户表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user") +@ApiModel(value="User对象", description="用户表") +public class UserSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + + @ApiModelProperty(value = "关键字") + private String keywords; + + @ApiModelProperty(value = "时间") + private String dateLimit; + + @ApiModelProperty(value = "用户分组") + private String groupId; + + @ApiModelProperty(value = "用户标签") + private String labelId; + + @ApiModelProperty(value = "用户登陆类型,h5 = h5, wechat = wechat,routine = routine", allowableValues = "range[h5,wechat,routine]") + @StringContains(limitValues = {"h5","wechat","routine"}, message = "请选择正确的用户登录类型") + private String userType; + + @ApiModelProperty(value = "状态是否正常, 0 = 禁止, 1 = 正常") + private Boolean status = null; + + @ApiModelProperty(value = "是否为推广员, 0 = 禁止, 1 = 正常") + private Boolean isPromoter = null; + + @ApiModelProperty(value = "消费情况") + private String payCount; + + @ApiModelProperty(value = "等级") + private String level; + + //时间类型 + @ApiModelProperty(value = "访问情况, 0 = 全部, 1 = 首次, 2 = 访问过, 3 = 未访问", allowableValues = "range[0,1,2,3]") + @NotNull(message = "访问情况不能为空") + private Integer accessType = 0; + + @ApiModelProperty(value = "国家,中国CN,其他OTHER") + private String country; + + @ApiModelProperty(value = "省份") + private String province; + + @ApiModelProperty(value = "城市") + private String city; + + @ApiModelProperty(value = "性别,0未知,1男,2女,3保密") + private String sex; + + @ApiModelProperty(value = "uid集合") + private List uids; + + @ApiModelProperty(value = "uid用户") + private Integer uid; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserSpreadPeopleRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserSpreadPeopleRequest.java new file mode 100644 index 0000000..2a56bf3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserSpreadPeopleRequest.java @@ -0,0 +1,43 @@ +package com.yzt.common.request; + +import com.yzt.common.annotation.StringContains; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import java.io.Serializable; + +/** + * 用户表 推广人 Request + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadPeopleRequest对象", description="推广用户") +public class UserSpreadPeopleRequest implements Serializable { + + private static final long serialVersionUID=1L; + + + @ApiModelProperty(value = "推荐人类型|0=一级|1=二级", allowableValues = "range[0,1]") + @Range(min = 0, max = 1, message = "推荐人类型必须在 0(一级),1(二级) 中选择") + private Integer grade = 0; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; + + @ApiModelProperty(value = "排序, 排序|childCount=团队排序,numberCount=金额排序,orderCount=订单排序", allowableValues = "range[childCount,numberCount,orderCount]") + @StringContains(limitValues = {"childCount", "numberCount", "orderCount"}, message = "未知的排序规则") + private String sortKey; + + @ApiModelProperty(value = "排序值 DESC ASC") + @StringContains(limitValues = {"DESC", "ASC"}, message = "未知的排序值") + private String isAsc = "DESC"; + + @ApiModelProperty(value = "用户id") + private Integer uid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserTagRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserTagRequest.java new file mode 100644 index 0000000..549b9f1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserTagRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 用户分组表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserTagRequest对象", description="会员标签") +public class UserTagRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "标签名称") + @NotBlank(message = "请填写标签名称") + @Length(max = 50, message = "标签名称不能超过50个字符") + private String name; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserTradePasswordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserTradePasswordRequest.java new file mode 100644 index 0000000..1a02e15 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserTradePasswordRequest.java @@ -0,0 +1,32 @@ +package com.yzt.common.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Pattern; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserTradePasswordRequest", description="修改交易密码") +public class UserTradePasswordRequest { + @ApiModelProperty(value = "密码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "必须为6位数字") + private String tradePassword; + + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "验证码格式错误,验证码必须为6位数字") + @JsonProperty(value = "captcha") + private String validateCode; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateRequest.java new file mode 100644 index 0000000..2af0704 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateRequest.java @@ -0,0 +1,89 @@ +package com.yzt.common.request; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 用户更新请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserUpdateRequest", description="用户更新请求对象") +public class UserUpdateRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @NotBlank(message = "客户姓名不能为空") + @ApiModelProperty(value = "姓名") + private String nickname; + +// @NotBlank(message = "登录密码不能为空") +// @Pattern(regexp = RegularConstants.PASSWORD, message = "密码格式错误,密码必须以字母开头,长度在6~18之间,只能包含字符、数字和下划线") + @Pattern( + regexp = "^(\\w{6,18})?$", + message = "密码格式错误,必须以字母开头,6~18位,仅含字母、数字、下划线" + ) + @ApiModelProperty(value = "登录密码(可选)") + private String password; + +// @Size(min = 6, message = "交易密码至少6位" + @Pattern(regexp = "^(.{6,})?$", message = "交易密码至少6位") + @ApiModelProperty(value = "交易密码") + private String tradePassword; + + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确") + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "机构名称") + private String orgName; + + @ApiModelProperty(value = "uid") + private Integer uid; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "身份证号码") + private String cardId; + + @ApiModelProperty(value = "用户备注") + private String mark; + + @ApiModelProperty(value = "状态是否正常, 0 = 禁止, 1 = 正常") + @NotNull(message = "状态不能为空") + private Boolean status; + + @ApiModelProperty(value = "详细地址") + private String addres; + +// @ApiModelProperty(value = "等级") +// private Integer level; + + @ApiModelProperty(value = "用户分组id") + private String groupId; + + @ApiModelProperty(value = "用户标签id") + private String tagId; + + @ApiModelProperty(value = "是否为推广员") + @NotNull(message = "是否为推广员不能为空") + private Boolean isPromoter; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateSpreadRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateSpreadRequest.java new file mode 100644 index 0000000..98b578e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/UserUpdateSpreadRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 更新推广人请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserUpdateSpreadRequest对象", description="更新推广人请求对象") +public class UserUpdateSpreadRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户编号") + @NotNull(message = "请选择用户") + private Integer userId; + + @ApiModelProperty(value = "用户头像") + @NotBlank(message = "请选择用户头像") + private String image; + + @ApiModelProperty(value = "推广人编号") + @NotNull(message = "请选择推广人") + private Integer spreadUid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/VideoOrderSendRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/VideoOrderSendRequest.java new file mode 100644 index 0000000..a993654 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/VideoOrderSendRequest.java @@ -0,0 +1,33 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 视频订单发货对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="VideoOrderSendRequest对象", description="视频订单发货对象") +public class VideoOrderSendRequest { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单编号") + @NotBlank(message = "订单编号不能为空") + private String orderNo; + + @ApiModelProperty(value = "快递公司ID") + @NotBlank(message = "快递公司ID不能为空") + private String deliveryId; + + @ApiModelProperty(value = "快递单号") + @NotBlank(message = "快递单号不能为空") + private String waybillId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/WechatProgramMyTempSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/WechatProgramMyTempSearchRequest.java new file mode 100644 index 0000000..7a7051f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/WechatProgramMyTempSearchRequest.java @@ -0,0 +1,36 @@ +package com.yzt.common.request; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 小程序我的模板 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WechatProgramMyTempSearchRequest对象", description="小程序我的模板") +public class WechatProgramMyTempSearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "模版标题") + private String title; + + @ApiModelProperty(value = "我的模板id") + private String tempId; + + @ApiModelProperty(value = "状态 0,禁用,1启用") + private Boolean status; + + @ApiModelProperty(value = "应用场景") + private String type; + + private Integer id; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/WechatReplyRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/WechatReplyRequest.java new file mode 100644 index 0000000..b304816 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/WechatReplyRequest.java @@ -0,0 +1,45 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 微信关键字回复表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_reply") +@ApiModel(value="WechatReplyRequest对象", description="微信关键字回复表") +public class WechatReplyRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "关键字id") + private Integer id; + + @ApiModelProperty(value = "关键字") + @NotBlank(message = "请填写关键字, 关注 = subscribe, 默认 = default") + private String keywords; + + @ApiModelProperty(value = "回复类型 text=文本 image =图片 news =图文 voice =音频" , example = "text") + @NotBlank(message = "请选择回复类型") + private String type; + + @ApiModelProperty(value = "回复数据") + @NotBlank(message = "请填写回复数据") + private String data; + + @ApiModelProperty(value = "回复状态 0=不可用 1 =可用", example = "1") + @NotNull(message = "请选择回复状态") + private Boolean status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/WechatReplySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/WechatReplySearchRequest.java new file mode 100644 index 0000000..2d2ea53 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/WechatReplySearchRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 微信关键字回复表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_wechat_reply") +@ApiModel(value="WechatReply对象", description="微信关键字回复表") +public class WechatReplySearchRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "关键字") + private String keywords; + + @ApiModelProperty(value = "回复类型 text=文本 image =图片 news =图文 voice =音频" , example = "text") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/WxBindingPhoneRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/WxBindingPhoneRequest.java new file mode 100644 index 0000000..73b0a1d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/WxBindingPhoneRequest.java @@ -0,0 +1,50 @@ +package com.yzt.common.request; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 微信绑定手机号请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WxBindingPhoneRequest", description="微信绑定手机号请求对象") +public class WxBindingPhoneRequest implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "手机号", required = true) + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "请输入正确的手机号") + private String phone; + + @ApiModelProperty(value = "验证码", required = true) + @Pattern(regexp = RegularConstants.VALIDATE_CODE_NUM_SIX, message = "请输入6位验证码") + private String captcha; + + @ApiModelProperty(value = "类型:public-公众号,routine-小程序,iosWx-苹果微信,androidWx-安卓微信, ios-ios登录") + @NotBlank(message = "类型不能为空") + private String type; + + @ApiModelProperty(value = "新用户登录时返回的key") + @NotBlank(message = "key不能为空") + private String key; + + @ApiModelProperty(value = "小程序获取手机号加密数据") + private String encryptedData; + + @ApiModelProperty(value = "加密算法的初始向量") + private String iv; + + @ApiModelProperty(value = "小程序code") + private String code; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequest.java new file mode 100644 index 0000000..5c1e4a0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequest.java @@ -0,0 +1,26 @@ +package com.yzt.common.request; + +import lombok.Data; + +import java.util.List; + +/** + * 易联云打印参数 + * + **/ +@Data +public class YlyPrintRequest { + private String BusinessName; + private String OrderNo; + private String Date; + private String Name; + private String Phone; + private String Address; + private String Note; + private List Goods; + private String Amount; // 合计 + private String Discount; // 优惠 + private String Postal; // 邮费 + private String Deduction; // 折扣 + private String PayMoney; // 实际金额 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequestGoods.java b/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequestGoods.java new file mode 100644 index 0000000..def9d22 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/YlyPrintRequestGoods.java @@ -0,0 +1,27 @@ +package com.yzt.common.request; + +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +/** 易联云打印商品详情 + * + **/ +@Data +public class YlyPrintRequestGoods { + private String GoodsName; + private String UnitPrice; + private String Num; + private String Money; + + public YlyPrintRequestGoods(String goodsName, String unitPrice, String num, String money) { + // 打印商品名称只打印前10位 + String LastGoodsName = goodsName; + if(StringUtils.isNotBlank(goodsName) && goodsName.length() > 10){ + LastGoodsName = goodsName.substring(0,11); + } + GoodsName = LastGoodsName; + UnitPrice = unitPrice; + Num = num; + Money = money; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassLoginRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassLoginRequest.java new file mode 100644 index 0000000..ce7d307 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassLoginRequest.java @@ -0,0 +1,30 @@ +package com.yzt.common.request.onepass; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * 一号通用户登录请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OnePassLoginRequest对象", description = "一号通用户登录请求对象") +public class OnePassLoginRequest { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "access_key一号通后台AccessKey管理获得", required = true) + @NotBlank(message = "AccessKey 不能为空") + private String accessKey; + + @ApiModelProperty(value = "secret_key一号通后台AccessKey管理获得", required = true) + @NotBlank(message = "secretKey 不能为空") + private String secretKey; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassRegisterRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassRegisterRequest.java new file mode 100644 index 0000000..edaabd1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassRegisterRequest.java @@ -0,0 +1,44 @@ +package com.yzt.common.request.onepass; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 一号通账号注册 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OnePassRegisterRequest对象", description = "一号通账号注册") +public class OnePassRegisterRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "账号", required = true) + @NotBlank(message = "账号不能为空") + private String account; + + @ApiModelProperty(value = "手机号", required = true) + @NotNull(message = "手机号不能为空") + private String phone; + + @ApiModelProperty(value = "密码", required = true) + @NotNull(message = "密码不能为空") + private String password; + + @ApiModelProperty(value = "域名", required = true) + @NotNull(message = "域名不能为空") + private String domain; + + @ApiModelProperty(value = "验证码") + @NotNull(message = "验证码不能为空") + private String code; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCallBackRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCallBackRequest.java new file mode 100644 index 0000000..b554b5b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCallBackRequest.java @@ -0,0 +1,18 @@ +package com.yzt.common.request.onepass; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 一号通 商家寄件 回调对象 + * + */ +@Data +public class OnePassShipmentCallBackRequest { + + @ApiModelProperty(value = "回调类型:order_success=下单成功回调|order_take=取件回调|order_cancel=用户主动取消回调|order_fail=下单失败回调|order_receipt=快递签收回调") + public String type; + + @ApiModelProperty(value = "回调数据") + public String data; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCancelOrderRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCancelOrderRequest.java new file mode 100644 index 0000000..a1a52e8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCancelOrderRequest.java @@ -0,0 +1,26 @@ +package com.yzt.common.request.onepass; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 一号通 取消商家寄件 + * + */ +@Data +public class OnePassShipmentCancelOrderRequest { + + @ApiModelProperty(value = "任务ID,在[创建商家寄件订单]接口中获得", required = true) + @NotNull(message = "任务ID 不能为空") + public String taskId; + + @ApiModelProperty(value = "订单ID,在[创建商家寄件订单]接口中获得", required = true) + @NotNull(message = "订单ID 不能为空") + public String orderId; + + @ApiModelProperty(value = "取消理由", required = true) + @NotNull(message = "取消理由 不能为空") + public String cancelMsg; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCreateOrderRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCreateOrderRequest.java new file mode 100644 index 0000000..41d1b72 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassShipmentCreateOrderRequest.java @@ -0,0 +1,128 @@ +package com.yzt.common.request.onepass; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 一号通 创建商家寄件 + * + */ +@Data +public class OnePassShipmentCreateOrderRequest implements Serializable { + + // 字符串 是 -- 快递公司编码,在[获取商家寄件快递公司]接口中获得 + @ApiModelProperty(value = "(必填) 快递公司编码,在[获取商家寄件快递公司]接口中获得") +// @NotNull(message = "快递公司编码 不能为空") + private String kuaidicom; + + // 字符串 是 -- 收件人姓名 + @ApiModelProperty(value = "(必填) 收件人姓名") +// @NotNull(message = "收件人姓名 不能为空") + private String manName; + + // 字符串 是 -- 收件人手机号 + @ApiModelProperty(value = "(必填) 收件人手机号") +// @NotNull(message = "收件人手机号 不能为空") + private String phone; + + // 字符串 是 -- 收件人所在完整地址 + @ApiModelProperty(value = "(必填) 收件人所在完整地址") +// @NotNull(message = "收件人所在完整地址 不能为空") + private String address; + + // 字符串 是 -- 寄件人姓名 + @ApiModelProperty(value = "(必填) 寄件人姓名") +// @NotNull(message = "寄件人姓名 不能为空") + private String sendRealName; + + // 字符串 是 -- 寄件人手机号 + @ApiModelProperty(value = "(必填) 寄件人手机号") +// @NotNull(message = "寄件人手机号 不能为空") + private String sendPhone; + + // 字符串 是 -- 寄件人所在完整地址 + @ApiModelProperty(value = "(必填) 寄件人所在完整地址") +// @NotNull(message = "寄件人所在完整地址 不能为空") + private String sendAddress; + + // 字符串 否 -- 订单信息回调地址 + @ApiModelProperty(value = "订单信息回调地址") + private String callBackUrl; + + // 字符串 否 -- 物品名称,例:文件。当kuaidicom=jd、yuantong时必填 + @ApiModelProperty(value = "(条件必填) 物品名称,例:文件。当kuaidicom=jd、yuantong时必填") + private String cargo; + + // 字符串 否 -- 业务类型,默认为标准快递,各快递公司业务类型对照参考 + @ApiModelProperty(value = "(必填) 业务类型,默认为标准快递,各快递公司业务类型对照参考") + private String serviceType; + + //字符串 否 -- 支付方式,SHIPPER: 寄付(默认)。不支持到付 + @ApiModelProperty(value = "支付方式,SHIPPER: 寄付(默认)。不支持到付") + private String payment; + + // 字符串 否 -- 物品总重量KG,不需带单位,例:1.5 + @ApiModelProperty(value = "物品总重量KG,不需带单位,例:1.5") + private String weight; + + // 字符串 否 -- 备注 + @ApiModelProperty(value = "备注") + private String remark; + + // 字符串 否 -- 预约日期,例如:0=今天/1=明天/2=后天 + @ApiModelProperty(value = "预约日期,例如:0=今天/1=明天/2=后天") + private String dayType; + + // 字符串 否 -- 预约起始时间(HH:mm),例如:09:00,顺丰必填 + @ApiModelProperty(value = "预约起始时间(HH:mm),例如:09:00,顺丰必填") + private String pickupStartTime; + + // 字符串 否 -- 预约截止时间(HH:mm),例如:10:00,顺丰必填,预约起始时间和预约截止时间间隔需≥1小时 + @ApiModelProperty(value = "预约截止时间(HH:mm),例如:10:00,顺丰必填,预约起始时间和预约截止时间间隔需≥1小时") + private String pickupEndTime; + + // 字符串 否 -- 渠道ID,如有多个同品牌运力,请联系商务提供后传入 + @ApiModelProperty(value = "渠道ID,如有多个同品牌运力,请联系商务提供后传入") + private String channelSw; + + // 字符串 否 -- 保价额度,单位:元 + @ApiModelProperty(value = "保价额度,单位:元") + private String valinsPay; + + // 字符串 否 -- 寄件人实名信息(圆通、极兔支持 ) + @ApiModelProperty(value = "寄件人实名信息(圆通、极兔支持 )") + private String realName; + + // 字符串 否 -- 寄件人证件类型,1:居民身份证 ;2:港澳居民来往内地通行证 ;3:台湾居民来往大陆通行证 ;4:中国公民护照(圆通、极兔支持 ) + @ApiModelProperty(value = "寄件人证件类型,1:居民身份证 ;2:港澳居民来往内地通行证 ;3:台湾居民来往大陆通行证 ;4:中国公民护照(圆通、极兔支持 )") + private String sendIdCardType; + + // 字符串 否 -- 寄件人证件号码 (圆通、极兔支持 ) + @ApiModelProperty(value = "寄件人证件号码 (圆通、极兔支持 )") + private String sendIdCard; + + // 字符串 否 -- 是否口令签收,Y:需要 N: 不需要,默认值为N(德邦快递专属参数) + @ApiModelProperty(value = "是否口令签收,Y:需要 N: 不需要,默认值为N(德邦快递专属参数)") + private String passwordSigning; + + // 字符串 否 -- 是否开启订阅功能 0:不开启(默认) 1:开启 说明开启订阅功能时:pollCallBackUrl必须填入 此功能只针对有快递单号的单 + @ApiModelProperty(value = "是否开启订阅功能 0:不开启(默认) 1:开启 说明开启订阅功能时:pollCallBackUrl必须填入 此功能只针对有快递单号的单") + private String op; + + // 字符串 是 -- 面单返回类型,默认为空,不返回面单内容。10:设备打印,20:生成图片短链回调。 + @ApiModelProperty(value = "(必填) 面单返回类型,默认为空,不返回面单内容。10:设备打印,20:生成图片短链回调。") +// @NotNull(message = "面单返回类型,默认为空,不返回面单内容。10:设备打印,20:生成图片短链回调。 不能为空") + private String returnType; + + // 字符串 是 -- 设备码,returnType为10时必填 + @ApiModelProperty(value = "(条件必填) 设备码,returnType为10时必填") +// @NotNull(message = "设备码,returnType为10时必填 不能为空") + private String siid; + + // 字符串 是 -- 模板编码,模板id在[获取商家寄件快递公司]接口中查看 + @ApiModelProperty(value = "(必填) 模板编码,模板id在[获取商家寄件快递公司]接口中查看") +// @NotNull(message = "模板编码,模板id在[获取商家寄件快递公司]接口中查看 不能为空") + private String tempid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUpdateRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUpdateRequest.java new file mode 100644 index 0000000..1464ada --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUpdateRequest.java @@ -0,0 +1,41 @@ +package com.yzt.common.request.onepass; + +import com.yzt.common.constants.RegularConstants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.io.Serializable; + +/** + * 一号通账号修改 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OnePassUpdateRequest对象", description = "一号通账号修改") +public class OnePassUpdateRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "账号", required = true) + @NotNull(message = "账号不能为空") + private String account; + + @ApiModelProperty(value = "手机号", required = true) + @NotNull(message = "手机号不能为空") + @Pattern(regexp = RegularConstants.PHONE_TWO, message = "请填写正确的手机号") + private String phone; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "验证码", required = true) + @NotNull(message = "验证码不能为空") + private String code; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUserRecordRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUserRecordRequest.java new file mode 100644 index 0000000..3552ac7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/onepass/OnePassUserRecordRequest.java @@ -0,0 +1,41 @@ +package com.yzt.common.request.onepass; + +import com.yzt.common.annotation.StringContains; +import com.yzt.common.constants.Constants; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Range; + +import javax.validation.constraints.NotBlank; + +/** + * 一号通用量记录请求对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "OnePassUserRecordRequest对象", description = "一号通用量记录请求对象") +public class OnePassUserRecordRequest { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "记录类型:sms,短信;copy,产品复制;expr_query,物流查询;expr_dump,电子面单", required = true) + @NotBlank(message = "记录类型不能为空") + @StringContains(limitValues = {"sms","copy","expr_query","expr_dump"}, message = "未知的记录类型") + private String type; + + @ApiModelProperty(value = "短信状态(短信类型时必传):0发送中,1成功,2失败,3全部") + @Range(min = 0, max = 3, message = "未知的短信状态") + private Integer status; + + @ApiModelProperty(value = "页码", example = Constants.DEFAULT_PAGE + "") + private int page = Constants.DEFAULT_PAGE; + + @ApiModelProperty(value = "每页数量", example = Constants.DEFAULT_LIMIT + "") + private int limit = Constants.DEFAULT_LIMIT; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategoryRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategoryRequest.java new file mode 100644 index 0000000..35ae517 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategoryRequest.java @@ -0,0 +1,40 @@ +package com.yzt.common.request.page; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 页面配置和diy用到的实体参数 + * + */ +@Data +public class PageCategoryRequest { + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "父类id") + private Integer pid; + + @ApiModelProperty(value = "类型:link、special、product、product_category、custom") + private String type; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "层级 个位数") + private Boolean level; + + @ApiModelProperty(value = "是否商户 0平台,商户id") + private Integer isMer; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategorySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategorySearchRequest.java new file mode 100644 index 0000000..a9d2d1b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageCategorySearchRequest.java @@ -0,0 +1,31 @@ +package com.yzt.common.request.page; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +/** + * 页面DIY和设计用到的分类 + * + */ +@Data +public class PageCategorySearchRequest { + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "父类id") + private Integer pid; + + @ApiModelProperty(value = "类型:link、special、product、product_category、custom") + private String type; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "层级 个位数") + private Boolean level; + + @ApiModelProperty(value = "是否商户 0平台,商户id") + private Integer isMer; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyEditNameRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyEditNameRequest.java new file mode 100644 index 0000000..1cd8d1b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyEditNameRequest.java @@ -0,0 +1,23 @@ +package com.yzt.common.request.page; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 页面分类和DIY用到的实体参数 + * + */ +@Data +public class PageDiyEditNameRequest { + + @ApiModelProperty(value = "id") + @NotNull(message = "模版id 不能为空") + private Integer id; + + @ApiModelProperty(value = "页面名称") + @NotEmpty(message = "模版名称 不能为空") + private String name; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyRequest.java new file mode 100644 index 0000000..78aba16 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiyRequest.java @@ -0,0 +1,93 @@ +package com.yzt.common.request.page; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 页面分类和DIY用到的实体参数 + * + */ +@Data +public class PageDiyRequest { + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "版本号") + private String version; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "网站标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String coverImage; + + @ApiModelProperty(value = "模板名称") + private String templateName; + + @ApiModelProperty(value = "页面数据") + private JSONObject value; + + @ApiModelProperty(value = "默认数据") + private String defaultValue; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "是否使用") + private Integer status; + + @ApiModelProperty(value = "页面类型") + private Integer type; + + @ApiModelProperty(value = "显示首页") + private Integer isShow; + + @ApiModelProperty(value = "颜色是否选中") + private Integer isBgColor; + + @ApiModelProperty(value = "背景图是否选中") + private Integer isBgPic; + + @ApiModelProperty(value = "是否是diy数据") + private Integer isDiy; + + @ApiModelProperty(value = "背景颜色") + private String colorPicker; + + @ApiModelProperty(value = "背景图") + private String bgPic; + + @ApiModelProperty(value = "背景图图片样式") + private Integer bgTabVal; + + @ApiModelProperty(value = "是否删除") + private Integer isDel; + + @ApiModelProperty(value = "返回地址") + private String returnAddress; + + @ApiModelProperty(value = "标题背景色") + private String titleBgColor; + + @ApiModelProperty(value = "标题颜色") + private String titleColor; + + @ApiModelProperty(value = "商家样式") + private Integer serviceStatus; + + @ApiModelProperty(value = "商户ID") + private Integer merId; + + @ApiModelProperty(value = "默认模板(1.平台默认 2.商户默认)") + private Integer isDefault; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiySearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiySearchRequest.java new file mode 100644 index 0000000..401a96f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageDiySearchRequest.java @@ -0,0 +1,8 @@ +package com.yzt.common.request.page; + +/** + * 页面DIY用到的搜索对象 + * + */ +public class PageDiySearchRequest { +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkRequest.java new file mode 100644 index 0000000..dc6d4f6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkRequest.java @@ -0,0 +1,46 @@ +package com.yzt.common.request.page; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 页面设计和DIY用到的链接查询对象 + * + */ +@Data +public class PageLinkRequest { + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "分类id") + private Integer cateId; + + @ApiModelProperty(value = "分组1:基础2:分销3:个人中心") + private Boolean type; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "页面链接") + private String url; + + @ApiModelProperty(value = "参数") + private String param; + + @ApiModelProperty(value = "事例") + private String example; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "1是商户的链接") + private Boolean isMer; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkSearchRequest.java b/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkSearchRequest.java new file mode 100644 index 0000000..2a4d109 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/request/page/PageLinkSearchRequest.java @@ -0,0 +1,47 @@ +package com.yzt.common.request.page; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * 页面配置和DIY用到的页面链接搜索对象 + * + */ +@Data +public class PageLinkSearchRequest { + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "分类id") + private Integer cateId; + + @ApiModelProperty(value = "分组1:基础2:分销3:个人中心") + private Boolean type; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "页面链接") + private String url; + + @ApiModelProperty(value = "参数") + private String param; + + @ApiModelProperty(value = "事例") + private String example; + + @ApiModelProperty(value = "状态") + private Boolean status; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "1是商户的链接") + private Boolean isMer; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ActivityEnrollResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ActivityEnrollResponse.java new file mode 100644 index 0000000..031ebe8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ActivityEnrollResponse.java @@ -0,0 +1,34 @@ +package com.yzt.common.response; + +/** + * @Author: pengsz + * @Date: 2025/12/02 + * @Description: + */ + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 活动报名 response + * 描述对应的业务场景 + */ +@Data +public class ActivityEnrollResponse { + + @ApiModelProperty(value = "活动商品id") + private Integer id; + + @ApiModelProperty(value = "活动名称") + private String activityName; + +// @ApiModelProperty(value = "商品简介") +// private String storeInfo; + @ApiModelProperty(value = "活动简介") + private String keyword; + + @ApiModelProperty(value = "添加时间") + private String addTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ActivityStyleResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ActivityStyleResponse.java new file mode 100644 index 0000000..7aee364 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ActivityStyleResponse.java @@ -0,0 +1,99 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yzt.common.constants.DateConstants; +import com.yzt.common.utils.YztDateUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 活动背景 response + * 描述对应的业务场景 + */ +@Data +public class ActivityStyleResponse { + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "活动名称") + private String name; + + @ApiModelProperty(value = "活动类型0=活动边框,1=活动背景") + private Boolean type; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "开始时间") + private Date starttime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "结束时间") + private Date endtime; + + @ApiModelProperty(value = "活动边框素材地址") + private String style; + + @ApiModelProperty(value = "状态 -1=已结束,0=未开始,1=进行中") + private Integer runningStatus; + + @ApiModelProperty(value = "状态 0=关闭1=开启") + private Boolean status; + + @ApiModelProperty(value = "商品参与类型 0=全部商品参与,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与,4=指定商户产品") + private Integer method; + + @ApiModelProperty(value = "参与活动商品") + private String products; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间") + private Date createtime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间") + private Date updatetime; + + /** + * -1 已结束 结束时间小于当前时间 + * 1 进行中 结束时间大于当前时间 && 开始时间小于等于当前时间 + * 0 未开始 开始时间大于当前时间 + * @param starttime 开始时间 + * @param endtime 结束时间 + */ + public void setRunningStatus(Date starttime, Date endtime, Date currenttime) { + // isEnd = -1 = 已结束 + int isEnd = YztDateUtil.compareDate(YztDateUtil.dateToStr(endtime, DateConstants.DATE_FORMAT), + YztDateUtil.dateToStr(currenttime, DateConstants.DATE_FORMAT), + DateConstants.DATE_FORMAT); + // isIng1 = 1 和下面并且链接 + int isIng1 = YztDateUtil.compareDate(YztDateUtil.dateToStr(endtime, DateConstants.DATE_FORMAT), + YztDateUtil.dateToStr(currenttime, DateConstants.DATE_FORMAT), + DateConstants.DATE_FORMAT); + // isIng2 = -1 和上面并且链接 + int isIng2 = YztDateUtil.compareDate(YztDateUtil.dateToStr(starttime, DateConstants.DATE_FORMAT), + YztDateUtil.dateToStr(currenttime, DateConstants.DATE_FORMAT), + DateConstants.DATE_FORMAT); + // isPer = 1 = 未开始 + int isPer = YztDateUtil.compareDate(YztDateUtil.dateToStr(starttime, DateConstants.DATE_FORMAT), + YztDateUtil.dateToStr(currenttime, DateConstants.DATE_FORMAT), + DateConstants.DATE_FORMAT); + Integer tempRunningStatus = null; + if(isEnd == -1){ + tempRunningStatus = -1; + }else if(isPer == 1){ + tempRunningStatus = 0; + }else if(isIng1 == 1 && isIng2 == -1){ + tempRunningStatus = 1; + } + this.runningStatus = tempRunningStatus; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/AdminSiteLogoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/AdminSiteLogoResponse.java new file mode 100644 index 0000000..9a239aa --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/AdminSiteLogoResponse.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 管理端logo响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "AdminSiteLogoResponse对象", description = "管理端logo响应对象") +public class AdminSiteLogoResponse implements Serializable { + + private static final long serialVersionUID = -4585094537501770138L; + + @ApiModelProperty(value = "LOGO") + private String siteLogoSquare; + + @ApiModelProperty(value = "左上角LOGO") + private String siteLogoLeftTop; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ApplyRefundOrderInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ApplyRefundOrderInfoResponse.java new file mode 100644 index 0000000..c21b875 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ApplyRefundOrderInfoResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 申请退款订单响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ApplyRefundOrderInfoResponse对象", description="申请退款订单响应对象") +public class ApplyRefundOrderInfoResponse implements Serializable { + + private static final long serialVersionUID = 1387727608277207652L; + + @ApiModelProperty(value = "订单id") + private Integer id; + + @ApiModelProperty(value = "订单编号") + private String orderId; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "订单详情对象列表") + private List orderInfoList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ArticleResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ArticleResponse.java new file mode 100644 index 0000000..57595e8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ArticleResponse.java @@ -0,0 +1,52 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文章响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ArticleResponse对象", description="文章响应对象") +public class ArticleResponse implements Serializable { + + private static final long serialVersionUID = -4585094537501770138L; + + @ApiModelProperty(value = "文章管理ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章作者") + private String author; + + @ApiModelProperty(value = "文章图片 前端用") + private String imageInput; + + @ApiModelProperty(value = "文章简介") + private String synopsis; + + @ApiModelProperty(value = "浏览次数") + private String visit; + + @ApiModelProperty(value = "文章内容") + private String content; + + @ApiModelProperty(value = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") + private Date createTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/AttrValueResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/AttrValueResponse.java new file mode 100644 index 0000000..59d2eab --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/AttrValueResponse.java @@ -0,0 +1,79 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 商品属性值响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="AttrValueResponse对象", description="商品属性值响应对象") +public class AttrValueResponse implements Serializable { + + private static final long serialVersionUID=1L; + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "sku") + private String suk; + + @ApiModelProperty(value = "属性对应的库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "属性金额") + private BigDecimal price; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "一级返佣") + private BigDecimal brokerage; + + @ApiModelProperty(value = "二级返佣") + private BigDecimal brokerageTwo; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + @ApiModelProperty(value = "活动限购数量") + private Integer quota; + + @ApiModelProperty(value = "活动限购数量显示") + private Integer quotaShow; + + @ApiModelProperty(value = "attrValue字段") + private String attrValue; + + @ApiModelProperty(value = "砍价商品最低价|砍价专用字段") + private BigDecimal minPrice; + + @ApiModelProperty(value = "商品条码") + private String barCode; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BalanceResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/BalanceResponse.java new file mode 100644 index 0000000..bf8c2c6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BalanceResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户地址表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BalanceResponse对象", description="提现金额") +public class BalanceResponse implements Serializable { + + public BalanceResponse() {} + public BalanceResponse(BigDecimal withdrawn, BigDecimal unDrawn, BigDecimal commissionTotal, BigDecimal toBeWithdrawn) { + this.withdrawn = withdrawn; + this.unDrawn = unDrawn; + this.commissionTotal = commissionTotal; + ToBeWithdrawn = toBeWithdrawn; + } + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "已提现") + private BigDecimal withdrawn; + + @ApiModelProperty(value = "未提现") + private BigDecimal unDrawn; + + @ApiModelProperty(value = "佣金总金额") + private BigDecimal commissionTotal; + + @ApiModelProperty(value = "待提现") + private BigDecimal ToBeWithdrawn; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BargainDetailH5Response.java b/fightwine-common/src/main/java/com/yzt/common/response/BargainDetailH5Response.java new file mode 100644 index 0000000..c47bd89 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BargainDetailH5Response.java @@ -0,0 +1,82 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 砍价商品详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainDetailH5Response对象", description="砍价商品详情响应对象") +public class BargainDetailH5Response implements Serializable { + + private static final long serialVersionUID = 4177599369617161973L; + + @ApiModelProperty(value = "砍价商品ID") + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + private String image; + + @ApiModelProperty(value = "单位名称") + private String unitName; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "砍价开启时间") + private Long startTime; + + @ApiModelProperty(value = "砍价结束时间") + private Long stopTime; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal price; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "购买数量限制") + // 单个活动每个用户发起砍价次数限制 + private Integer num; + +// @ApiModelProperty(value = "砍价活动简介") +// private String info; + +// @ApiModelProperty(value = "砍价规则") +// private String rule; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "商品规格sku") + private String sku; + + @ApiModelProperty(value = "商品规格属性id") + private Integer attrValueId; + + @ApiModelProperty(value = "商品详情") + private String content; + + @ApiModelProperty(value = "主商品状态:normal-正常,sellOut-售罄,soldOut-下架,delete-删除") + private String masterStatus; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BargainHeaderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/BargainHeaderResponse.java new file mode 100644 index 0000000..b8b193b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BargainHeaderResponse.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.HashMap; +import java.util.List; + +/** + * 砍价商品列表header响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainHeaderResponse对象", description="砍价商品列表header响应对象") +public class BargainHeaderResponse { + + @ApiModelProperty(value = "参与砍价总人数") + private Integer bargainTotal; + + @ApiModelProperty(value = "砍价成功列表(默认7条)") + private List> bargainSuccessList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BargainIndexResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/BargainIndexResponse.java new file mode 100644 index 0000000..e25717d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BargainIndexResponse.java @@ -0,0 +1,25 @@ +package com.yzt.common.response; + +import com.yzt.common.model.bargain.StoreBargain; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 砍价首页响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainIndexResponse对象", description="砍价首页响应对象") +public class BargainIndexResponse { + + @ApiModelProperty(value = "拼团商品列表") + private List productList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BargainRecordResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/BargainRecordResponse.java new file mode 100644 index 0000000..36d78a9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BargainRecordResponse.java @@ -0,0 +1,56 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 砍价记录响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainRecordResponse对象", description="砍价记录响应对象") +public class BargainRecordResponse { + + @ApiModelProperty(value = "砍价商品ID") + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + private String image; + + @ApiModelProperty(value = "砍价结束时间") + private Long stopTime; + + @ApiModelProperty(value = "用户砍价活动id") + private Integer bargainUserId; + + @ApiModelProperty(value = "剩余金额") + private BigDecimal surplusPrice; + + @ApiModelProperty(value = "状态 1参与中 2 活动结束参与失败 3活动结束参与成功") + private Integer status; + + @ApiModelProperty(value = "是否取消") + private Boolean isDel; + + @ApiModelProperty(value = "是否生成订单") + private Boolean isOrder; + + @ApiModelProperty(value = "是否支付") + private Boolean isPay; + + @ApiModelProperty(value = "订单号") + private String orderNo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/BargainUserInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/BargainUserInfoResponse.java new file mode 100644 index 0000000..ba038c6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/BargainUserInfoResponse.java @@ -0,0 +1,95 @@ +package com.yzt.common.response; + +import com.yzt.common.model.bargain.StoreBargainUserHelp; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** + * 砍价用户详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="BargainUserInfoResponse对象", description="砍价用户详情响应对象") +public class BargainUserInfoResponse implements Serializable { + + private static final long serialVersionUID = 4177599369617161973L; + + @ApiModelProperty(value = "当前用户砍价状态:1-可以参与砍价,2-参与次数已满,3-砍价中,4-已完成,5-可以帮砍,6-已帮砍,7-帮砍次数已满,8-已生成订单未支付,9-已支付,10-未支付,已取消") + private Integer bargainStatus; + + @ApiModelProperty(value = "已砍金额") + private BigDecimal alreadyPrice; + + @ApiModelProperty(value = "剩余金额") + private BigDecimal surplusPrice; + + @ApiModelProperty(value = "砍价百分比") + private Integer bargainPercent; + +// @ApiModelProperty(value = "砍价活动图片") +// private String image; +// +// @ApiModelProperty(value = "单位名称") +// private String unitName; +// +// @ApiModelProperty(value = "销量") +// private Integer sales; +// +// @ApiModelProperty(value = "砍价开启时间") +// private Long startTime; +// +// @ApiModelProperty(value = "砍价结束时间") +// private Long stopTime; +// +// @ApiModelProperty(value = "砍价金额") +// private BigDecimal price; +// +// @ApiModelProperty(value = "砍价商品最低价") +// private BigDecimal minPrice; + +// @ApiModelProperty(value = "购买数量限制") +// // 单个活动每个用户发起砍价次数限制 +// private Integer num; + +// @ApiModelProperty(value = "砍价活动简介") +// private String info; + +// @ApiModelProperty(value = "砍价规则") +// private String rule; + +// @ApiModelProperty(value = "限购总数") +// private Integer quota; +// +// @ApiModelProperty(value = "限量总数显示") +// private Integer quotaShow; +// +// @ApiModelProperty(value = "商品规格sku") +// private String sku; +// +// @ApiModelProperty(value = "商品规格属性id") +// private Integer attrValueId; + +// @ApiModelProperty(value = "商品详情") +// private String content; + + @ApiModelProperty(value = "用户帮砍列表") + private List userHelpList; + + @ApiModelProperty(value = "用户砍价活动id") + private Integer storeBargainUserId; + + @ApiModelProperty(value = "用户砍价活动昵称") + private String storeBargainUserName; + + @ApiModelProperty(value = "用户砍价活动头像") + private String storeBargainUserAvatar; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CartInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CartInfoResponse.java new file mode 100644 index 0000000..89cc8c3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CartInfoResponse.java @@ -0,0 +1,67 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 购物车详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CartInfoResponse对象", description="购物车详情响应对象") +public class CartInfoResponse implements Serializable { + + private static final long serialVersionUID = 3558884699193209193L; + + @ApiModelProperty(value = "购物车表ID") + private Long id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "商品属性") + private String productAttrUnique; + + @ApiModelProperty(value = "商品数量") + private Integer cartNum; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "商品规格id") + private Integer attrId; + + @ApiModelProperty(value = "商品属性索引值 (attr_value|attr_value[|....])") + private String suk; + + @ApiModelProperty(value = "sku价格") + private BigDecimal price; + + @ApiModelProperty(value = "商品是否有效") + private Boolean attrStatus; + + @ApiModelProperty(value = "sku库存") + private Integer stock; + + @ApiModelProperty(value = "sku会员价格") + private BigDecimal vipPrice; + + @ApiModelProperty(value = "已添加的商品是否有效状态") + private Boolean status; + + @ApiModelProperty(value = "公司名称") + private String tenantName; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailH5Response.java b/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailH5Response.java new file mode 100644 index 0000000..90b677c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailH5Response.java @@ -0,0 +1,71 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 拼团商品移动端对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CombinationDetailH5Response对象", description="拼团商品移动端对象") +public class CombinationDetailH5Response implements Serializable { + + private static final long serialVersionUID = -885733985825623484L; + + @ApiModelProperty(value = "拼团商品ID") + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private String sliderImage; + + @ApiModelProperty(value = "活动标题") + private String storeName; + + @ApiModelProperty(value = "参团人数") + private Integer people; + +// @ApiModelProperty(value = "简介") +// private String storeInfo; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "每个订单可购买数量") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "商品详情") + private String content; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailResponse.java new file mode 100644 index 0000000..fb3763f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CombinationDetailResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * 拼团商品响应体 + * + */ +@Data +public class CombinationDetailResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团列表") + private List pinkList; + + @ApiModelProperty(value = "拼团成功列表") + private List pinkOkList; + + @ApiModelProperty(value = "拼团完成的商品总件数") + private Integer pinkOkSum; + + @ApiModelProperty(value = "拼团商品信息") + private CombinationDetailH5Response storeCombination; + + @ApiModelProperty(value = "商品规格") + private List productAttr; + + @ApiModelProperty(value = "商品规格值") + private HashMap productValue; + + @ApiModelProperty(value = "收藏标识") + private Boolean userCollect; + + @ApiModelProperty(value = "主商品状态:normal-正常,sellOut-售罄,soldOut-下架,delete-删除") + private String masterStatus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CombinationHeaderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CombinationHeaderResponse.java new file mode 100644 index 0000000..b1fac9e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CombinationHeaderResponse.java @@ -0,0 +1,30 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.HashMap; +import java.util.List; + +/** + * 拼团商品列表header响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CombinationHeaderResponse对象", description="拼团商品列表header响应对象") +public class CombinationHeaderResponse { + + @ApiModelProperty(value = "拼团7位用户头像") + private List avatarList; + + @ApiModelProperty(value = "拼团总人数") + private Integer totalPeople; + + @ApiModelProperty(value = "拼团banner数组") + private List> bannerList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CombinationIndexResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CombinationIndexResponse.java new file mode 100644 index 0000000..32ae07c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CombinationIndexResponse.java @@ -0,0 +1,31 @@ +package com.yzt.common.response; + +import com.yzt.common.model.combination.StoreCombination; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 拼团首页响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CombinationIndexResponse对象", description="拼团首页响应对象") +public class CombinationIndexResponse { + + @ApiModelProperty(value = "拼团3位用户头像") + private List avatarList; + + @ApiModelProperty(value = "拼团总人数") + private Integer totalPeople; + + @ApiModelProperty(value = "拼团商品列表") + private List productList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ComputedOrderPriceResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ComputedOrderPriceResponse.java new file mode 100644 index 0000000..aa2e4eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ComputedOrderPriceResponse.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 计算订单价格响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ComputedOrderPriceResponse对象", description="计算订单价格响应对象") +public class ComputedOrderPriceResponse implements Serializable { + + private static final long serialVersionUID = 7282892323898493847L; + + @ApiModelProperty(value = "优惠券优惠金额") + private BigDecimal couponFee; + + @ApiModelProperty(value = "积分抵扣金额") + private BigDecimal deductionPrice; + + @ApiModelProperty(value = "运费金额") + private BigDecimal freightFee; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payFee; + + @ApiModelProperty(value = "商品总金额") + private BigDecimal proTotalFee; + + @ApiModelProperty(value = "剩余积分") + private java.math.BigDecimal surplusIntegral; + + @ApiModelProperty(value = "是否使用积分") + private Boolean useIntegral; + + @ApiModelProperty(value = "使用的积分") + private Integer usedIntegral; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CopyRightResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CopyRightResponse.java new file mode 100644 index 0000000..ef3a988 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CopyRightResponse.java @@ -0,0 +1,18 @@ +package com.yzt.common.response; + +import lombok.Data; + +/** + * CopyrightResponse 站点版权 + */ +@Data +public class CopyRightResponse { + // 备案号 + public String copyrightIcpNumber = ""; + // 备案号连接 + public String copyrightIcpNumberUrl = ""; + // 网安备案 + public String copyrightInternetRecord = ""; + // 网安备案连接 + public String copyrightInternetRecordUrl = ""; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/CopyrightConfigInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/CopyrightConfigInfoResponse.java new file mode 100644 index 0000000..e8b5040 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/CopyrightConfigInfoResponse.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 授权信息响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "CopyrightConfigInfoResponse对象", description = "授权信息响应对象") +public class CopyrightConfigInfoResponse implements Serializable { + + private static final long serialVersionUID = -4585094537501770138L; + + @ApiModelProperty(value = "公司信息") + private String companyName; + + @ApiModelProperty(value = "公司图片") + private String companyImage; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/GoPinkResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/GoPinkResponse.java new file mode 100644 index 0000000..2f43c58 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/GoPinkResponse.java @@ -0,0 +1,44 @@ +package com.yzt.common.response; + +import com.yzt.common.model.user.User; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 去拼团响应体 + * + */ +@Data +public class GoPinkResponse implements Serializable { + + private static final long serialVersionUID = 1962453930812558918L; + + /** 拼团剩余人数 **/ + private Integer count; + + /** 当前拼团订单号 **/ + private String currentPinkOrder; + + /** 判断拼团是否完成 **/ + private Integer isOk; + + /** 团员列表 **/ + private List pinkAll; + + /** 拼团是否成功 0未成功 1成功 **/ + private Integer pinkBool; + + /** 当前用户是否在团内 0未在 1在 **/ + private Integer userBool; + + /** 团长信息 **/ + private StorePinkResponse pinkT; + + /** 当前拼团信息 **/ + private StoreCombinationResponse storeCombination; + + /** 当前用户信息 **/ + private User userInfo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/HomeOperatingDataResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/HomeOperatingDataResponse.java new file mode 100644 index 0000000..2cde611 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/HomeOperatingDataResponse.java @@ -0,0 +1,48 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 首页经营数据响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="HomeOperatingDataResponse对象", description="首页经营数据响应对象") +public class HomeOperatingDataResponse implements Serializable { + + private static final long serialVersionUID = -1486435421582495511L; + + @ApiModelProperty(value = "待发货订单数量") + private Integer notShippingOrderNum; + + @ApiModelProperty(value = "退款中订单数量") + private Integer refundingOrderNum; + + @ApiModelProperty(value = "待核销订单数量") + private Integer notWriteOffOrderNum; + + @ApiModelProperty(value = "库存预警商品数量") + private Integer vigilanceInventoryNum; + + @ApiModelProperty(value = "上架商品数量") + private Integer onSaleProductNum; + + @ApiModelProperty(value = "仓库中商品数量") + private Integer notSaleProductNum; + + @ApiModelProperty(value = "提现申请待审核数量") + private Integer notAuditNum; + + @ApiModelProperty(value = "用户充值总金额") + private BigDecimal totalRechargeAmount; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/HomeRateResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/HomeRateResponse.java new file mode 100644 index 0000000..adc59f6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/HomeRateResponse.java @@ -0,0 +1,48 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 主页统计数据对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="HomeRateResponse对象", description="主页统计数据对象") +public class HomeRateResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "今日销售额") + private Object sales; + + @ApiModelProperty(value = "昨日销售额") + private Object yesterdaySales; + + @ApiModelProperty(value = "今日访问量") + private Object pageviews; + + @ApiModelProperty(value = "昨日访问量") + private Object yesterdayPageviews; + + @ApiModelProperty(value = "今日订单量") + private Object orderNum; + + @ApiModelProperty(value = "昨日订单量") + private Object yesterdayOrderNum; + + @ApiModelProperty(value = "今日新增用户") + private Object newUserNum; + + @ApiModelProperty(value = "昨日新增用户") + private Object yesterdayNewUserNum; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/IndexInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/IndexInfoResponse.java new file mode 100644 index 0000000..69c6dde --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/IndexInfoResponse.java @@ -0,0 +1,69 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * 首页信息Response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="IndexInfoResponse对象", description="用户登录返回数据") +public class IndexInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页banner滚动图") + private List> banner; + + @ApiModelProperty(value = "导航模块") + private List> menus; + + @ApiModelProperty(value = "新闻简报消息滚动") + private List> roll; + + @ApiModelProperty(value = "企业logo") + private String logoUrl; + + @ApiModelProperty(value = "是否关注公众号") + private boolean subscribe; + + @ApiModelProperty(value = "首页超值爆款") + private List> explosiveMoney; + + @ApiModelProperty(value = "首页精品推荐图片") + private List> bastBanner; + + @ApiModelProperty(value = "云智服H5 url") + private String yzfUrl; + + @ApiModelProperty(value = "商品分类页配置") + private String categoryPageConfig; + + @ApiModelProperty(value = "是否隐藏一级分类") + private String isShowCategory; + + @ApiModelProperty(value = "客服电话") + private String consumerHotline; + + @ApiModelProperty(value = "客服电话服务开关") + private String telephoneServiceSwitch; + + @ApiModelProperty(value = "首页商品列表模板配置") + private String homePageSaleListStyle; + + @ApiModelProperty(value = "微信小程序客服额外开关") + private String wxChatIndependent; + + @ApiModelProperty(value = "公告") + private List> notice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/IndexProductResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/IndexProductResponse.java new file mode 100644 index 0000000..f0caf66 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/IndexProductResponse.java @@ -0,0 +1,71 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * 首页商品对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="IndexProductResponse对象", description="首页商品对象") +public class IndexProductResponse { + + + @ApiModelProperty(value = "商品id") + private Integer id; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "市场价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "好评率") + private String positiveRatio; + + @ApiModelProperty(value = "评论数量") + private Integer replyNum; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "活动显示排序0=默认,1=秒杀,2=砍价,3=拼团") + private String activity; + + @ApiModelProperty(value = "为移动端特定参数") + private ProductActivityItemResponse activityH5; + + @ApiModelProperty(value = "购物车商品数量") + private Integer cartNum; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "展示图") + private String flatPattern; + + @ApiModelProperty(value = "活动边框 列表中是边框 详情中是背景图") + @TableField(exist = false) + private String activityStyle; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/IntegralUserResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/IntegralUserResponse.java new file mode 100644 index 0000000..2f3673d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/IntegralUserResponse.java @@ -0,0 +1,72 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户积分响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="IntegralUserResponse对象", description="用户积分响应对象") +public class IntegralUserResponse implements Serializable { + + private static final long serialVersionUID=1L; + +// @ApiModelProperty(value = "用户id") +// private Integer uid; +// +// @ApiModelProperty(value = "用户昵称") +// private String nickname; +// +// @ApiModelProperty(value = "用户头像") +// private String avatar; +// +// @ApiModelProperty(value = "用户余额") +// private BigDecimal nowMoney; +// + @ApiModelProperty(value = "用户剩余积分") + private BigDecimal integral; +// +// @ApiModelProperty(value = "连续签到天数") +// private Integer signNum; +// +// @ApiModelProperty(value = "是否为推广员") +// private Boolean isPromoter; +// +// @ApiModelProperty(value = "用户购买次数") +// private Integer payCount; +// +// @ApiModelProperty(value = "下级人数") +// private Integer spreadCount; +// +// @ApiModelProperty(value = "累计签到次数") +// private Integer sumSignDay; +// +// @ApiModelProperty(value = "今天是否签到") +// private Boolean isDaySign; +// +// @ApiModelProperty(value = "昨天是否签到") +// private Boolean isYesterdaySign; + + @ApiModelProperty(value = "累计总积分") + private BigDecimal sumIntegral; + + @ApiModelProperty(value = "累计抵扣积分") + private BigDecimal deductionIntegral; + +// @ApiModelProperty(value = "今日获得累计积分") +// private Integer nowIntegral; + + @ApiModelProperty(value = "冻结的积分") + private BigDecimal frozenIntegral; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/LoginConfigResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/LoginConfigResponse.java new file mode 100644 index 0000000..c66bdae --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/LoginConfigResponse.java @@ -0,0 +1,35 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 登录配置响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "LoginConfigResponse对象", description = "登录配置响应对象") +public class LoginConfigResponse implements Serializable { + + private static final long serialVersionUID = -4585094537501770138L; + + @ApiModelProperty(value = "小程序手机号校验类型(多选)") + private String routinePhoneVerification; + + @ApiModelProperty(value = "公众号登录方式(单选)") + private String publicLoginType; + + @ApiModelProperty(value = "移动端登录Logo") + private String mobileLoginLogo; + + @ApiModelProperty(value = "公司名称") + private String siteName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/LoginResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/LoginResponse.java new file mode 100644 index 0000000..c7d7067 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/LoginResponse.java @@ -0,0 +1,46 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * Login Response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="LoginResponse", description="用户登录返回数据") +public class LoginResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户登录密钥") + private String token; + + @ApiModelProperty(value = "状态:login-登录,register-注册,start-注册起始页") + private String type; + + @ApiModelProperty(value = "注册key") + private String key; + + @ApiModelProperty(value = "登录用户Uid") + private Integer uid; + + @ApiModelProperty(value = "登录用户昵称") + private String nikeName; + + @ApiModelProperty(value = "登录用户手机号") + private String phone; + + @ApiModelProperty(value = "tenantId") + private Long tenantId; + + @ApiModelProperty(value = "tenantName") + private String tenantName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/MenusResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/MenusResponse.java new file mode 100644 index 0000000..0681ffd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/MenusResponse.java @@ -0,0 +1,50 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 系统左侧菜单对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MenusResponse对象", description="系统左侧菜单对象") +public class MenusResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "icon") + private String icon; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "组件路径") + private String component; + + @ApiModelProperty(value = "类型,M-目录,C-菜单,A-按钮") + private String menuType; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "子对象列表") + private List childList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/MonitorResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/MonitorResponse.java new file mode 100644 index 0000000..cd01511 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/MonitorResponse.java @@ -0,0 +1,64 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户账单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MonitorResponse对象", description="资金监控对象") +public class MonitorResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户账单id") + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联类型") + private String linkType; + + @ApiModelProperty(value = "0 = 支出 1 = 获得") + private int pm; + + @ApiModelProperty(value = "账单标题") + private String title; + + @ApiModelProperty(value = "明细数字") + private BigDecimal number; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "流水状态:1=有效,-1=无效") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "用户等级") + private Integer level; + + @ApiModelProperty(value = "归属公司名称") + private String tenantName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/NotificationInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/NotificationInfoResponse.java new file mode 100644 index 0000000..ab75834 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/NotificationInfoResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 系统通知详情相应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="NotificationInfoResponse对象", description="系统通知详情相应对象") +public class NotificationInfoResponse implements Serializable { + + private static final long serialVersionUID = -3214167698001861141L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "模板id(公用)") + private String tempId; + + @ApiModelProperty(value = "模板说明(短信)") + private String title; + + @ApiModelProperty(value = "模板编号(公用)") + private String tempKey; + + @ApiModelProperty(value = "内容(公用)") + private String content; + + @ApiModelProperty(value = "模板名") + private String name; + + @ApiModelProperty(value = "状态,1-开启,2-关闭") + private Integer status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderBrokerageData.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderBrokerageData.java new file mode 100644 index 0000000..ae0b30f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderBrokerageData.java @@ -0,0 +1,16 @@ +package com.yzt.common.response; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单佣金统计数 + * + */ +@Data +public class OrderBrokerageData { + + private Integer num; + private BigDecimal price; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderDataResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderDataResponse.java new file mode 100644 index 0000000..d416292 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderDataResponse.java @@ -0,0 +1,50 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单数量响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderDataResponse对象", description="订单数量响应对象") +public class OrderDataResponse implements Serializable { + + private static final long serialVersionUID = 1387727608277207652L; + + @ApiModelProperty(value = "已完成订单数量") + private Integer completeCount; + + @ApiModelProperty(value = "待核销订单数量") + private Integer evaluatedCount; + +// @ApiModelProperty(value = "用户昵称") +// private Integer verificationCount; + + @ApiModelProperty(value = "支付订单总数") + private Integer orderCount; + + @ApiModelProperty(value = "待收货订单数量") + private Integer receivedCount; + + @ApiModelProperty(value = "退款订单数量") + private Integer refundCount; + + @ApiModelProperty(value = "总消费钱数") + private BigDecimal sumPrice; + + @ApiModelProperty(value = "未支付订单数量") + private Integer unPaidCount; + + @ApiModelProperty(value = "待发货订单数量") + private Integer unShippedCount; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderDetailResponse.java new file mode 100644 index 0000000..008ed1d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderDetailResponse.java @@ -0,0 +1,99 @@ +package com.yzt.common.response; + +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 订单列表响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderDetailResponse对象", description="订单列表响应对象") +public class OrderDetailResponse implements Serializable { + + private static final long serialVersionUID = 1387727608277207652L; + + private StoreOrder storeOrder; + private List cartInfo; + private String statusPic; + private Integer offlinePayStatus; + + + @ApiModelProperty(value = "订单id") + private Integer id; + + @ApiModelProperty(value = "订单编号") + private String orderId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付时间") + private Date payTime; + + @ApiModelProperty(value = "支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer status; + + @ApiModelProperty(value = "订单状态") + private String orderStatus; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款 3 退款中") + private Integer refundStatus; + + @ApiModelProperty(value = "快递名称/送货人姓名") + private String deliveryName; + + @ApiModelProperty(value = "发货类型") + private String deliveryType; + + @ApiModelProperty(value = "快递单号/手机号") + private String deliveryId; + + @ApiModelProperty(value = "拼团id 0没有拼团") + private Integer pinkId; + + @ApiModelProperty(value = "砍价id") + private Integer bargainId; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + + @ApiModelProperty(value = "活动类型") + private String activityType; + + @ApiModelProperty(value = "订单详情对象列表") + private List orderInfoList; + + @ApiModelProperty(value = "订单类型:0-普通订单,1-视频号订单") + private Integer type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderInfoResponse.java new file mode 100644 index 0000000..78a312c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderInfoResponse.java @@ -0,0 +1,56 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderInfoResponse对象", description="订单详情响应对象") +public class OrderInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + +// @ApiModelProperty(value = "订单id") +// private Integer orderId; + @ApiModelProperty(value = "attrId") + private String attrId; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + +// @ApiModelProperty(value = "购买东西的详细信息") +// private StoreCartResponse info; + + @ApiModelProperty(value = "商品数量") + private Integer cartNum; + +// @ApiModelProperty(value = "唯一id") +// @TableField(value = "`unique`") +// private String unique; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "是否评价") + private Integer isReply; + + @ApiModelProperty(value = "规格属性值") + private String sku; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderPayResultResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderPayResultResponse.java new file mode 100644 index 0000000..88f7083 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderPayResultResponse.java @@ -0,0 +1,34 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.WxPayJsResultVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 订单支付结果 Response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderPayResultResponse对象", description="订单支付结果响应对象") +public class OrderPayResultResponse { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "支付状态") + private Boolean status; + + @ApiModelProperty(value = "微信调起支付参数对象") + private WxPayJsResultVo jsConfig; + + @ApiModelProperty(value = "支付类型") + private String payType; + + @ApiModelProperty(value = "订单编号") + private String orderNo; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/OrderProductReplyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/OrderProductReplyResponse.java new file mode 100644 index 0000000..736a7d0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/OrderProductReplyResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 评价商品页响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderProductReplyResponse对象", description="评价商品页响应对象") +public class OrderProductReplyResponse implements Serializable { + + private static final long serialVersionUID = -1926585407216207845L; + + @ApiModelProperty(value = "购买数量") + private Integer cartNum; + + @ApiModelProperty(value = "价格") + private BigDecimal truePrice; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "商品编号") + private Integer productId; + + @ApiModelProperty(value = "规格sku") + private String sku; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/PayConfigResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/PayConfigResponse.java new file mode 100644 index 0000000..ca89066 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/PayConfigResponse.java @@ -0,0 +1,32 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 支付配置响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "PayConfigResponse对象", description = "支付配置响应对象") +public class PayConfigResponse implements Serializable { + + private static final long serialVersionUID = 7282892323898493847L; + + @ApiModelProperty(value = "余额支付") + private Boolean yuePayStatus; + + @ApiModelProperty(value = "微信支付") + private Boolean payWechatOpen; + + @ApiModelProperty(value = "用户余额") + private BigDecimal userBalance; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/PreOrderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/PreOrderResponse.java new file mode 100644 index 0000000..b9d7788 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/PreOrderResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.OrderInfoVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 预下单响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PreOrderResponse对象", description="预下单响应对象") +public class PreOrderResponse implements Serializable { + + private static final long serialVersionUID = 7282892323898493847L; + + @ApiModelProperty(value = "订单详情对象") + private OrderInfoVo orderInfoVo; + + @ApiModelProperty(value = "预下单订单号") + private String preOrderNo; + + @ApiModelProperty(value = "门店自提是否开启") + private String storeSelfMention; + + @ApiModelProperty(value = "余额支付 1 开启 2 关闭") + private String yuePayStatus; + + @ApiModelProperty(value = "微信支付 1 开启 0 关闭") + private String payWeixinOpen; + + @ApiModelProperty(value = "支付宝支付 1 开启 0 关闭") + private String aliPayStatus; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ProductActivityItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ProductActivityItemResponse.java new file mode 100644 index 0000000..ec0720a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ProductActivityItemResponse.java @@ -0,0 +1,21 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品所参与的活动类型 + * fw_ + */ +@Data +public class ProductActivityItemResponse { + + @ApiModelProperty(value = "参与活动id") + private Integer id; + + @ApiModelProperty(value = "活动结束时间") + private Integer time; + + @ApiModelProperty(value = "活动参与类型:1=秒杀,2=砍价,3=拼团") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailReplyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailReplyResponse.java new file mode 100644 index 0000000..bfadd1a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailReplyResponse.java @@ -0,0 +1,31 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品详情评论响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductDetailReplyResponse对象", description="商品详情评论响应对象") +public class ProductDetailReplyResponse implements Serializable { + + private static final long serialVersionUID = 8822745472328151094L; + + @ApiModelProperty(value = "评论总数") + private Integer sumCount; + + @ApiModelProperty(value = "好评率") + private String replyChance; + + @ApiModelProperty(value = "最后一条评论信息") + private ProductReplyResponse productReply; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailResponse.java new file mode 100644 index 0000000..ff378d3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ProductDetailResponse.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * 商品详情 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductDetailResponse对象", description="商品详情H5") +public class ProductDetailResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "产品属性") + private List productAttr; + + @ApiModelProperty(value = "商品属性详情") + private HashMap productValue; + + @ApiModelProperty(value = "商品属性详情") + private List productValueList; + + @ApiModelProperty(value = "返佣金额区间") + private String priceName; + + @ApiModelProperty(value = "为移动端特定参数 所有参与的活动") + private List activityAllH5; + + @ApiModelProperty(value = "商品信息") + private StoreProduct productInfo; + + @ApiModelProperty(value = "收藏标识") + private Boolean userCollect; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ProductReplyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ProductReplyResponse.java new file mode 100644 index 0000000..3a11521 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ProductReplyResponse.java @@ -0,0 +1,52 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; + +/** + * 商品评论H5详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductReplyResponse对象", description="商品评论H5详情响应对象") +public class ProductReplyResponse { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "评论ID") + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "商品分数") + private Integer score; + + @ApiModelProperty(value = "评论内容") + private String comment; + + @ApiModelProperty(value = "评论图片") + private List pics; + + @ApiModelProperty(value = "管理员回复内容") + private String merchantReplyContent; + + @ApiModelProperty(value = "用户名称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "评论时间") + private Date createTime; + + @ApiModelProperty(value = "商品规格属性值") + private String sku; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/RoleInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/RoleInfoResponse.java new file mode 100644 index 0000000..e7ccf70 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/RoleInfoResponse.java @@ -0,0 +1,44 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.MenuCheckVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 角色详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RoleInfoResponse对象", description="角色详情响应对象") +public class RoleInfoResponse implements Serializable { + + private static final long serialVersionUID = -6123516979502057197L; + + @ApiModelProperty(value = "角色id") + private Integer id; + + @ApiModelProperty(value = "角色名称") + private String roleName; + + @ApiModelProperty(value = "状态:0-关闭,1-正常") + private Boolean status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改时间") + private List menuList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SecKillDetailH5Response.java b/fightwine-common/src/main/java/com/yzt/common/response/SecKillDetailH5Response.java new file mode 100644 index 0000000..e8f7500 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SecKillDetailH5Response.java @@ -0,0 +1,87 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 秒杀商品移动端对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreSecKillH5Response对象", description="秒杀商品移动端对象") +public class SecKillDetailH5Response implements Serializable { + + private static final long serialVersionUID = -885733985825623484L; + + @ApiModelProperty(value = "商品秒杀产品表id") + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private String sliderImage; + + @ApiModelProperty(value = "秒杀商品名称") + private String storeName; + +// @ApiModelProperty(value = "简介") +// private String storeInfo; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "内容") + private String description; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date stopTime; + + @ApiModelProperty(value = "最多秒杀几个") + private Integer num; + + @ApiModelProperty(value = "时间段ID") + private Integer timeId; + + @ApiModelProperty(value = "限购总数 随销量递减") + private Integer quota; + + @ApiModelProperty(value = "限购总数显示 不变") + private Integer quotaShow; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "秒杀状态:0-关闭,1-即将开始,2-进行中,-1 - 已结束") + private Integer seckillStatus; + + @ApiModelProperty(value = "商品详情") + private String content; + + @ApiModelProperty(value = "结束时间(前端用)") + private String timeSwap; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SecKillResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SecKillResponse.java new file mode 100644 index 0000000..5a2bbcb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SecKillResponse.java @@ -0,0 +1,51 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 秒杀Header时间header响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SecKillResponse对象", description="秒杀Header时间header响应对象") +public class SecKillResponse { + + public SecKillResponse() { + } + + public SecKillResponse(Integer id, String slide, String statusName, String time, int status, String timeSwap) { + this.id = id; + this.slide = slide; + this.statusName = statusName; + this.time = time; + this.status = status; + this.timeSwap = timeSwap; + } + + @ApiModelProperty(value = "秒杀时段id") + private Integer id; + + @ApiModelProperty(value = "秒杀时段轮播图") + private String slide; + + @ApiModelProperty(value = "秒杀时段状态名称") + private String statusName; // 已结束 抢购中 即将开始 + + @ApiModelProperty(value = "秒杀时段状态") + private int status; + + @ApiModelProperty(value = "秒杀时段时间信息") + private String time; + + @ApiModelProperty(value = "秒杀时段结束时间") + private String timeSwap; + + @ApiModelProperty(value = "是否选中") + private Boolean isCheck = false; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SeckillIndexResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SeckillIndexResponse.java new file mode 100644 index 0000000..edc87fd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SeckillIndexResponse.java @@ -0,0 +1,27 @@ +package com.yzt.common.response; + +import com.yzt.common.model.seckill.StoreSeckill; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 秒杀首页响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SeckillIndexResponse对象", description="秒杀首页响应对象") +public class SeckillIndexResponse { + + @ApiModelProperty(value = "秒杀时段信息") + private SecKillResponse secKillResponse; + + @ApiModelProperty(value = "秒杀商品信息") + private List productList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesFreeResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesFreeResponse.java new file mode 100644 index 0000000..ee0267a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesFreeResponse.java @@ -0,0 +1,35 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 运费模板包邮响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ShippingTemplatesFreeResponse对象", description = "运费模板包邮响应对象") +public class ShippingTemplatesFreeResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "描述") + private String title; + + @ApiModelProperty(value = "包邮件数") + private BigDecimal number; + + @ApiModelProperty(value = "包邮金额") + private BigDecimal price; + + @ApiModelProperty(value = "分组唯一值") + private String uniqid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesInfoResponse.java new file mode 100644 index 0000000..2ee4956 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesInfoResponse.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 运费模板详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ShippingTemplatesInfoResponse对象", description="运费模板详情响应对象") +public class ShippingTemplatesInfoResponse implements Serializable { + + private static final long serialVersionUID = -849676402721624567L; + + @ApiModelProperty(value = "编号") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "模板名称") + private String name; + + @ApiModelProperty(value = "计费方式") + private Integer type; + + @ApiModelProperty(value = "包邮类型:0-全国包邮,1-部分包邮,2-自定义") + private Integer appoint; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "区域运费列表") + List regionList; + + @ApiModelProperty(value = "包邮运费列表") + List freeList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesRegionResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesRegionResponse.java new file mode 100644 index 0000000..5f0b0b6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/ShippingTemplatesRegionResponse.java @@ -0,0 +1,46 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 运费模板区域响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "ShippingTemplatesRegionResponse对象", description = "运费模板区域响应对象") +public class ShippingTemplatesRegionResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "城市名称描述") + private String title; + + @ApiModelProperty(value = "首件", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "首件金额不能低于0.1") + private BigDecimal first; + + @ApiModelProperty(value = "首件运费", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "首件运费金额不能低于0.1") + private BigDecimal firstPrice; + + @ApiModelProperty(value = "续件", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "续件不能低于0.1") + private BigDecimal renewal; + + @ApiModelProperty(value = "续件运费", required = true, example = "0.1") + @DecimalMin(value = "0.1", message = "续件运费金额不能低于0.1") + private BigDecimal renewalPrice; + + @ApiModelProperty(value = "分组唯一值") + private String uniqid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SpreadCommissionDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SpreadCommissionDetailResponse.java new file mode 100644 index 0000000..b308bf0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SpreadCommissionDetailResponse.java @@ -0,0 +1,39 @@ +package com.yzt.common.response; + +import com.yzt.common.model.user.UserBrokerageRecord; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 推广佣金明细响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "SpreadCommissionDetailResponse对象", description = "推广佣金明细响应对象") +public class SpreadCommissionDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + public SpreadCommissionDetailResponse() {} + + public SpreadCommissionDetailResponse(String date, List list) { + this.date = date; + this.list = list; + } + + @ApiModelProperty(value = "月份") + private String date; + + @ApiModelProperty(value = "数据") + private List list; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SpreadOrderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SpreadOrderResponse.java new file mode 100644 index 0000000..769b0fd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SpreadOrderResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.yzt.common.utils.CustomerBigDecimalSerialize; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 推广订单响应体 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SpreadOrderResponse对象", description="推广订单响应体") +public class SpreadOrderResponse { + + @ApiModelProperty(value = "订单ID") + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @JsonSerialize(using = CustomerBigDecimalSerialize.class) + @ApiModelProperty(value = "佣金金额") + private BigDecimal price; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SpreadUserResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SpreadUserResponse.java new file mode 100644 index 0000000..895a988 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SpreadUserResponse.java @@ -0,0 +1,69 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 推广用户响应体 + * + */ +@Data +public class SpreadUserResponse { + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "佣金金额,未提现金额") + private BigDecimal brokeragePrice; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "上级推广员名称") + private String spreadNickname; + + @ApiModelProperty(value = "用户购买次数") + private Integer payCount; + + @ApiModelProperty(value = "推广用户数") + private Integer spreadCount; + + @ApiModelProperty(value = "推广订单数") + private Integer spreadOrderNum; + + @ApiModelProperty(value = "推广订单额") + private BigDecimal spreadOrderTotalPrice; + + @ApiModelProperty(value = "佣金总金额") + private BigDecimal totalBrokeragePrice; + + @ApiModelProperty(value = "推广用户数量") + private int spreadPeopleCount; + + @ApiModelProperty(value = "已提现金额") + private BigDecimal extractCountPrice; + + @ApiModelProperty(value = "已提现次数") + private Integer extractCountNum; + + @ApiModelProperty(value = "冻结佣金") + private BigDecimal freezeBrokeragePrice; + + @ApiModelProperty(value = "成为分销员时间") + private Date promoterTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainDetailResponse.java new file mode 100644 index 0000000..7f67e6d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainDetailResponse.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 砍价商品详情响应对象(列表) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreBargainDetailResponse对象", description="砍价商品详情响应对象(列表)") +public class StoreBargainDetailResponse implements Serializable { + + private static final long serialVersionUID = 969438774401700566L; + + @ApiModelProperty(value = "砍价商品ID") + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + private String image; + + @ApiModelProperty(value = "砍价开启时间") + private Long startTime; + + @ApiModelProperty(value = "砍价结束时间") + private Long stopTime; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "限购总数") + private Integer quota; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainResponse.java new file mode 100644 index 0000000..625f208 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainResponse.java @@ -0,0 +1,144 @@ +package com.yzt.common.response; + +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.request.StoreProductAttrValueRequest; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 砍价商品响应体 + * + */ +@Data +public class StoreBargainResponse { + + @ApiModelProperty(value = "砍价商品ID") + private Integer id; + + @ApiModelProperty(value = "关联商品ID") + private Integer productId; + + @ApiModelProperty(value = "砍价活动名称") + private String title; + + @ApiModelProperty(value = "砍价活动图片") + private String image; + + @ApiModelProperty(value = "单位名称") + private String unitName; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "砍价商品轮播图") + private String images; + + @ApiModelProperty(value = "砍价开启时间") + private String startTime; + + @ApiModelProperty(value = "砍价结束时间") + private String stopTime; + + @ApiModelProperty(value = "砍价商品名称") + private String storeName; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal price; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "每次购买的砍价商品数量") + private Integer num; + + @ApiModelProperty(value = "用户每次砍价的最大金额") + private BigDecimal bargainMaxPrice; + + @ApiModelProperty(value = "用户每次砍价的最小金额") + private BigDecimal bargainMinPrice; + + @ApiModelProperty(value = "用户每次砍价的次数") + private Integer bargainNum; + + @ApiModelProperty(value = "砍价状态 0(到砍价时间不自动开启) 1(到砍价时间自动开启时间)") + private Boolean status; + + @ApiModelProperty(value = "反多少积分") + private Integer giveIntegral; + +// @ApiModelProperty(value = "砍价活动简介") +// private String info; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否推荐0不推荐1推荐") + private Boolean isHot; + + @ApiModelProperty(value = "是否删除 0未删除 1删除") + private Boolean isDel; + + @ApiModelProperty(value = "添加时间") + private String addTime; + + @ApiModelProperty(value = "是否包邮 0不包邮 1包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "砍价规则") + private String rule; + + @ApiModelProperty(value = "砍价商品浏览量") + private Integer look; + + @ApiModelProperty(value = "砍价商品分享量") + private Integer share; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "限量剩余") + private Integer surplusQuota; + + @ApiModelProperty(value = "帮助砍价好友人数") + private Integer peopleNum; + + @ApiModelProperty(value = "参与人数") + private Long countPeopleAll; + + @ApiModelProperty(value = "帮忙砍价人数") + private Long countPeopleHelp; + + @ApiModelProperty(value = "砍价成功人数") + private Long countPeopleSuccess; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserHelpResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserHelpResponse.java new file mode 100644 index 0000000..d7bdb11 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserHelpResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 砍价用户帮助响应体 + * + */ +@Data +public class StoreBargainUserHelpResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "砍价用户帮助表ID") + private Integer id; + + @ApiModelProperty(value = "帮助的用户id") + private Integer uid; + + @ApiModelProperty(value = "砍价商品ID") + private Integer bargainId; + + @ApiModelProperty(value = "用户参与砍价表id") + private Integer bargainUserId; + + @ApiModelProperty(value = "帮助砍价多少金额") + private BigDecimal price; + + @ApiModelProperty(value = "添加时间") + private String addTime; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserResponse.java new file mode 100644 index 0000000..258c218 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreBargainUserResponse.java @@ -0,0 +1,61 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 用户参与砍价响应体 + * + */ +@Data +public class StoreBargainUserResponse { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户参与砍价表ID") + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "砍价商品id") + private Integer bargainId; + + @ApiModelProperty(value = "砍价的最低价") + private BigDecimal bargainPriceMin; + + @ApiModelProperty(value = "砍价金额") + private BigDecimal bargainPrice; + + @ApiModelProperty(value = "砍掉的价格") + private BigDecimal price; + + @ApiModelProperty(value = "状态 1参与中 2 活动结束参与失败 3活动结束参与成功") + private Integer status; + + @ApiModelProperty(value = "参与时间") + private String addTime; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "结束时间") + private String dataTime; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "当前价") + private BigDecimal nowPrice; + + @ApiModelProperty(value = "剩余砍价次数") + private Integer num; + + @ApiModelProperty(value = "总砍价次数") + private Integer peopleNum; + + @ApiModelProperty(value = "砍价商品") + private String title; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCategoryTreeList.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCategoryTreeList.java new file mode 100644 index 0000000..385b8b4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCategoryTreeList.java @@ -0,0 +1,31 @@ +package com.yzt.common.response; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * StoreCategoryTreeList + * + */ +@Data +public class StoreCategoryTreeList { + private static final long serialVersionUID=1L; + + private Integer id; + + private Integer pid; + + private String cateName; + + private Integer sort; + + private String pic; + + private Boolean isShow; + + private Integer addTime; + + private List child = new ArrayList<>(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationH5Response.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationH5Response.java new file mode 100644 index 0000000..87d0c92 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationH5Response.java @@ -0,0 +1,53 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 拼团商品移动端对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCombinationH5Response对象", description="拼团商品移动端对象") +public class StoreCombinationH5Response implements Serializable { + + private static final long serialVersionUID = -885733985825623484L; + + @ApiModelProperty(value = "拼团商品ID") + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "活动标题") + private String title; + + @ApiModelProperty(value = "参团人数") + private Integer people; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "商品详情") + private String content; + + @ApiModelProperty(value = "收藏标识") + private boolean userCollect; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationResponse.java new file mode 100644 index 0000000..a3c0c3b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCombinationResponse.java @@ -0,0 +1,154 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; + +/** + * 拼团商品响应体 + * + */ +@Data +public class StoreCombinationResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团商品ID") + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "商户id") + private Integer merId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private String images; + + @ApiModelProperty(value = "活动标题") + private String title; + + @ApiModelProperty(value = "活动属性") + private String attr; + + @ApiModelProperty(value = "参团人数") + private Integer people; + +// @ApiModelProperty(value = "简介") +// private String info; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "添加时间") + private Long addTime; + + @ApiModelProperty(value = "推荐") + private Boolean isHost; + + @ApiModelProperty(value = "商品状态") + private Boolean isShow; + + private Boolean isDel; + + private Boolean combination; + + @ApiModelProperty(value = "商户是否可用1可用0不可用") + private Boolean merUse; + + @ApiModelProperty(value = "是否包邮1是0否") + private Boolean isPostage; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "拼团开始时间") + private Long startTime; + + @ApiModelProperty(value = "拼团结束时间") + private Long stopTime; + + @ApiModelProperty(value = "拼团结束时间") + private String stopTimeStr; + + @ApiModelProperty(value = "拼团订单有效时间(小时)") + private Integer effectiveTime; + + @ApiModelProperty(value = "拼图商品成本") + private BigDecimal cost; + + @ApiModelProperty(value = "浏览量") + private Integer browse; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "单次购买数量") + private Integer num; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限量总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "每个订单可购买数量") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟成团百分比") + private Integer virtualRation; + + @ApiModelProperty(value = "拼团人数") + private Integer countPeople; + + @ApiModelProperty(value = "参与人数") + private Integer countPeopleAll; + + @ApiModelProperty(value = "成团数量") + private Integer countPeoplePink; + + @ApiModelProperty(value = "限量剩余") + private Integer remainingQuota; + + @ApiModelProperty(value = "商品规格") +// private List productAttr; + private List> productAttr; + + @ApiModelProperty(value = "商品规格值") +// private List productValue; + private HashMap productValue; + + @ApiModelProperty(value = "商品单双规格") + private Boolean specType; + + @ApiModelProperty(value = "拼团单属性AttrValueId") + private Integer aloneAttrValueId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponFrontResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponFrontResponse.java new file mode 100644 index 0000000..02178eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponFrontResponse.java @@ -0,0 +1,99 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠券表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCouponFrontResponse对象", description="web优惠券相应对象") +public class StoreCouponFrontResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "优惠券表ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "兑换的优惠券面值") + private BigDecimal money; + + @ApiModelProperty(value = "是否限量, 默认0 不限量, 1限量") + private Boolean isLimited; + +// @ApiModelProperty(value = "发放总数") +// private Integer total; + + @ApiModelProperty(value = "剩余数量") + private Integer lastTotal; + + @ApiModelProperty(value = "所属商品id / 分类id") + private String primaryKey; + + @ApiModelProperty(value = "最低消费,0代表不限制") + private BigDecimal minPrice; + + @ApiModelProperty(value = "可领取开始时间") + private Date receiveStartTime; + + @ApiModelProperty(value = "可领取结束时间") + private Date receiveEndTime; + + @ApiModelProperty(value = "是否固定使用时间, 默认0 否, 1是") + private Boolean isFixedTime; + +// @ApiModelProperty(value = "可使用时间范围 开始时间") +// private Date useStartTime; +// +// @ApiModelProperty(value = "可使用时间范围 结束时间") +// private Date useEndTime; + + @ApiModelProperty(value = "天数") + private Integer day; + + @ApiModelProperty(value = "优惠券类型 1 手动领取, 2 新人券, 3 赠送券") + private Integer type; + +// @ApiModelProperty(value = "排序") +// private Integer sort; + +// @ApiModelProperty(value = "状态(0:关闭,1:开启)") +// private Boolean status; +// +// @ApiModelProperty(value = "是否删除 状态(0:否,1:是)") +// private Boolean isDel; +// +// @ApiModelProperty(value = "创建时间") +// private Date createTime; +// +// @ApiModelProperty(value = "更新时间") +// private Date updateTime; + + @ApiModelProperty(value = "是否已领取未使用") + private Boolean isUse = false; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "可使用时间范围 开始时间字符串") + private String useStartTimeStr; + + @ApiModelProperty(value = "可使用时间范围 结束时间字符串") + private String useEndTimeStr; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponInfoResponse.java new file mode 100644 index 0000000..15619fd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponInfoResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import com.yzt.common.model.category.Category; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.request.StoreCouponRequest; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 优惠券记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCouponInfoResponse对象", description="优惠券详情") +public class StoreCouponInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + + public StoreCouponInfoResponse(StoreCouponRequest coupon, List product, List category) { + this.coupon = coupon; + this.product = product; + this.category = category; + } + + @ApiModelProperty(value = "优惠券发布id") + private StoreCouponRequest coupon; + + @ApiModelProperty(value = "商品信息") + private List product; + + @ApiModelProperty(value = "分类信息") + private List category; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserOrder.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserOrder.java new file mode 100644 index 0000000..9dc58eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserOrder.java @@ -0,0 +1,83 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠券记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCouponUserOrder对象", description="下单之前可以使用的优惠券对象") +public class StoreCouponUserOrder implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "优惠券发布id") + private Integer couponId; + + @ApiModelProperty(value = "兑换的项目id") + private Integer cid; + + @ApiModelProperty(value = "领取人id") + private Integer uid; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "优惠券的面值") + private BigDecimal money; + + @ApiModelProperty(value = "最低消费多少金额可用优惠券") + private BigDecimal minPrice; + + @ApiModelProperty(value = "获取方式") + private String type; + + @ApiModelProperty(value = "状态(0:未使用,1:已使用, 2:已失效)") + private int status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "开始使用时间") + @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") + @JsonProperty("useStartTimeStr") + private Date startTime; + + @ApiModelProperty(value = "过期时间") + @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") + @JsonProperty("useEndTimeStr") + private Date endTime; + + @ApiModelProperty(value = "使用时间") + private Date useTime; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "主键id 商品id/分类id", required = true) + private String primaryKey; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserResponse.java new file mode 100644 index 0000000..9407d63 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreCouponUserResponse.java @@ -0,0 +1,93 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 优惠券记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreCouponUserResponse对象", description="优惠券记录表") +public class StoreCouponUserResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "优惠券发布id") + private Integer couponId; + + @ApiModelProperty(value = "兑换的项目id") + private Integer cid; + + @ApiModelProperty(value = "领取人id") + private Integer uid; + + @ApiModelProperty(value = "优惠券名称") + private String name; + + @ApiModelProperty(value = "优惠券的面值") + private BigDecimal money; + + @ApiModelProperty(value = "最低消费多少金额可用优惠券") + private BigDecimal minPrice; + + @ApiModelProperty(value = "获取方式") + private String type; + + @ApiModelProperty(value = "状态(0:未使用,1:已使用, 2:已失效)") + private int status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "开始使用时间") + private Date startTime; + + @ApiModelProperty(value = "过期时间") + private Date endTime; + + @ApiModelProperty(value = "使用时间") + private Date useTime; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "用户头像") + private Boolean isValid; + + @ApiModelProperty(value = "使用类型 1 全场通用, 2 商品券, 3 品类券") + private Integer useType; + + @ApiModelProperty(value = "主键id 商品id/分类id", required = true) + private String primaryKey; + + @ApiModelProperty(value = "有效状态:usable-可用,unusable-已用,overdue-过期,notStart-未开始") + private String validStr; + + @ApiModelProperty(value = "开始使用时间字符串") + private String useStartTimeStr; + + @ApiModelProperty(value = "过期时间字符串") + private String useEndTimeStr; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreNearResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreNearResponse.java new file mode 100644 index 0000000..aa7b1b1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreNearResponse.java @@ -0,0 +1,29 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.SystemStoreNearVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 附近的门店 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreNearRequest对象", description="附近的门店") +public class StoreNearResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "附近的门店列表", required = true) + private List list; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderCountItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderCountItemResponse.java new file mode 100644 index 0000000..d94d8e8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderCountItemResponse.java @@ -0,0 +1,55 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 订单状态数量 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderCountItemResponse对象", description="订单状态数量") +public class StoreOrderCountItemResponse implements Serializable { + + private static final long serialVersionUID = -8605913636959651047L; + + @ApiModelProperty(value = "总数") + private Integer all; + + @ApiModelProperty(value = "未支付") + private Integer unPaid; + + @ApiModelProperty(value = "未发货") + private Integer notShipped; + + @ApiModelProperty(value = "待收货") + private Integer spike; + + @ApiModelProperty(value = "待评价") + private Integer bargain; + + @ApiModelProperty(value = "交易完成") + private Integer complete; + + @ApiModelProperty(value = "待核销") + private Integer toBeWrittenOff; + + @ApiModelProperty(value = "退款中") + private Integer refunding; + + @ApiModelProperty(value = "已退款") + private Integer refunded; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "已删除") + private Integer deleted; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailInfoResponse.java new file mode 100644 index 0000000..6bb81e9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailInfoResponse.java @@ -0,0 +1,380 @@ +package com.yzt.common.response; + +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.vo.VirtualRemarkVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 订单详情响应体 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderDetailInfoResponse对象", description="订单详情响应体") +public class StoreOrderDetailInfoResponse implements Serializable { + + private static final long serialVersionUID = -4324222121352855551L; + + @ApiModelProperty(value = "订单ID") + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @ApiModelProperty(value = "详细地址") + private String userAddress; + + @ApiModelProperty(value = "运费金额") + private BigDecimal freightPrice; + +// @ApiModelProperty(value = "订单商品总数") +// private Integer totalNum; + + @ApiModelProperty(value = "订单总价") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "商品总价") + private BigDecimal proTotalPrice; + +// @ApiModelProperty(value = "邮费") +// private BigDecimal totalPostage; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "抵扣金额") + private BigDecimal deductionPrice; + + @ApiModelProperty(value = "优惠券id") + private Integer couponId; + + @ApiModelProperty(value = "优惠券金额") + private BigDecimal couponPrice; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付时间") + private Date payTime; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer status; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "退款用户说明") + private String refundReasonWapExplain; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "前台退款原因") + private String refundReasonWap; + + @ApiModelProperty(value = "不退款的理由") + private String refundReason; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "快递名称/送货人姓名") + private String deliveryName; + + @ApiModelProperty(value = "发货类型") + private String deliveryType; + + @ApiModelProperty(value = "快递单号/手机号") + private String deliveryId; + +// @ApiModelProperty(value = "消费赚取积分") +// private Integer gainIntegral; + + @ApiModelProperty(value = "使用积分") + private Integer useIntegral; +// +// @ApiModelProperty(value = "给用户退了多少积分") +// private Integer backIntegral; + + @ApiModelProperty(value = "备注") + private String mark; + +// @ApiModelProperty(value = "是否删除") +// private Boolean isDel; + +// @ApiModelProperty(value = "唯一id(md5加密)类似id") +// @TableField(value = "`unique`") +// private String unique; + +// @ApiModelProperty(value = "管理员备注") +// private String remark; + +// @ApiModelProperty(value = "商户ID") +// private Integer merId; + + private Integer isMerCheck; + + @ApiModelProperty(value = "拼团商品id0一般商品") + private Integer combinationId; + + @ApiModelProperty(value = "拼团id 0没有拼团") + private Integer pinkId; + +// @ApiModelProperty(value = "成本价") +// private BigDecimal cost; + + @ApiModelProperty(value = "秒杀商品ID") + private Integer seckillId; + + @ApiModelProperty(value = "砍价id") + private Integer bargainId; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + +// @ApiModelProperty(value = "店员id") +// private Integer clerkId; + + @ApiModelProperty(value = "支付渠道(0微信公众号1微信小程序)") + private int isChannel; + + @ApiModelProperty(value = "订单类型:0-普通订单,1-视频号订单") + private Integer type; + +// @ApiModelProperty(value = "消息提醒") +// private Boolean isRemind; + + @ApiModelProperty(value = "支付方式:前端") + private String payTypeStr; + + @ApiModelProperty(value = "订单状态描述:前端") + private String orderStatusMsg; + + @ApiModelProperty(value = "是否用户删除(软删)") + private Boolean isDel; + + @ApiModelProperty(value = "是否系统删除(后台/自动取消)") + private Boolean isSystemDel; + + @ApiModelProperty(value = "是否已取消(isDel 或 isSystemDel)") + private Boolean canceled; + + // 手动添加 +// private List cartInfo; +// private OrderAgainItemVo pStatus; +// @ApiModelProperty(value = "核销码相关") +// private List pVerifyCodes; + @ApiModelProperty(value = "系统门店信息") + private SystemStore systemStore; + @ApiModelProperty(value = "订单状态图标") + private String statusPic; + @ApiModelProperty(value = "订单详情") + private List orderInfoList; + + @ApiModelProperty(value = "虚拟商品备注信息,JSON 格式") + private String virtualRemark; + + @ApiModelProperty(value = "虚拟商品备注信息") + private List virtualRemarkVos; + + @ApiModelProperty(value = "发票信息") + private StoreOrderInvoice invoiceInfo; + +// @ApiModelProperty(value = "订单ID") +// private Integer id; +// +// @ApiModelProperty(value = "订单号") +// private String orderId; +// +// @ApiModelProperty(value = "用户id") +// private Integer uid; +// +// @ApiModelProperty(value = "用户姓名") +// private String realName; +// +// @ApiModelProperty(value = "用户电话") +// private String userPhone; +// +// @ApiModelProperty(value = "详细地址") +// private String userAddress; +// +// @ApiModelProperty(value = "运费金额") +// private BigDecimal freightPrice; +// +// @ApiModelProperty(value = "订单商品总数") +// private Integer totalNum; +// +// @ApiModelProperty(value = "订单总价") +// private BigDecimal totalPrice; +// +// @ApiModelProperty(value = "邮费") +// private BigDecimal totalPostage; +// +// @ApiModelProperty(value = "实际支付金额") +// private BigDecimal payPrice; +// +// @ApiModelProperty(value = "支付邮费") +// private BigDecimal payPostage; +// +// @ApiModelProperty(value = "抵扣金额") +// private BigDecimal deductionPrice; +// +// @ApiModelProperty(value = "优惠券id") +// private Integer couponId; +// +// @ApiModelProperty(value = "优惠券金额") +// private BigDecimal couponPrice; +// +// @ApiModelProperty(value = "支付状态") +// private Boolean paid; +// +// @ApiModelProperty(value = "支付时间") +// private Date payTime; +// +// @ApiModelProperty(value = "支付方式") +// private String payType; +// +// @ApiModelProperty(value = "创建时间") +// private Date createTime; +// +// @ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") +// private Integer status; +// +// @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") +// private Integer refundStatus; +// +// @ApiModelProperty(value = "退款图片") +// private String refundReasonWapImg; +// +// @ApiModelProperty(value = "退款用户说明") +// private String refundReasonWapExplain; +// +// @ApiModelProperty(value = "退款时间") +// private Date refundReasonTime; +// +// @ApiModelProperty(value = "前台退款原因") +// private String refundReasonWap; +// +// @ApiModelProperty(value = "不退款的理由") +// private String refundReason; +// +// @ApiModelProperty(value = "退款金额") +// private BigDecimal refundPrice; +// +// @ApiModelProperty(value = "快递名称/送货人姓名") +// private String deliveryName; +// +// @ApiModelProperty(value = "发货类型") +// private String deliveryType; +// +// @ApiModelProperty(value = "快递单号/手机号") +// private String deliveryId; +// +// @ApiModelProperty(value = "消费赚取积分") +// private Integer gainIntegral; +// +// @ApiModelProperty(value = "使用积分") +// private Integer useIntegral; +// +// @ApiModelProperty(value = "给用户退了多少积分") +// private Integer backIntegral; +// +// @ApiModelProperty(value = "备注") +// private String mark; +// +// @ApiModelProperty(value = "是否删除") +// private Boolean isDel; +// +// @ApiModelProperty(value = "唯一id(md5加密)类似id") +// @TableField(value = "`unique`") +// private String unique; +// +// @ApiModelProperty(value = "管理员备注") +// private String remark; +// +// @ApiModelProperty(value = "商户ID") +// private Integer merId; +// +// private Integer isMerCheck; +// +// @ApiModelProperty(value = "拼团商品id0一般商品") +// private Integer combinationId; +// +// @ApiModelProperty(value = "拼团id 0没有拼团") +// private Integer pinkId; +// +// @ApiModelProperty(value = "成本价") +// private BigDecimal cost; +// +// @ApiModelProperty(value = "秒杀商品ID") +// private Integer seckillId; +// +// @ApiModelProperty(value = "砍价id") +// private Integer bargainId; +// +// @ApiModelProperty(value = "核销码") +// private String verifyCode; +// +// @ApiModelProperty(value = "门店id") +// private Integer storeId; +// +// @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") +// private Integer shippingType; +// +// @ApiModelProperty(value = "店员id") +// private Integer clerkId; +// +// @ApiModelProperty(value = "支付渠道(0微信公众号1微信小程序)") +// private int isChannel; +// +// @ApiModelProperty(value = "消息提醒") +// private Boolean isRemind; +// +// @ApiModelProperty(value = "后台是否删除") +// private Boolean isSystemDel; +// +// // 手动添加 +// private List cartInfo; +// private OrderAgainItemVo pStatus; +// private List pVerifyCodes; +// private Date addTimeY; +// private Date addTimeH; +// private SystemStore systemStore; +// private String mapKey; +// private String statusPic; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailResponse.java new file mode 100644 index 0000000..457c668 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderDetailResponse.java @@ -0,0 +1,119 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.StoreOrderInfoOldVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单信息响应对象(pc列表用) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderDetailResponse对象", description="订单信息响应对象(pc列表用)") +public class StoreOrderDetailResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer status; + + @ApiModelProperty(value = "商品信息") + private List productList = new ArrayList<>(); + + @ApiModelProperty(value = "订单状态") + private Map statusStr; + + @ApiModelProperty(value = "支付方式") + private String payTypeStr; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "退款用户说明") + private String refundReasonWapExplain; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "前台退款原因") + private String refundReasonWap; + + @ApiModelProperty(value = "不退款的理由") + private String refundReason; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "订单类型") + private String orderType; + + @ApiModelProperty(value = "订单管理员备注") + private String remark; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "商品总价") + private BigDecimal proTotalPrice; + + @ApiModelProperty(value = "优惠券金额") + private BigDecimal couponPrice; + + @ApiModelProperty(value = "改价前支付金额") + private BigDecimal beforePayPrice; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "订单类型:0-普通订单,1-视频号订单") + private Integer type; + + @ApiModelProperty(value = "是否改价,0-否,1-是") + private Boolean isAlterPrice; + + @ApiModelProperty(value = "商家寄件单号图片") + private String shipmentPic; + + @ApiModelProperty(value = "商家寄件订单任务id") + private String shipmentTaskId; + + @ApiModelProperty(value = "商家寄件订单单号") + private String shipmentOrderId; + + @ApiModelProperty(value = "公司名称") + private String tenantName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderInfoResponse.java new file mode 100644 index 0000000..04a62c2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderInfoResponse.java @@ -0,0 +1,160 @@ +package com.yzt.common.response; + +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderInfoResponse对象", description="订单详情响应对象") +public class StoreOrderInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单ID") + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @ApiModelProperty(value = "详细地址") + private String userAddress; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "订单总价") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "优惠券金额") + private BigDecimal couponPrice; + + @ApiModelProperty(value = "抵扣金额") + private BigDecimal deductionPrice; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货;3:待评价;-1:已退款)") + private Integer status; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "发货记录类型,1正常、2电子面单,3商家发货 发货类型必传 =3 时根据描述填写必填字段,注意为了方便本身不做必填校验") + private String expressRecordType; + + @ApiModelProperty(value = "快递名称/送货人姓名") + private String deliveryName; + + @ApiModelProperty(value = "发货类型 express 发货,send 送货,fictitious虚拟") + private String deliveryType; + + @ApiModelProperty(value = "快递单号/手机号") + private String deliveryId; + + @ApiModelProperty(value = "快递公司简称") + private String deliveryCode; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "使用积分") + private Integer useIntegral; + + @ApiModelProperty(value = "给用户退了多少积分") + private Integer backIntegral; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + + @ApiModelProperty(value = "订单状态") + private Map statusStr; + + @ApiModelProperty(value = "支付方式") + private String payTypeStr; + + @ApiModelProperty(value = "用户昵称") + private String nikeName; + + @ApiModelProperty(value = "用户电话") + private String phone; + + @ApiModelProperty(value = "订单商品详情") + List orderInfo; + + @ApiModelProperty(value = "提货点") + private SystemStore systemStore; + + @ApiModelProperty(value = "推广人名称") + private String spreadName; + + @ApiModelProperty(value = "商品总价") + private BigDecimal proTotalPrice; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "商家寄件单号图片") + private String shipmentPic; + + @ApiModelProperty(value = "商家寄件订单任务id") + private String shipmentTaskId; + + @ApiModelProperty(value = "商家寄件订单单号") + private String shipmentOrderId; + + @ApiModelProperty(value = "商家寄件快递单号") + private String shipmentNum; + + @ApiModelProperty(value = "订单类型") + private String orderTypeText; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderItemResponse.java new file mode 100644 index 0000000..ef2aab6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderItemResponse.java @@ -0,0 +1,142 @@ +package com.yzt.common.response; + +import com.yzt.common.vo.StoreOrderInfoOldVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 订单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderItemResponse对象", description="核销订单") +public class StoreOrderItemResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单ID") + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @ApiModelProperty(value = "订单总价") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付时间") + private Date payTime; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货;3:待评价;-1:已退款)") + private Integer status; + + @ApiModelProperty(value = "门店名称") + private String storeName; + + @ApiModelProperty(value = "店员名称") + private String clerkName; + + @ApiModelProperty(value = "商品信息") + private List productList = new ArrayList<>(); + + @ApiModelProperty(value = "订单状态") + private Map statusStr; + + @ApiModelProperty(value = "支付方式") + private String payTypeStr; + + @ApiModelProperty(value = "邮费") + private BigDecimal totalPostage; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "消费赚取积分") + private BigDecimal gainIntegral; + + @ApiModelProperty(value = "使用积分") + private BigDecimal useIntegral; + + @ApiModelProperty(value = "给用户退了多少积分") + private BigDecimal backIntegral; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "后台是否删除") + private Boolean isSystemDel; + + @ApiModelProperty(value = "用户备注") + private String mark; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "退款用户说明") + private String refundReasonWapExplain; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "前台退款原因") + private String refundReasonWap; + + @ApiModelProperty(value = "不退款的理由") + private String refundReason; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "推广人信息") + private StoreOrderSpreadInfoResponse spreadInfo = new StoreOrderSpreadInfoResponse(); + + @ApiModelProperty(value = "订单类型") + private String orderType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderSpreadInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderSpreadInfoResponse.java new file mode 100644 index 0000000..33ec22d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderSpreadInfoResponse.java @@ -0,0 +1,30 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 订单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderSpreadInfoResponse对象", description="推广人信息") +public class StoreOrderSpreadInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "推广人id") + private Integer id = 0; + + @ApiModelProperty(value = "推广人姓名") + private String name = ""; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsChartItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsChartItemResponse.java new file mode 100644 index 0000000..b4dccd4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsChartItemResponse.java @@ -0,0 +1,14 @@ +package com.yzt.common.response; + +import lombok.Data; + +/** + * 订单统计 response item + * + */ +@Data +public class StoreOrderStatisticsChartItemResponse { + + private String num; + private String time; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsResponse.java new file mode 100644 index 0000000..c94bc0d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderStatisticsResponse.java @@ -0,0 +1,29 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * StoreOrderStatisticsResponse + * + */ +@Data +public class StoreOrderStatisticsResponse { + @ApiModelProperty(value = "订单数图标数据") + private List chart; // 订单数图标数据 + + @ApiModelProperty(value = "时间区间增长率") + private Integer growthRate; // 时间区间增长率 + + @ApiModelProperty(value = "同比") + private String increaseTime; + + @ApiModelProperty(value = "同比上个时间区间增长营业额 1=增长,2=减少") + private Integer increaseTimeStatus; // 同比上个时间区间增长营业额 1=增长,2=减少 + + @ApiModelProperty(value = "时间区间订单数") + private BigDecimal time; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderTopItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderTopItemResponse.java new file mode 100644 index 0000000..a1bcc18 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderTopItemResponse.java @@ -0,0 +1,35 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单九宫格数据 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderTopItemResponse对象", description="订单九宫格数据") +public class StoreOrderTopItemResponse implements Serializable { + + private static final long serialVersionUID = -7583407020447771557L; + + @ApiModelProperty(value = "订单数量") + private Integer count; + + @ApiModelProperty(value = "订单金额") + private BigDecimal amount; + + @ApiModelProperty(value = "微信支付金额") + private BigDecimal weChatAmount; + + @ApiModelProperty(value = "余额支付") + private BigDecimal yueAmount; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderVerificationConfirmResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderVerificationConfirmResponse.java new file mode 100644 index 0000000..da01bb1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreOrderVerificationConfirmResponse.java @@ -0,0 +1,174 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 核销订单确认前的数据 + * + */ +@Data +public class StoreOrderVerificationConfirmResponse { + + @ApiModelProperty(value = "订单ID") + private Integer id; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户姓名") + private String realName; + + @ApiModelProperty(value = "用户电话") + private String userPhone; + + @ApiModelProperty(value = "详细地址") + private String userAddress; + + @ApiModelProperty(value = "运费金额") + private BigDecimal freightPrice; + + @ApiModelProperty(value = "订单商品总数") + private Integer totalNum; + + @ApiModelProperty(value = "订单总价") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "邮费") + private BigDecimal totalPostage; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payPrice; + + @ApiModelProperty(value = "支付邮费") + private BigDecimal payPostage; + + @ApiModelProperty(value = "抵扣金额") + private BigDecimal deductionPrice; + + @ApiModelProperty(value = "优惠券id") + private Integer couponId; + + @ApiModelProperty(value = "优惠券金额") + private BigDecimal couponPrice; + + @ApiModelProperty(value = "支付状态") + private Boolean paid; + + @ApiModelProperty(value = "支付时间") + private Date payTime; + + @ApiModelProperty(value = "支付方式") + private String payType; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "订单状态(-1 : 申请退款 -2 : 退货成功 0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer status; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") + private Integer refundStatus; + + @ApiModelProperty(value = "退款图片") + private String refundReasonWapImg; + + @ApiModelProperty(value = "退款用户说明") + private String refundReasonWapExplain; + + @ApiModelProperty(value = "退款时间") + private Date refundReasonTime; + + @ApiModelProperty(value = "前台退款原因") + private String refundReasonWap; + + @ApiModelProperty(value = "不退款的理由") + private String refundReason; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "快递名称/送货人姓名") + private String deliveryName; + + @ApiModelProperty(value = "发货类型") + private String deliveryType; + + @ApiModelProperty(value = "快递单号/手机号") + private String deliveryId; + + @ApiModelProperty(value = "消费赚取积分") + private Integer gainIntegral; + + @ApiModelProperty(value = "使用积分") + private Integer useIntegral; + + @ApiModelProperty(value = "给用户退了多少积分") + private Integer backIntegral; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "唯一id(md5加密)类似id") + @TableField(value = "`unique`") + private String unique; + + @ApiModelProperty(value = "管理员备注") + private String remark; + + @ApiModelProperty(value = "商户ID") + private Integer merId; + + private Integer isMerCheck; + + @ApiModelProperty(value = "拼团商品id0一般商品") + private Integer combinationId; + + @ApiModelProperty(value = "拼团id 0没有拼团") + private Integer pinkId; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "秒杀商品ID") + private Integer seckillId; + + @ApiModelProperty(value = "砍价id") + private Integer bargainId; + + @ApiModelProperty(value = "核销码") + private String verifyCode; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "配送方式 1=快递 ,2=门店自提") + private Integer shippingType; + + @ApiModelProperty(value = "店员id") + private Integer clerkId; + + @ApiModelProperty(value = "支付渠道(0微信公众号1微信小程序)") + private int isChannel; + + @ApiModelProperty(value = "消息提醒") + private Boolean isRemind; + + @ApiModelProperty(value = "后台是否删除") + private Boolean isSystemDel; + + @ApiModelProperty(value = "订单详情") + private List storeOrderInfoVos; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StorePinkAdminListResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkAdminListResponse.java new file mode 100644 index 0000000..266a3c4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkAdminListResponse.java @@ -0,0 +1,67 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 拼团列表响应体 + * + */ +@Data +public class StorePinkAdminListResponse { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团ID") + private Integer id; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "拼团总人数") + private Integer people; + + @ApiModelProperty(value = "开始时间") + private String addTime; + + @ApiModelProperty(value = "结束时间") + private String stopTime; + + @ApiModelProperty(value = "团长id 0为团长") + private Integer kId; + + @ApiModelProperty(value = "状态1进行中2已完成3未完成") + private Integer status; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "几人参团") + private Integer countPeople; + + @ApiModelProperty(value = "拼团商品") + private String title; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "客户姓名") + private String name; + + @ApiModelProperty("租户名称") + private String tenantName; + + @ApiModelProperty(value = "当前队列的排队序号") + private Integer queueNo; + + @ApiModelProperty(value = "排队免单进度(1.00表示100%)") + private BigDecimal queueProgress; + + @ApiModelProperty(value = "排队码编号(年月日时分秒+六位随机数)") + private String queueCode; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StorePinkDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkDetailResponse.java new file mode 100644 index 0000000..2126f27 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkDetailResponse.java @@ -0,0 +1,48 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 拼团表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StorePinkDetailResponse对象", description="拼团详情响应对象") +public class StorePinkDetailResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团ID") + private Integer id; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "订单id 生成") + private String orderId; + + @ApiModelProperty(value = "购买总金额") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") + private Integer orderStatus; + + @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款 3退款中") + private Integer refundStatus; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StorePinkResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkResponse.java new file mode 100644 index 0000000..64d251e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StorePinkResponse.java @@ -0,0 +1,79 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 拼团响应体 + * + */ +@Data +public class StorePinkResponse { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "拼团ID") + private Integer id; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "订单id 生成") + private String orderId; + + @ApiModelProperty(value = "订单id 数据库") + private Integer orderIdKey; + + @ApiModelProperty(value = "购买商品个数") + private Integer totalNum; + + @ApiModelProperty(value = "购买总金额") + private BigDecimal totalPrice; + + @ApiModelProperty(value = "拼团商品id") + private Integer cid; + + @ApiModelProperty(value = "商品id") + private Integer pid; + + @ApiModelProperty(value = "拼图总人数") + private Integer people; + + @ApiModelProperty(value = "拼团商品单价") + private BigDecimal price; + + @ApiModelProperty(value = "开始时间") + private Long addTime; + + @ApiModelProperty(value = "结束时间") + private Long stopTime; + + @ApiModelProperty(value = "团长id 0为团长") + private Integer kId; + + @ApiModelProperty(value = "是否发送模板消息0未发送1已发送") + private Boolean isTpl; + + @ApiModelProperty(value = "是否退款 0未退款 1已退款") + private Boolean isRefund; + + @ApiModelProperty(value = "状态1进行中2已完成3未完成") + private Integer status; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "是否虚拟拼团") + private Boolean is_virtual; + + @ApiModelProperty(value = "几人参团") + private Integer countPeople; + + @ApiModelProperty(value = "还剩几人成团") + private Integer count; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductAttrValueResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductAttrValueResponse.java new file mode 100644 index 0000000..19da0b3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductAttrValueResponse.java @@ -0,0 +1,99 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.Min; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 商品属性值表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_store_product_attr_value") +@ApiModel(value="StoreProductAttrValue对象", description="商品属性值表") +public class StoreProductAttrValueResponse implements Serializable { + + private static final long serialVersionUID=1L; + @ApiModelProperty(value = "ID") + private Integer id; + + @ApiModelProperty(value = "商品ID", example = "0") + @Min(value = 0, message = "请选择商品") + private Integer productId; + + @ApiModelProperty(value = "商品属性索引值 (attr_value|attr_value[|....])") + private String suk; + + @ApiModelProperty(value = "属性对应的库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "属性金额") + private BigDecimal price; + + @ApiModelProperty(value = "图片") + private String image; + + @ApiModelProperty(value = "唯一值") + private String unique; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "商品条码") + private String barCode; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "一级返佣") + private BigDecimal brokerage; + + @ApiModelProperty(value = "二级返佣") + private BigDecimal brokerageTwo; + + @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团") + private Integer type; + + @ApiModelProperty(value = "活动限购数量") + private Integer quota; + + @ApiModelProperty(value = "活动限购数量显示") + private Integer quotaShow; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "attrValue字段,取表中suk字段") + private Object attrValue; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "是否选中") + private Boolean checked; + + @ApiModelProperty(value = "会员价") + private BigDecimal vipPrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductInfoResponse.java new file mode 100644 index 0000000..1d20b28 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductInfoResponse.java @@ -0,0 +1,158 @@ +package com.yzt.common.response; + +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 商品详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductInfoResponse对象", description="商品详情响应对象") +public class StoreProductInfoResponse implements Serializable { + + private static final long serialVersionUID = 9215241889318610262L; + + @ApiModelProperty(value = "商品id") + private Integer id; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "轮播图") + private String sliderImage; + + @ApiModelProperty(value = "商品名称") + private String storeName; + +// @ApiModelProperty(value = "商品简介") +// private String storeInfo; + + @ApiModelProperty(value = "关键字") + private String keyword; + + @ApiModelProperty(value = "分类id") + private String cateId; + + @ApiModelProperty(value = "分类中文") + private String cateStr; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "是否热卖") + private Boolean isHot; + + @ApiModelProperty(value = "是否优惠") + private Boolean isBenefit; + + @ApiModelProperty(value = "是否精品") + private Boolean isBest; + + @ApiModelProperty(value = "是否新品") + private Boolean isNew; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "是否优品推荐") + private Boolean isGood; + + @ApiModelProperty(value = "是否单独分佣") + private Boolean isSub; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "规格 0单 1多") + private Boolean specType; + + @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团") + private List activity; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "产品ID") + private Integer productId; + +// @ApiModelProperty(value = "优惠券") +// private List coupons; + + @ApiModelProperty(value = "优惠券Ids") + private List couponIds; + + // 以下为活动商品部分 + + @ApiModelProperty(value = "状态 0=关闭 1=开启|营销商品用") + private Integer status; + + @ApiModelProperty(value = "运费模板ID|秒杀商品专用") + private Integer timeId; + + @ApiModelProperty(value = "秒杀开启时间|秒杀专用") + private String startTimeStr; + + @ApiModelProperty(value = "秒杀结束时间|秒杀专用") + private String stopTimeStr; + + @ApiModelProperty(value = "当天参与秒杀次数|秒杀专用") + private Integer num; + + @ApiModelProperty(value = "砍价开启时间|砍价专用") + private Long startTime; + + @ApiModelProperty(value = "砍价结束时间|砍价专用") + private Long stopTime; + + @ApiModelProperty(value = "砍价活动名称|砍价专用") + private String title; + + @ApiModelProperty(value = "帮砍次数|砍价专用") + private Integer bargainNum; + + @ApiModelProperty(value = "帮助砍价好友人数|砍价专用") + private Integer peopleNum; + + @ApiModelProperty(value = "拼团订单有效时间(小时)|拼团专用") + private Integer effectiveTime; + + @ApiModelProperty(value = "每个订单可购买数量|拼团专用") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟成团百分比|拼团专用") + private Integer virtualRation; + + @ApiModelProperty(value = "参团人数|拼团专用") + private Integer people; + + @ApiModelProperty(value = "商品状态|拼团专用") + private Boolean isShow; + +// @ApiModelProperty(value = "简介|拼团专用") +// private String info; + + @ApiModelProperty(value = "展示图") + private String flatPattern; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplayCountResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplayCountResponse.java new file mode 100644 index 0000000..de16ec8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplayCountResponse.java @@ -0,0 +1,52 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品评价数量和好评度 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreProductReplayCountResponse对象", description="产品评价数量和好评度") +public class StoreProductReplayCountResponse implements Serializable { + + private static final long serialVersionUID=1L; + + public StoreProductReplayCountResponse() {} + public StoreProductReplayCountResponse(Long sumCount, Long goodCount, Long inCount, Long poorCount, String replyChance, Integer replyStar) { + this.sumCount = sumCount; + this.goodCount = goodCount; + this.inCount = inCount; + this.poorCount = poorCount; + this.replyChance = replyChance; + this.replyStar = replyStar; + } + + @ApiModelProperty(value = "评论总数") + private Long sumCount; + + @ApiModelProperty(value = "好评总数") + private Long goodCount; + + @ApiModelProperty(value = "中评总数") + private Long inCount; + + @ApiModelProperty(value = "差评总数") + private Long poorCount; + + @ApiModelProperty(value = "好评率") + private String replyChance; + + @ApiModelProperty(value = "评分星数") + private Integer replyStar; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplyResponse.java new file mode 100644 index 0000000..dc490ec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductReplyResponse.java @@ -0,0 +1,76 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.yzt.common.model.product.StoreProduct; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 商品评论响应体 + * + */ +@Data +public class StoreProductReplyResponse { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "评论ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户ID") + private Integer uid; + + @ApiModelProperty(value = "订单ID") + private Integer oid; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "某种商品类型(普通商品、秒杀商品)") + private String replyType; + + @ApiModelProperty(value = "商品分数") + private Integer productScore; + + @ApiModelProperty(value = "服务分数") + private Integer serviceScore; + + @ApiModelProperty(value = "评论内容") + private String comment; + + @ApiModelProperty(value = "评论图片") + private List pics; + + @ApiModelProperty(value = "管理员回复内容") + private String merchantReplyContent; + + @ApiModelProperty(value = "管理员回复时间") + private Integer merchantReplyTime; + + @ApiModelProperty(value = "0未删除1已删除") + private Boolean isDel; + + @ApiModelProperty(value = "0未回复1已回复") + private Boolean isReply; + + @ApiModelProperty(value = "用户名称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "评论时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "商品规格属性值") + private String sku; + + private StoreProduct storeProduct; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductResponse.java new file mode 100644 index 0000000..bbee492 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductResponse.java @@ -0,0 +1,257 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +/** + * 商品表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("eb_store_product") +@ApiModel(value="StoreProduct对象", description="商品表") +public class StoreProductResponse implements Serializable { + + @ApiModelProperty(value = "商品id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)") + private Integer merId; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "轮播图") + private String sliderImage; + + @ApiModelProperty(value = "商品名称") + private String storeName; + +// @ApiModelProperty(value = "商品简介") +// private String storeInfo; + + @ApiModelProperty(value = "关键字") + private String keyword; + + @ApiModelProperty(value = "商品条码(一维码)") + private String barCode; + + @ApiModelProperty(value = "分类id") + private String cateId; + + @ApiModelProperty(value = "分类中文") + private String cateValues; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + @ApiModelProperty(value = "会员价格") + private BigDecimal vipPrice; + + @ApiModelProperty(value = "市场价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "状态(0:未上架,1:上架)") + private Boolean isShow; + + @ApiModelProperty(value = "是否热卖") + private Boolean isHot; + + @ApiModelProperty(value = "是否优惠") + private Boolean isBenefit; + + @ApiModelProperty(value = "是否精品") + private Boolean isBest; + + @ApiModelProperty(value = "是否新品") + private Boolean isNew; + + @ApiModelProperty(value = "添加时间") + private Integer addTime; + + @ApiModelProperty(value = "是否包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "商户是否代理 0不可代理1可代理") + private Boolean merUse; + + @ApiModelProperty(value = "获得积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "成本价") + private BigDecimal cost; + + @ApiModelProperty(value = "秒杀状态 0 未开启 1已开启") + private Boolean isSeckill; + + @ApiModelProperty(value = "砍价状态 0未开启 1开启") + private Boolean isBargain; + + @ApiModelProperty(value = "是否优品推荐") + private Boolean isGood; + + @ApiModelProperty(value = "是否单独分佣") + private Boolean isSub; + + @ApiModelProperty(value = "虚拟销量") + private Integer ficti; + + @ApiModelProperty(value = "浏览量") + private Integer browse; + + @ApiModelProperty(value = "商品二维码地址(用户小程序海报)") + private String codePath; + + @ApiModelProperty(value = "淘宝京东1688类型") + private String soureLink; + + @ApiModelProperty(value = "主图视频链接") + private String videoLink; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "规格 0单 1多") + private Boolean specType; + + @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团") + private String activity; + + @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团") + private String activityStr; + + @ApiModelProperty(value = "为移动端特定参数") + private ProductActivityItemResponse activityH5; + + @ApiModelProperty(value = "为移动端特定参数 所有参与的活动") + private List activityAllH5; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; + + @ApiModelProperty(value = "管理端用于映射attrResults") + private List> attrValues; + + private Integer[] cateIds; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "收藏数量") + private Integer collectCount; + + @ApiModelProperty(value = "优惠券") + private List coupons; + + @ApiModelProperty(value = "优惠券Ids") + private List couponIds; + + // 秒杀用到 + @ApiModelProperty(value = "活动标题") + private String title; + +// @ApiModelProperty(value = "简介") +// private String info; + + @ApiModelProperty(value = "时间段ID") + private Integer timeId; + + @ApiModelProperty(value = "最多秒杀几个") + private Integer num; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date stopTime; + + @ApiModelProperty(value = "开始时间") + private String startTimeStr; + + @ApiModelProperty(value = "结束时间") + private String stopTimeStr; + + @ApiModelProperty(value = "秒杀状态 0=关闭 1=开启") + private Integer status; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "秒杀轮播图") + private String images; + + @ApiModelProperty(value = "限购数量 - 销量") + private Integer quota; + + @ApiModelProperty(value = "限购总数") + private Integer quotaShow; + + @ApiModelProperty(value = "砍价规则") + private String rule; + + @ApiModelProperty(value = "用户每次砍价的次数") + private Integer bargainNum; + + @ApiModelProperty(value = "帮助砍价好友人数") + private Integer peopleNum; + + // 拼团部分 + @ApiModelProperty(value = "推荐") + private Boolean isHost; + + @ApiModelProperty(value = "参团人数") + private Integer people; + + @ApiModelProperty(value = "拼团订单有效时间(小时)") + private Integer effectiveTime; + + @ApiModelProperty(value = "单次购买数量") + private Integer onceNum; + + @ApiModelProperty(value = "虚拟成团百分比") + private Integer virtualRation; + + @ApiModelProperty(value = "砍价商品最低价") + private BigDecimal minPrice; + + @ApiModelProperty(value = "砍价结束时间") + private Long endTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreProductTabsHeader.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductTabsHeader.java new file mode 100644 index 0000000..65e315e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreProductTabsHeader.java @@ -0,0 +1,23 @@ +package com.yzt.common.response; + +import lombok.Data; + +/** + * StoreProductTabsHeader + * + */ +@Data +public class StoreProductTabsHeader { + private Integer count; + private String name; + private Integer type; // 1=出售中商品 2=仓库中商品 4=已经售罄商品 5=警戒库存 6=商品回收站 + + public StoreProductTabsHeader() { + } + + public StoreProductTabsHeader(Integer count, String name, Integer type) { + this.count = count; + this.name = name; + this.type = type; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreSecKillH5Response.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreSecKillH5Response.java new file mode 100644 index 0000000..92d637c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreSecKillH5Response.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 秒杀商品移动端对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreSecKillH5Response对象", description="秒杀商品移动端对象") +public class StoreSecKillH5Response implements Serializable { + + private static final long serialVersionUID = -885733985825623484L; + + @ApiModelProperty(value = "商品秒杀产品表id") + private Integer id; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "活动标题") + private String title; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "已抢百分比") + private Integer percent; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillDetailResponse.java new file mode 100644 index 0000000..5a34231 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillDetailResponse.java @@ -0,0 +1,43 @@ +package com.yzt.common.response; + +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * 商品秒杀详情响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreSeckillDetailResponse对象", description="商品秒杀详情响应对象") +public class StoreSeckillDetailResponse implements Serializable { + + private static final long serialVersionUID = -4101548587444327191L; + + @ApiModelProperty(value = "产品属性") + private List productAttr; + + @ApiModelProperty(value = "商品属性详情") + private HashMap productValue; + + @ApiModelProperty(value = "返佣金额区间") + private String priceName; + + @ApiModelProperty(value = "收藏标识") + private Boolean userCollect; + + @ApiModelProperty(value = "秒杀商品信息") + private SecKillDetailH5Response storeSeckill; + + @ApiModelProperty(value = "主商品状态:normal-正常,sellOut-售罄,soldOut-下架,delete-删除") + private String masterStatus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillManagerResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillManagerResponse.java new file mode 100644 index 0000000..fba9063 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillManagerResponse.java @@ -0,0 +1,104 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.yzt.common.utils.YztDateUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.Objects; + +/** + * StoreSeckillMsnsgerResponse + * + */ +@Data +public class StoreSeckillManagerResponse { + private static final long serialVersionUID=1L; + + // 自定义statusName值 + // 开启 = status = 1 && 当前时间小于startTime + // 关闭 = status = 0 + // 进行中 = status = 1 && 当前时间大于startTime 小于 stopTime + // 已结束 = status = 1 && 当前时间大于结束时间 + // 秒杀状态【仅仅前端用】 killStatus 1=即将开始 0=关闭 2=进行中 -1=已结束 + public String getStatusName() { + String _statusName = null; + int currentHour = YztDateUtil.getCurrentHour(); + if(Objects.equals(status, "'1'") && currentHour < startTime){ + _statusName = "即将开始"; + } + else if(Objects.equals(status, "'0'")) { + _statusName = "关闭"; + } + else if(Objects.equals(status, "'1'") && currentHour < endTime) { + _statusName = "进行中"; + } + else if(Objects.equals(status, "'1'") && currentHour >= endTime) { + _statusName = "已结束"; + } + return _statusName; + } + + public Integer getKillStatus() { + Integer _killStatus = null; + if(Objects.equals(status, "'1'") && YztDateUtil.getCurrentHour() < startTime){ + _killStatus = 1; + } + else if(Objects.equals(status, "'0'")) { + _killStatus = 0; + } + else if(Objects.equals(status, "'1'") && YztDateUtil.getCurrentHour() >= startTime + && YztDateUtil.getCurrentHour() < endTime) { + _killStatus = 2; + } + else if(Objects.equals(status, "'1'") && YztDateUtil.getCurrentHour() >= endTime) { + _killStatus = -1; + } + return _killStatus; + } + + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "秒杀名称") + private String name; + + @ApiModelProperty(value = "秒杀开始时间段") + private Integer startTime; + + @ApiModelProperty(value = "秒杀结束时间段") + private Integer endTime; + + private String time; + + @ApiModelProperty(value = "主图") + private String img; + + @ApiModelProperty(value = "轮播图") + private String silderImgs; + + @ApiModelProperty(value = "秒杀状态,前端用") + private Integer killStatus; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "状态 0=关闭 1=开启") + private String status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "0未删除1已删除") + private Boolean isDel; + + @ApiModelProperty(value = "秒杀状态String 未开始/进行中/活动已结束") + private String statusName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillResponse.java new file mode 100644 index 0000000..3f5f61c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreSeckillResponse.java @@ -0,0 +1,155 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.yzt.common.model.product.StoreProductAttr; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +/** + * 秒杀商品 response + * + */ +@Data +public class StoreSeckillResponse { + + @ApiModelProperty(value = "商品秒杀产品表id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer productId; + + @ApiModelProperty(value = "推荐图") + private String image; + + @ApiModelProperty(value = "轮播图") + private List images; + + @ApiModelProperty(value = "活动标题") + private String title; + +// @ApiModelProperty(value = "简介") +// private String info; + + @ApiModelProperty(value = "价格") + private BigDecimal price; + + @ApiModelProperty(value = "成本") + private BigDecimal cost; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "返多少积分") + private Integer giveIntegral; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "库存") + private Integer stock; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "单位名") + private String unitName; + + @ApiModelProperty(value = "邮费") + private BigDecimal postage; + + @ApiModelProperty(value = "内容") + private String description; + + @ApiModelProperty(value = "开始时间") + @JsonFormat(pattern="yyyy-MM-dd") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + @JsonFormat(pattern="yyyy-MM-dd") + private Date stopTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "秒杀状态 原本 0=关闭 1=开启") + private Integer status; + + @ApiModelProperty(value = "秒杀状态String 未开始/进行中/活动已结束") + private String statusName; + + @ApiModelProperty(value = "秒杀状态,前端用") + private Integer killStatus; + + @ApiModelProperty(value = "是否包邮") + private Boolean isPostage; + + @ApiModelProperty(value = "删除 0未删除1已删除") + private Boolean isDel; + + @ApiModelProperty(value = "最多秒杀几个") + private Integer num; + + @ApiModelProperty(value = "剩余限量") + private int limitLeftNum; + + @ApiModelProperty(value = "显示") + private Boolean isShow; + + @ApiModelProperty(value = "时间段ID") + private Integer timeId; + + @ApiModelProperty(value = "运费模板ID") + private Integer tempId; + + @ApiModelProperty(value = "重量") + private BigDecimal weight; + + @ApiModelProperty(value = "体积") + private BigDecimal volume; + + @ApiModelProperty(value = "限购总数") + private Integer quota; + + @ApiModelProperty(value = "限购总数显示") + private Integer quotaShow; + + @ApiModelProperty(value = "商品属性") + private List attr; + + @ApiModelProperty(value = "商品属性详情") + private List attrValue; + + @ApiModelProperty(value = "管理端用于映射attrResults") + private List> attrValues; + + private Integer[] cateIds; + + @ApiModelProperty(value = "商品描述") + private String content; + + @ApiModelProperty(value = "秒杀配置") + private StoreSeckillManagerResponse storeSeckillManagerResponse; + + @ApiModelProperty(value = "规格 0单 1多") + private boolean specType; + + @ApiModelProperty(value = "时间戳") + private String timeSwap; + + @ApiModelProperty(value = "已抢百分比") + private Integer percent; + + @ApiModelProperty(value = "当前正在秒杀的timeId") + private Integer currentTimeId; + + @ApiModelProperty(value = "当前参与的秒杀的时间段") + private String currentTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffDetail.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffDetail.java new file mode 100644 index 0000000..67a5460 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffDetail.java @@ -0,0 +1,16 @@ +package com.yzt.common.response; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 核销月详情Response + * + */ +@Data +public class StoreStaffDetail { + private Integer count; + private BigDecimal price; + private String time; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffTopDetail.java b/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffTopDetail.java new file mode 100644 index 0000000..d391feb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/StoreStaffTopDetail.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 核销订单top数据对象 + * + */ +@Data +public class StoreStaffTopDetail { + private Integer completeCount; // 订单完成订单数量 + private Integer evaluatedCount;// 待评价订单数量 + private Integer monthCount; + private BigDecimal monthPrice; + private Integer orderCount; + private Integer proCount; + private BigDecimal proPrice; + private Integer receivedCount; + private Integer refundCount; + private BigDecimal sumPrice; + private Integer todayCount; + private BigDecimal todayPrice; + private Integer unpaidCount; + private Integer unshippedCount; + private Integer verificationCount;// 待核销数量 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemAdminResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemAdminResponse.java new file mode 100644 index 0000000..6fde916 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemAdminResponse.java @@ -0,0 +1,54 @@ +package com.yzt.common.response; + + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 系统管理员Response对象 + * + */ +@Data +public class SystemAdminResponse implements Serializable { + + private Integer id; + + private String account; + +// private String pwd; + + private String realName; + + private String roles; + + private String roleNames; + + private String lastIp; + + private Date lastTime; + + private Integer addTime; + + private Integer loginCount; + + private Integer level; + + private Boolean status; + +// private Boolean isDel; + + private String Token; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; + + @ApiModelProperty(value = "权限标识数组") + private List permissionsList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataAdminLoginBannerResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataAdminLoginBannerResponse.java new file mode 100644 index 0000000..e28b13b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataAdminLoginBannerResponse.java @@ -0,0 +1,26 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 门店店员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemGroupDataAdminLoginBannerResponse对象", description="后台登录页面轮播图") +public class SystemGroupDataAdminLoginBannerResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "图片") + private String pic; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataOrderStatusPicResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataOrderStatusPicResponse.java new file mode 100644 index 0000000..12a3b49 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemGroupDataOrderStatusPicResponse.java @@ -0,0 +1,29 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 订单状态图片 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemGroupDataOrderStatusPicResponse对象", description="订单状态图片") +public class SystemGroupDataOrderStatusPicResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单状态") + private int orderStatus; + + @ApiModelProperty(value = "图片地址") + private String url; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemLoginResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemLoginResponse.java new file mode 100644 index 0000000..d2a8d59 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemLoginResponse.java @@ -0,0 +1,36 @@ +package com.yzt.common.response; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * PC登录返回对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemLoginResponse对象", description="PC登录返回对象") +public class SystemLoginResponse implements Serializable { + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "管理员账号") + private String account; + + @ApiModelProperty(value = "管理员昵称") + private String realName; + + @ApiModelProperty(value = "token") + private String Token; + + @ApiModelProperty(value = "是否接收短信") + private Boolean isSms; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemStoreStaffResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemStoreStaffResponse.java new file mode 100644 index 0000000..6641010 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemStoreStaffResponse.java @@ -0,0 +1,65 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.model.user.User; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门店店员表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store_staff") +@ApiModel(value="SystemStoreStaffResponse对象", description="门店店员表") +public class SystemStoreStaffResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "微信用户id") + private Integer uid; + + @ApiModelProperty(value = "店员头像") + private String avatar; + + @ApiModelProperty(value = "用户信息") + private User user; + + @ApiModelProperty(value = "门店id") + private Integer storeId; + + @ApiModelProperty(value = "门店") + private SystemStore systemStore; + + @ApiModelProperty(value = "店员名称") + private String staffName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "核销开关") + private Integer verifyStatus; + + @ApiModelProperty(value = "状态") + private Integer status; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/SystemWriteOffOrderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/SystemWriteOffOrderResponse.java new file mode 100644 index 0000000..b88171e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/SystemWriteOffOrderResponse.java @@ -0,0 +1,39 @@ +package com.yzt.common.response; + +import com.yzt.common.page.CommonPage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 订单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemWriteOffOrderResponse对象", description="核销订单") +public class SystemWriteOffOrderResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单总数量") + private Long total = 0L; + + @ApiModelProperty(value = "订单总金额") + private BigDecimal orderTotalPrice; + + @ApiModelProperty(value = "退款总金额") + private BigDecimal refundTotalPrice; + + @ApiModelProperty(value = "退款总单数") + private Integer refundTotal = 0; + + @ApiModelProperty(value = "订单列表") + private CommonPage list; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/TopDetail.java b/fightwine-common/src/main/java/com/yzt/common/response/TopDetail.java new file mode 100644 index 0000000..ffbcc6e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/TopDetail.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import com.yzt.common.model.user.User; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 会员详情顶部信息 + * + */ +@Data +public class TopDetail { + + private User user; + // 余额 + private BigDecimal balance; + // 积分 + private java.math.BigDecimal integralCount; + // 总计订单 + private Integer allOrderCount; + // 本月订单 + private Integer mothOrderCount; + // 总消费金额 + private BigDecimal allConsumeCount; + // 本月消费金额 + private BigDecimal mothConsumeCount; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserBalanceResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserBalanceResponse.java new file mode 100644 index 0000000..aff0f4c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserBalanceResponse.java @@ -0,0 +1,40 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户资金统计 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserBalanceResponse对象", description="用户资金统计") +public class UserBalanceResponse implements Serializable { + public UserBalanceResponse(){} + public UserBalanceResponse(BigDecimal nowMoney, BigDecimal recharge, BigDecimal orderStatusSum) { + this.nowMoney = nowMoney; + this.recharge = recharge; + this.orderStatusSum = orderStatusSum; + } + + private static final long serialVersionUID=1L; + + + @ApiModelProperty(value = "当前总资金") + private BigDecimal nowMoney; + + @ApiModelProperty(value = "累计充值") + private BigDecimal recharge; + + @ApiModelProperty(value = "累计消费") + private BigDecimal orderStatusSum; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserBillResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserBillResponse.java new file mode 100644 index 0000000..fbc898f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserBillResponse.java @@ -0,0 +1,86 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户账单表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_bill") +@ApiModel(value="UserBill对象", description="用户账单表") +public class UserBillResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户账单id") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id") + private String linkId; + + @ApiModelProperty(value = "关联类型") + private String linkType; + + @ApiModelProperty(value = "0 = 支出 1 = 获得") + private int pm; + + @ApiModelProperty(value = "账单标题") + private String title; + + @ApiModelProperty(value = "明细种类") + private String category; + + @ApiModelProperty(value = "明细类型") + private String type; + + @ApiModelProperty(value = "明细数字") + private BigDecimal number; + + @ApiModelProperty(value = "剩余") + private BigDecimal balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "0 = 带确定 1 = 有效 -1 = 无效") + private int status; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @JsonProperty(value = "createTime") + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "用户等级") + private Integer level; + + @ApiModelProperty(value = "归属公司(租户ID)") + private Long tenantId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserBrokerageRecordResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserBrokerageRecordResponse.java new file mode 100644 index 0000000..4232e11 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserBrokerageRecordResponse.java @@ -0,0 +1,48 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/26 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserBrokerageRecordResponse对象", description="用户佣金记录对象") +public class UserBrokerageRecordResponse { + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID:奖励的唯一标识编号", example = "1001") + private Integer id; + + @ApiModelProperty(value = "生成时间:奖励的生成日期", example = "2025-11-26T10:30:00") + private Date createTime; + + @ApiModelProperty(value = "奖励类型:如'免单奖、销售奖、孵化奖、管理奖、补贴'", example = "销售奖") + private String title; + + @ApiModelProperty(value = "客户名称:关联客户的姓名", example = "张三") + private String customerName; + + @ApiModelProperty(value = "手机号码:关联客户的手机号", example = "13800138000") + private String phone; + + @ApiModelProperty(value = "销售金额", example = "299.00") + private BigDecimal salesAmount; + + @ApiModelProperty(value = "收益:奖励对应的收益金额", example = "29.90") + private BigDecimal brokerage; // 或 income / rewardAmount,但 brokerage 更贴合你的表 + + @ApiModelProperty(value = "状态:奖励当前状态(1-待结算, 2-已结算, 3-已取消等)", example = "2") + private Integer status; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserCenterResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserCenterResponse.java new file mode 100644 index 0000000..f702271 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserCenterResponse.java @@ -0,0 +1,108 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 个人中心响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserCenterResponse对象", description="个人中心响应对象") +public class UserCenterResponse implements Serializable { + + private static final long serialVersionUID=1L; + +// @ApiModelProperty(value = "合伙人id") +// private Integer partnerId; + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "用户余额") + private BigDecimal nowMoney; + + @ApiModelProperty(value = "用户剩余积分") + private java.math.BigDecimal integral; + + @ApiModelProperty(value = "用户剩余经验") + private Integer experience; + + @ApiModelProperty(value = "佣金金额") + private BigDecimal brokeragePrice; + +// @ApiModelProperty(value = "连续签到天数") +// private Integer signNum; + + @ApiModelProperty(value = "等级") + private Integer level; + + @ApiModelProperty(value = "等级") + private String levelName; + + @ApiModelProperty(value = "推广元id") + private Integer spreadUid; + + @ApiModelProperty(value = "推广人名称") + private String spreadName; + + @ApiModelProperty(value = "推广人等级") + private Integer spreadLevel; + + @ApiModelProperty(value = "推广人等级") + private String spreadLevelName; + + @ApiModelProperty(value = "是否为推广员") + private Boolean isPromoter; + + @ApiModelProperty(value = "用户优惠券数量") + private Integer couponCount; + + @ApiModelProperty(value = "是否会员") + private boolean vip; + + @ApiModelProperty(value = "会员图标") + private String vipIcon; + + @ApiModelProperty(value = "会员名称") + private String vipName; + + @ApiModelProperty(value = "小程序充值开关") + private Boolean rechargeSwitch; + + @ApiModelProperty(value = "用户收藏数量") + private Integer collectCount; + + @ApiModelProperty(value = "公司名称") + private String tenantName; + + @ApiModelProperty(value = "机构名称") + private String orgName; + + @ApiModelProperty(value = "是否可以更改上级经销商") + private Boolean canChange; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "性别") + private int sex; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserChannelDataResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserChannelDataResponse.java new file mode 100644 index 0000000..087ef71 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserChannelDataResponse.java @@ -0,0 +1,28 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户渠道数据对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserChannelDataResponse对象", description="用户渠道数据对象") +public class UserChannelDataResponse implements Serializable { + + private static final long serialVersionUID = -6004724917253583732L; + + @ApiModelProperty(value = "性别,h5,ios,routine,wechat") + private String channel; + + @ApiModelProperty(value = "数量") + private Integer num; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserCommissionResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserCommissionResponse.java new file mode 100644 index 0000000..de193f3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserCommissionResponse.java @@ -0,0 +1,41 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 推广佣金明细 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserCommissionResponse对象", description="推广佣金明细") +public class UserCommissionResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "昨天的佣金") + private BigDecimal lastDayCount = BigDecimal.ZERO; + + @ApiModelProperty(value = "累计提现金额") + private BigDecimal extractCount = BigDecimal.ZERO; + + @ApiModelProperty(value = "当前佣金") + private BigDecimal commissionCount = BigDecimal.ZERO; + + @ApiModelProperty(value = "总收益") + private BigDecimal totalIncomes = BigDecimal.ZERO; + + @ApiModelProperty(value = "今天收益") + private BigDecimal todayIncomes = BigDecimal.ZERO; + + @ApiModelProperty(value = "待结算收益") + private BigDecimal pendingIncomes = BigDecimal.ZERO; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserExtractCashResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractCashResponse.java new file mode 100644 index 0000000..de11a1b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractCashResponse.java @@ -0,0 +1,45 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 提现用户信息响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserExtractCashResponse对象", description="提现用户信息响应对象") +public class UserExtractCashResponse implements Serializable { + public UserExtractCashResponse(){} + public UserExtractCashResponse(String minPrice, BigDecimal commissionCount, BigDecimal brokenCommission, String brokenDay) { + this.minPrice = minPrice; + this.commissionCount = commissionCount; + this.brokenCommission = brokenCommission; + this.brokenDay = brokenDay; + } + + private static final long serialVersionUID=1L; + +// @ApiModelProperty(value = "提现银行") +// private List extractBank; + + @ApiModelProperty(value = "提现最低金额") + private String minPrice; + + @ApiModelProperty(value = "可提现佣金") + private BigDecimal commissionCount; + + @ApiModelProperty(value = "冻结佣金") + private BigDecimal brokenCommission; + + @ApiModelProperty(value = "冻结天数") + private String brokenDay; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserExtractDetailResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractDetailResponse.java new file mode 100644 index 0000000..d1b20d9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractDetailResponse.java @@ -0,0 +1,83 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 提现申请详情响应对象 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "UserExtractDetailResponse对象", description = "提现申请详情响应对象") +public class UserExtractDetailResponse implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "提现申请记录id") + private Integer id; + + // 用户信息 + @ApiModelProperty(value = "归属公司名称") + private String tenantName; + + @ApiModelProperty(value = "客户名称(昵称)") + private String customerName; + + @ApiModelProperty(value = "客户等级") + private Integer customerLevel; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "上级名称") + private String parentName; + + @ApiModelProperty(value = "上级等级") + private Integer parentLevel; + + // 提现信息 + @ApiModelProperty(value = "申请日期") + private Date applyDate; + + @ApiModelProperty(value = "提现金额") + private BigDecimal extractAmount; + + @ApiModelProperty(value = "到账金额") + private BigDecimal actualAmount; + + @ApiModelProperty(value = "手续费(会旅积分)") + private BigDecimal feeIntegral; + + @ApiModelProperty(value = "收款人姓名") + private String payeeName; + + @ApiModelProperty(value = "收款银行名称") + private String payBankName; + + @ApiModelProperty(value = "收款银行卡号") + private String payAccount; + + // 审核信息 + @ApiModelProperty(value = "审核人姓名") + private String auditAdminName; + + @ApiModelProperty(value = "审核日期") + private Date auditDate; + + @ApiModelProperty(value = "审核状态 -1 未通过 0 审核中 1 已提现") + private Integer auditStatus; + + @ApiModelProperty(value = "转账凭证地址") + private String transferVoucherUrl; + + @ApiModelProperty(value = "审核备注") + private String auditRemark; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserExtractRecordResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractRecordResponse.java new file mode 100644 index 0000000..a8cdf19 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractRecordResponse.java @@ -0,0 +1,35 @@ +package com.yzt.common.response; + +import com.yzt.common.model.finance.UserExtract; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 提现记录响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserExtractRecordResponse对象", description="用户提现记录对象") +public class UserExtractRecordResponse { + + private static final long serialVersionUID=1L; + + public UserExtractRecordResponse() {} + public UserExtractRecordResponse(String date, List list) { + this.date = date; + this.list = list; + } + + @ApiModelProperty(value = "月份") + private String date; + + @ApiModelProperty(value = "数据") + private List list; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserExtractResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractResponse.java new file mode 100644 index 0000000..80e50c2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserExtractResponse.java @@ -0,0 +1,22 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 提现数据用于分销 + * fw_ + */ +@Data +public class UserExtractResponse { + // 提现数据总额 + @ApiModelProperty(value = "体现数据总额") + private BigDecimal extractCountPrice; + // 提现次数 + @ApiModelProperty(value = "提现次数") + private Integer extractCountNum; + // 提现用户id +// private Integer euid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserIntegralRecordResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserIntegralRecordResponse.java new file mode 100644 index 0000000..ca65ad9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserIntegralRecordResponse.java @@ -0,0 +1,74 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户积分记录响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserIntegralRecordResponse对象", description="用户积分记录响应对象") +public class UserIntegralRecordResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "记录id") + private Integer id; + + @ApiModelProperty(value = "用户uid") + private Integer uid; + + @ApiModelProperty(value = "关联id-orderNo,(sign,system默认为0)") + private String linkId; + + @ApiModelProperty(value = "关联类型:brokerage_release-奖励收益手续费转积分,extract-提现手续费转积分,transfer_in-他人转入,transfer_out-转出,activity_deduction-购买活动商品") + private String linkType; + + @ApiModelProperty(value = "类型:1-增加,2-扣减") + private Integer type; + + @ApiModelProperty(value = "标题") + private String title; + + @ApiModelProperty(value = "积分") + private java.math.BigDecimal integral; + + @ApiModelProperty(value = "剩余") + private Integer balance; + + @ApiModelProperty(value = "备注") + private String mark; + + @ApiModelProperty(value = "状态:1-订单创建,2-冻结期,3-完成,4-失效(订单退款)") + private Integer status; + + @ApiModelProperty(value = "冻结期时间(天)") + private Integer frozenTime; + + @ApiModelProperty(value = "解冻时间") + private Long thawTime; + + @ApiModelProperty(value = "添加时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "用户昵称") + private String nickName; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "归属公司名称") + private String tenantName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserLevelUpgradeAuditResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserLevelUpgradeAuditResponse.java new file mode 100644 index 0000000..eb70b69 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserLevelUpgradeAuditResponse.java @@ -0,0 +1,73 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/11/28 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(description = "用户晋升审核记录") +public class UserLevelUpgradeAuditResponse { + @ApiModelProperty("主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户ID") + private Integer uid; + + @ApiModelProperty("客户名称") + private String userName; + + @ApiModelProperty("手机号(用于搜索)") + private String phone; + + @ApiModelProperty("当前身份等级,如:2") + private String currentLevel; + + @ApiModelProperty("当前身份等级,如:拼团会员") + private String currentLevelName; + + @ApiModelProperty("申请晋升身份,如:2") + private String targetLevel; + + @ApiModelProperty("申请晋升身份,如:加盟店") + private String targetLevelName; + + @ApiModelProperty("申请描述,如:购买了指定商品") + private String description; + + @ApiModelProperty("营业执照URL,用于证明具备酒类销售资质") + private String businessLicenseUrl; + + @ApiModelProperty("1=待审核 2=通过 3=拒绝") + private Integer status; + + @ApiModelProperty("审核备注(拒绝时必填)") + private String auditRemark; + + @ApiModelProperty("审核人ID(后台管理员)") + private Long auditorId; + + @ApiModelProperty("申请时间") + @TableField(fill = FieldFill.INSERT) + private Date applyTime; + + @ApiModelProperty("审核时间") + private Date auditTime; + + @ApiModelProperty("租户名称") + private String tenantName; + + @ApiModelProperty("记录来源:1=自动生成,2=后台手动添加") + private Integer sourceType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewDateResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewDateResponse.java new file mode 100644 index 0000000..c48b9a3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewDateResponse.java @@ -0,0 +1,51 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户概览日数据对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserOverviewDateResponse对象", description="用户概览日数据对象") +public class UserOverviewDateResponse implements Serializable { + + private static final long serialVersionUID = -6332062115310922579L; + + @ApiModelProperty(value = "日期") + private String date; + + @ApiModelProperty(value = "注册用户数") + private Integer registerNum; + + @ApiModelProperty(value = "活跃用户数") + private Integer activeUserNum; + + @ApiModelProperty(value = "充值用户数") + private Integer rechargeUserNum; + + @ApiModelProperty(value = "浏览量") + private Integer pageviews; + + @ApiModelProperty(value = "下单用户数量") + private Integer orderUserNum; + + @ApiModelProperty(value = "成交用户数量") + private Integer orderPayUserNum; + + @ApiModelProperty(value = "成交金额") + private BigDecimal payOrderAmount; + + @ApiModelProperty(value = "客单价") + private BigDecimal customerPrice; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewResponse.java new file mode 100644 index 0000000..54fc5f0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserOverviewResponse.java @@ -0,0 +1,57 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 用户概览数据对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserOverviewResponse对象", description="用户概览数据对象") +public class UserOverviewResponse implements Serializable { + + private static final long serialVersionUID = -6332062115310922579L; + + @ApiModelProperty(value = "注册用户数") + private Integer registerNum; + + @ApiModelProperty(value = "注册用户数环比") + private String registerNumRatio; + + @ApiModelProperty(value = "活跃用户数") + private Integer activeUserNum; + + @ApiModelProperty(value = "活跃用户数环比") + private String activeUserNumRatio; + + @ApiModelProperty(value = "充值用户数") + private Integer rechargeUserNum; + + @ApiModelProperty(value = "充值用户数环比") + private String rechargeUserNumRatio; + + @ApiModelProperty(value = "浏览量") + private Integer pageviews; + + @ApiModelProperty(value = "下单用户数量") + private Integer orderUserNum; + + @ApiModelProperty(value = "成交用户数量") + private Integer orderPayUserNum; + + @ApiModelProperty(value = "成交金额") + private BigDecimal payOrderAmount; + + @ApiModelProperty(value = "客单价") + private BigDecimal customerPrice; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeApplicationResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeApplicationResponse.java new file mode 100644 index 0000000..693f7ce --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeApplicationResponse.java @@ -0,0 +1,64 @@ +package com.yzt.common.response; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @Author: pengsz + * @Date: 2025/12/01 + * @Description: + */ + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeApplicationResponse对象", description="充值申请响应对象") +public class UserRechargeApplicationResponse { + + @ApiModelProperty("主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("用户ID") + private Integer uid; + + @ApiModelProperty("充值金额(人民币,单位:元)") + private BigDecimal amount; + + @ApiModelProperty("付款凭证图片URL") + private String paymentProofUrl; + + @ApiModelProperty("状态:0-待处理,1-已审核,2-已拒绝") + private Integer status; + + @ApiModelProperty("审核时间") + private Date reviewedTime; + + @ApiModelProperty("审核时间") + private String reviewerName; + + @ApiModelProperty("备注") + private String remark; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "客户姓名") + private String name; + + @ApiModelProperty(value = "创建时间") + private Date createdTime; + + @ApiModelProperty("租户名称") + private String tenantName; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeBillRecordResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeBillRecordResponse.java new file mode 100644 index 0000000..9f0a99b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeBillRecordResponse.java @@ -0,0 +1,30 @@ +package com.yzt.common.response; + +import com.yzt.common.model.user.UserBill; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 用户余额账单记录 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeBillRecordResponse对象", description="用户余额账单记录") +public class UserRechargeBillRecordResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "月份") + private String date; + + @ApiModelProperty(value = "数据") + private List list; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeFrontResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeFrontResponse.java new file mode 100644 index 0000000..81e33d6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeFrontResponse.java @@ -0,0 +1,29 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 充值响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeFrontResponse对象", description="充值响应对象") +public class UserRechargeFrontResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "充值套餐列表") + private List rechargeQuota; + + @ApiModelProperty(value = "注意事项") + private List rechargeAttention; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeItemResponse.java new file mode 100644 index 0000000..a10a4a5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeItemResponse.java @@ -0,0 +1,32 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 充值套餐响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRechargeItemResponse对象", description="充值套餐响应对象") +public class UserRechargeItemResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "充值模板id") + private Integer id; + + @ApiModelProperty(value = "充值金额") + private String price; + + @ApiModelProperty(value = "赠送金额") + private String giveMoney; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeResponse.java new file mode 100644 index 0000000..dea76ce --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRechargeResponse.java @@ -0,0 +1,51 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户充值 response + * fw_ + */ +@Data +public class UserRechargeResponse { + + @ApiModelProperty(value = "充值记录ID") + private Integer id; + + @ApiModelProperty(value = "充值用户UID") + private Integer uid; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "充值金额") + private BigDecimal price; + + @ApiModelProperty(value = "购买赠送金额") + private BigDecimal givePrice; + + @ApiModelProperty(value = "充值类型") + private String rechargeType; + + @ApiModelProperty(value = "是否充值") + private Boolean paid; + + @ApiModelProperty(value = "充值支付时间") + private Date payTime; + + @ApiModelProperty(value = "充值时间") + private Date createTime; + + @ApiModelProperty(value = "退款金额") + private BigDecimal refundPrice; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "昵称") + private String nickname; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserRelationResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserRelationResponse.java new file mode 100644 index 0000000..262dcb1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserRelationResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户收藏响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRelationResponse对象", description="用户收藏响应对象") +public class UserRelationResponse implements Serializable { + + private static final long serialVersionUID = -7274202699019791930L; + + @ApiModelProperty(value = "收藏id") + private Integer id; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "商品名称") + private String storeName; + + @ApiModelProperty(value = "商品图片") + private String image; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserResponse.java new file mode 100644 index 0000000..e22e850 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserResponse.java @@ -0,0 +1,153 @@ +package com.yzt.common.response; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户响应体 + * + */ +@Data +public class UserResponse { + + @ApiModelProperty(value = "用户id") + private Integer uid; + + @ApiModelProperty(value = "用户账号") + @JsonIgnore + private String account; + + @ApiModelProperty(value = "用户密码") + @JsonIgnore + private String pwd; + + @ApiModelProperty(value = "真实姓名") + private String realName; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "身份证号码") + private String cardId; + + @ApiModelProperty(value = "用户备注") + private String mark; + + @ApiModelProperty(value = "合伙人id") + private Integer partnerId; + + @ApiModelProperty(value = "用户分组id") + private String groupId; + + @ApiModelProperty(value = "分组名称") + private String groupName; + + @ApiModelProperty(value = "标签名称") + private String tagName; + + @ApiModelProperty(value = "标签Ids") + private String tagId; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "性别") + private int sex; + + @ApiModelProperty(value = "国家") + private String country; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "添加ip") + private String addIp; + + @ApiModelProperty(value = "最后一次登录ip") + private String lastIp; + + @ApiModelProperty(value = "用户余额") + private BigDecimal nowMoney; + + @ApiModelProperty(value = "佣金金额") + private BigDecimal brokeragePrice; + + @ApiModelProperty(value = "用户剩余积分") + private java.math.BigDecimal integral; + + @ApiModelProperty(value = "用户剩余经验") + private Integer experience; + + @ApiModelProperty(value = "连续签到天数") + private Integer signNum; + + @ApiModelProperty(value = "1为正常,0为禁止") + private Boolean status; + + @ApiModelProperty(value = "等级") + private Integer level; + + @ApiModelProperty(value = "推广人id") + private Integer spreadUid; + + @ApiModelProperty(value = "推广员关联时间") + private Date spreadTime; + + @ApiModelProperty(value = "推广员名称") + private String spreadNickname; + + @ApiModelProperty(value = "用户类型") + private String userType; + + @ApiModelProperty(value = "是否为推广员") + private Boolean isPromoter; + + @ApiModelProperty(value = "用户购买次数") + private Integer payCount; + + @ApiModelProperty(value = "下级人数") + private Integer spreadCount; + + @ApiModelProperty(value = "详细地址") + private String addres; + + @ApiModelProperty(value = "管理员编号 ") + private Integer adminid; + + @ApiModelProperty(value = "用户登陆类型,h5,wechat,routine") + private String loginType; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "最后一次登录时间") + private Date lastLoginTime; + + @ApiModelProperty(value = "清除时间") + private Date cleanTime; + + @ApiModelProperty(value = "是否关注公众号") + private Boolean subscribe; + + @ApiModelProperty(value = "公司名称") + private String tenantName; + + @ApiModelProperty(value = "累计收益") + private BigDecimal totalIncomes; + + @ApiModelProperty(value = "累计下单金额") + private BigDecimal TotalPaidAmount; + + @ApiModelProperty(value = "累计销售金额") + private BigDecimal totalSalesAmount; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSignInfoResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSignInfoResponse.java new file mode 100644 index 0000000..2ef6d7c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSignInfoResponse.java @@ -0,0 +1,38 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户签到信息响应对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSignInfoResponse对象", description="用户签到信息响应对象") +public class UserSignInfoResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "连续签到天数") + private Integer signNum; + + @ApiModelProperty(value = "累计签到次数") + private Integer sumSignDay; + + @ApiModelProperty(value = "今天是否签到") + private Boolean isDaySign; + + @ApiModelProperty(value = "昨天是否签到") + private Boolean isYesterdaySign; + + @ApiModelProperty(value = "用户积分") + private java.math.BigDecimal integral; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadBannerResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadBannerResponse.java new file mode 100644 index 0000000..99e745a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadBannerResponse.java @@ -0,0 +1,32 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户地址表 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadBannerResponse对象", description="用户推广海报") +public class UserSpreadBannerResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "名称") + private String title; + + @ApiModelProperty(value = "背景图") + private String pic; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemChildResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemChildResponse.java new file mode 100644 index 0000000..31c1a0c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemChildResponse.java @@ -0,0 +1,42 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 推广订单信息子集 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadOrderItemChildResponse对象", description="推广订单信息子集") +public class UserSpreadOrderItemChildResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "返佣时间") + private Date time; + + @ApiModelProperty(value = "返佣金额") + private BigDecimal number; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "订单显示类型") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemResponse.java new file mode 100644 index 0000000..f875d5b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderItemResponse.java @@ -0,0 +1,33 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 推广订单信息 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadOrderItemResponse对象", description="推广订单信息") +public class UserSpreadOrderItemResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "推广条数") + private Integer count = 0; + + @ApiModelProperty(value = "推广年月") + private String time; + + @ApiModelProperty(value = "推广订单信息") + private List child = new ArrayList<>(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderResponse.java new file mode 100644 index 0000000..8733b4d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadOrderResponse.java @@ -0,0 +1,29 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 推广订单 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadOrderResponse对象", description="推广订单") +public class UserSpreadOrderResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "累计推广订单") + private Long count = 0L; + + @ApiModelProperty(value = "推广人列表") + private List list; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleItemResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleItemResponse.java new file mode 100644 index 0000000..962240d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleItemResponse.java @@ -0,0 +1,67 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 推广人信息 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadPeopleItemResponse对象", description="推广人信息") +public class UserSpreadPeopleItemResponse implements Serializable { + + private static final long serialVersionUID=1L; + + + @ApiModelProperty(value = "用户编号") + private Integer uid; + + @ApiModelProperty(value = "用户昵称") + private String nickname; + + @ApiModelProperty(value = "用户头像") + private String avatar; + + @ApiModelProperty(value = "添加时间") + private String time; + + + @ApiModelProperty(value = "注册时间") + private String createTime; + + @ApiModelProperty(value = "推广人数") + private Integer childCount; + + @ApiModelProperty(value = "订单数量") + private Integer orderCount; + + @ApiModelProperty(value = "订单金额") + private BigDecimal numberCount; + + @ApiModelProperty(value = "手机号") + private String phone; + + @ApiModelProperty(value = "等级") + private Integer level; + + @ApiModelProperty(value = "等级名称") + private String levelName; + + @ApiModelProperty(value = "今日收益") + private BigDecimal todayIncomes; + + @ApiModelProperty(value = "总收益") + private BigDecimal TotalIncomes; + + @ApiModelProperty(value = "下级累计销售额") + private BigDecimal TotalSalesAmount; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleResponse.java new file mode 100644 index 0000000..4ff0816 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/UserSpreadPeopleResponse.java @@ -0,0 +1,35 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 推广用户 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSpreadPeopleResponse对象", description="推广用户") +public class UserSpreadPeopleResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "一级推广人人数") + private Integer total = 0; + + @ApiModelProperty(value = "二级推广人人数") + private Integer totalLevel = 0; + + @ApiModelProperty(value = "推广人列表") + private List spreadPeopleList; + + @ApiModelProperty(value = "推广人总人数") + private Integer count = 0; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/WeChatJsSdkConfigResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/WeChatJsSdkConfigResponse.java new file mode 100644 index 0000000..e527599 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/WeChatJsSdkConfigResponse.java @@ -0,0 +1,47 @@ +package com.yzt.common.response; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 微信公众号js-sdk响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WeChatJsSdkConfigResponse对象", description="微信公众号js-sdk响应对象对象") +public class WeChatJsSdkConfigResponse implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "url") + private String url; + + @ApiModelProperty(value = "jsApiTicket") + private String jsApiTicket; + + @ApiModelProperty(value = "nonceStr") + private String nonceStr; + + @ApiModelProperty(value = "timestamp") + private Long timestamp; + + @ApiModelProperty(value = "signature") + private String signature; + + @ApiModelProperty(value = "jsApiList") + private List jsApiList; + + @ApiModelProperty(value = "debug") + private Boolean debug; + + @ApiModelProperty(value = "appid") + private String appId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenBodyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenBodyResponse.java new file mode 100644 index 0000000..14b7b40 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenBodyResponse.java @@ -0,0 +1,16 @@ +package com.yzt.common.response; + +import lombok.Data; + +/** + * 易联云 获取AccessToken response body 数据 + * + **/ +@Data +public class YlyAccessTokenBodyResponse { + private String access_token; + private String refresh_token; + private String machine_code; + private Integer expires_in; + private String scope; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenResponse.java new file mode 100644 index 0000000..0c319a8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/YlyAccessTokenResponse.java @@ -0,0 +1,13 @@ +package com.yzt.common.response; + +import lombok.Data; + +/** 易联云 获取AccessToken response + * + **/ +@Data +public class YlyAccessTokenResponse { + private String error; + private String error_description; + private YlyAccessTokenBodyResponse body; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/page/PageDiyResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/page/PageDiyResponse.java new file mode 100644 index 0000000..9d079bd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/page/PageDiyResponse.java @@ -0,0 +1,106 @@ +package com.yzt.common.response.page; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * DIY数据表 + *

+ * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PageDiy Response 对象", description="DIY数据表") +public class PageDiyResponse implements Serializable { + + private static final long serialVersionUID=1L; + +// @TableId(value = "id", type = IdType.AUTO) +// private Integer id; + + @ApiModelProperty(value = "版本号") + private String version; + + @ApiModelProperty(value = "页面名称") + private String name; + + @ApiModelProperty(value = "网站标题") + private String title; + + @ApiModelProperty(value = "封面图") + private String coverImage; + + @ApiModelProperty(value = "模板名称") + private String templateName; + + @ApiModelProperty(value = "页面数据") + private JSONObject value; + + @ApiModelProperty(value = "默认数据") + private String defaultValue; + + @ApiModelProperty(value = "添加时间") + private Date addTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + @ApiModelProperty(value = "是否使用") + private Integer status; + + @ApiModelProperty(value = "页面类型") + private Integer type; + + @ApiModelProperty(value = "显示首页") + private Integer isShow; + + @ApiModelProperty(value = "颜色是否选中") + private Integer isBgColor; + + @ApiModelProperty(value = "背景图是否选中") + private Integer isBgPic; + + @ApiModelProperty(value = "是否是diy数据") + private Integer isDiy; + + @ApiModelProperty(value = "背景颜色") + private String colorPicker; + + @ApiModelProperty(value = "背景图") + private String bgPic; + + @ApiModelProperty(value = "背景图图片样式") + private Integer bgTabVal; + + @ApiModelProperty(value = "是否删除") + private Integer isDel; + + @ApiModelProperty(value = "返回地址") + private String returnAddress; + + @ApiModelProperty(value = "标题背景色") + private String titleBgColor; + + @ApiModelProperty(value = "标题颜色") + private String titleColor; + + @ApiModelProperty(value = "商家样式") + private Integer serviceStatus; + + @ApiModelProperty(value = "商户ID") + private Integer merId; + + @ApiModelProperty(value = "默认模板(1.平台默认 2.商户默认)") + private Integer isDefault; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/response/pagelayout/PageLayoutBottomNavigationResponse.java b/fightwine-common/src/main/java/com/yzt/common/response/pagelayout/PageLayoutBottomNavigationResponse.java new file mode 100644 index 0000000..13ace1c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/response/pagelayout/PageLayoutBottomNavigationResponse.java @@ -0,0 +1,32 @@ +package com.yzt.common.response.pagelayout; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; + +/** + * 页面设计底部导航响应对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "PageLayoutBottomNavigationResponse对象", description = "页面设计底部导航响应对象") +public class PageLayoutBottomNavigationResponse implements Serializable { + + private static final long serialVersionUID = 8350218800271787826L; + + @ApiModelProperty(value = "底部导航") + private List> bottomNavigationList; + + @ApiModelProperty(value = "是否自定义") + private String isCustom; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/AdminResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/AdminResultCode.java new file mode 100644 index 0000000..b3baf9b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/AdminResultCode.java @@ -0,0 +1,71 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 管理员模块响应状态码 + * + */ +public enum AdminResultCode implements BusinessExceptionAssert { + + ADMIN_EXIST(3001, "管理员已存在"), + ADMIN_NOT_EXIST(3002, "管理员不存在"), + ; + + AdminResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public AdminResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public AdminResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/CommonResult.java b/fightwine-common/src/main/java/com/yzt/common/result/CommonResult.java new file mode 100644 index 0000000..2651e21 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/CommonResult.java @@ -0,0 +1,167 @@ +package com.yzt.common.result; + + +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.MyRecord; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 公共返回对象 + * + */ +public class CommonResult implements Serializable { + + private static final long serialVersionUID = -6630747483482976634L; + + /** + * 响应码 + */ + private Integer code; + /** + * 响应消息 + */ + private String message; + /** + * 响应体 + */ + private T data; + + // ===========构造器开始,构造器私有,外部不可直接创建========================================= + + private CommonResult() { + this.code = 200; + } + + private CommonResult(T data) { + this.code = 200; + this.data = data; + } + + private CommonResult(Integer code, String message) { + this.code = code; + this.message = message; + } + + private CommonResult(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + private CommonResult(IResultEnum iResultEnum) { + this.code = iResultEnum.getCode(); + this.message = iResultEnum.getMessage(); + } + + // ===========构造器结束,构造器私有,外部不可直接创建========================================= + + /** + * 成功返回,没有结果 + */ + public static CommonResult success() { + return new CommonResult<>(); + } + + /** + * 成功返回,有返回结果 + * + * @param data 获取的数据 + */ + public static CommonResult success(T data) { + return new CommonResult<>(data); + } + + /** + * 成功返回结果 + * + * @param record 获取的数据 + */ + public static CommonResult> success(MyRecord record) { + return new CommonResult<>(record.getColumns()); + } + + /** + * 成功返回结果 + * + * @param recordList 获取的数据 + */ + public static CommonResult>> success(List recordList) { + List> list = new ArrayList<>(); + recordList.forEach(i -> { + list.add(i.getColumns()); + }); + return new CommonResult<>(list); + } + + /** + * 通用返回失败 + * + * @param iResultEnum 结果枚举 + * @return T + */ + public static CommonResult failed(IResultEnum iResultEnum) { + return new CommonResult<>(iResultEnum); + } + + /** + * 失败返回结果 + * + * @param resultCode 结果枚举 + * @param message 错误信息 + */ + public static CommonResult failed(CommonResultCode resultCode, String message) { + return new CommonResult<>(resultCode.getCode(), message); + } + + /** + * 失败返回结果 + */ + public static CommonResult failed(YztException e) { + return new CommonResult<>(e.getCode(), e.getMessage()); + } + + /** + * 失败返回结果 + */ + public static CommonResult failed() { + return failed(CommonResultCode.ERROR); + } + + /** + * 失败返回结果 + * + * @param message 错误信息 + */ + public static CommonResult failed(String message) { + return new CommonResult<>(CommonResultCode.ERROR.getCode(), message); + } + + public long getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public CommonResult setMessage(String message) { + this.message = message; + return this; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/CommonResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/CommonResultCode.java new file mode 100644 index 0000000..1365d82 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/CommonResultCode.java @@ -0,0 +1,82 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 公共模块响应码枚举 + * + */ +public enum CommonResultCode implements BusinessExceptionAssert { + + /*** 通用部分 100 - 599***/ + // 请求成功 + SUCCESS(200, "请求成功"), + // 重定向 + REDIRECT(301, "redirect"), + VALIDATE_FAILED(400, "参数检验失败"), + UNAUTHORIZED(401, "未登录,请登录!"), + PERMISSION_EXPIRATION(402, "token过期,请登录!"), + FORBIDDEN(403, "无访问权限,请联系管理员授予权限"), + // 资源未找到 + NOT_FOUND(404, "资源未找到"), + // 服务器错误 + ERROR(500, "系统异常,请稍后重试"), + ; + + CommonResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public CommonResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public CommonResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/CommunityResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/CommunityResultCode.java new file mode 100644 index 0000000..88e7bc5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/CommunityResultCode.java @@ -0,0 +1,87 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 社区模块响应状态码 + * + */ +public enum CommunityResultCode implements BusinessExceptionAssert { + + COMMUNITY_CATEGORY_EXIST(9101, "社区分类已存在"), + COMMUNITY_CATEGORY_NOT_EXIST(9102, "社区分类不存在"), + COMMUNITY_CATEGORY_ID_NULL(9103, "请选择社区分类"), + COMMUNITY_CATEGORY_USING(9104, "社区分类使用中,请先删除关联的社区内容"), + + COMMUNITY_TOPIC_NAME_EXIST(9201, "社区话题已存在"), + COMMUNITY_TOPIC_NOT_EXIST(9202, "社区话题不存在"), + COMMUNITY_TOPIC_ID_NULL(9203, "请选择社区话题"), + COMMUNITY_TOPIC_RECOMMEND_NUM(9204, "社区话题推荐数量达到上限"), + + COMMUNITY_NOTE_NOT_EXIST(9301, "社区笔记不存在"), + COMMUNITY_NOTE_AUDIT_STATUS_EXCEPTION(9302, "社区笔记审核状态异常"), + COMMUNITY_NOTE_AUTHOR_NOTE_EXIST(9303, "社区笔记作者不存在"), + COMMUNITY_NOTE_REPLY_IS_NOT_OPEN(9304, "社区笔记评论未打开"), + + COMMUNITY_REPLY_NOT_EXIST(9401, "社区评论不存在"), + COMMUNITY_REPLY_AUDIT_STATUS_EXCEPTION(9302, "社区评论审核状态异常"), + COMMUNITY_REPLY_PLAT_CLOSE(9304, "社区评论已关闭"), + ; + + CommunityResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public CommunityResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public CommunityResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/CouponResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/CouponResultCode.java new file mode 100644 index 0000000..27808a6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/CouponResultCode.java @@ -0,0 +1,73 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 优惠券模块响应码 + * + */ +public enum CouponResultCode implements BusinessExceptionAssert { + + COUPON_NOT_EXIST(10001, "优惠券不存在"), + COUPON_STATUS_ABNORMAL(10002, "订单状态异常"), + + COUPON_PRODUCT_NOT_EXIST(10101, "优惠券对应商品不存在"), + ; + + CouponResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public CouponResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public CouponResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/IResultEnum.java b/fightwine-common/src/main/java/com/yzt/common/result/IResultEnum.java new file mode 100644 index 0000000..84b9ae8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/IResultEnum.java @@ -0,0 +1,37 @@ +package com.yzt.common.result; + +/** + * 错误码接口 ErrCode + */ +public interface IResultEnum { + + /** + * 响应码规则:各个模块固定4位返回码 + * 1***:登录、注册、认证模块 + * 2***:支付、提现相关 + * 3***:管理员模块 + * 4***: 商户模块 + * 5***: 订单模块 + * 6***: 商品模块 + * 7***: 系统设置模块 + * 8***: 用户模块 + * 9***:社区模块 + * 10***: 优惠券模块 + * 11***: 营销模块 + * 12***: 一号通模块 + * 13***: 微信模块 + * 14***: 会员模块 + */ + + Integer getCode(); + + IResultEnum setCode(Integer code); + + String getMessage(); + + IResultEnum setMessage(String message); + + IResultEnum setMsgParams(Object... msgParams); + + Object[] getMsgParams(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/LoginResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/LoginResultCode.java new file mode 100644 index 0000000..8377694 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/LoginResultCode.java @@ -0,0 +1,85 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 登录、注册、认证模块响应码枚举 + * + */ +public enum LoginResultCode implements BusinessExceptionAssert { + + LOGIN_PASSWORD_ERROR(1001, "登录密码不正确"), + CODE_IS_NOT_EXIST(1002, "code码不存在"), + REQUEST_IS_FAIL(1003, "请求微信失败,请稍后再试"), + USER_IS_NOT_ONLY(1004, "用户唯一标识获取失败"), + USERNAME_NOT_EXIST(1005, "用户名不存在"), + ACCOUNT_IS_DELETE(1006, "账号已被删除"), + ACCOUNT_NOT_ENABLE(1007, "账号已被禁用"), + LOGIN_INFO_IS_EMPTY(1008, "登录信息不能为空"), + LOGIN_USERNAME_IS_EMPTY(1009, "账号不能为空"), + LOGIN_PASSWORD_IS_EMPTY(1010, "密码不能为空"), + LOGIN_CAPTCHA_ERROR(1011, "验证码不正确"), + CANT_GET_NICKNAME(1012, "未获取到您的昵称信息~"), + CANT_GET_AVATAR_URL(1013, "未获取到您的头像信息~"), + OPENID_IS_EMPTY(1014, "openId不能为空"), + USER_NOT_FOUND(1015, "用户不存在"), + LOGIN_EXPIRE(1016, "登录状态已过期"), + ; + + LoginResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public LoginResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public LoginResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/MarketingResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/MarketingResultCode.java new file mode 100644 index 0000000..63a4cbd --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/MarketingResultCode.java @@ -0,0 +1,82 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 营销模块响应码 + * + */ +public enum MarketingResultCode implements BusinessExceptionAssert { + + ARTICLE_CATEGORY_USED(12001, "文章分类已使用"), + ARTICLE_CATEGORY_NOT_EXIST(12002, "文章分类不存在"), + ARTICLE_NOT_EXIST(12003, "文章不存在"), + + SECKILL_TIME_INTERVAL_NOT_EXIST(12101, "秒杀时段不存在"), + SECKILL_TIME_INTERVAL_USED(12102, "秒杀时段已使用"), + SECKILL_ACTIVITY_NOT_EXIST(12103, "秒杀活动不存在"), + SECKILL_ACTIVITY_STATUS_ABNORMAL(12104, "秒杀活动状态异常"), + SECKILL_ACTIVITY_PRODUCT_NOT_EXIST(12105, "秒杀活动商品不存在"), + SECKILL_ACTIVITY_PRODUCT_STATUS_ABNORMAL(12105, "秒杀活动商品状态异常"), + + SECKILL_ACTIVITY_END(12106, "秒杀活动已经结束"), + SECKILL_ACTIVITY_MERCHANT_LEVEL_INSUFFICIENT(12107, "秒杀活动商家等级不足"), + ; + + MarketingResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public MarketingResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public MarketingResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/MemberResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/MemberResultCode.java new file mode 100644 index 0000000..d8e0632 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/MemberResultCode.java @@ -0,0 +1,74 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 会员响应码 + * + */ +public enum MemberResultCode implements BusinessExceptionAssert { + + PAID_MEMBER_CARD_NOT_EXIST(14001, "付费会员卡不存在"), + PAID_MEMBER_CARD_CLOSE(14002, "付费会员卡已关闭"), + PAID_MEMBER_CARD_RESELECT(14003, "请重新选择会员卡"), + PAID_MEMBER_ORDER_NOT_EXIST(14101, "付费会员订单不存在"), + + ; + + MemberResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public MemberResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public MemberResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public MemberResultCode setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/MerchantResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/MerchantResultCode.java new file mode 100644 index 0000000..5ecc063 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/MerchantResultCode.java @@ -0,0 +1,95 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 商户模块响应状态码 + * + */ +public enum MerchantResultCode implements BusinessExceptionAssert { + + MERCHANT_EXIST(4101, "商户已存在"), + MERCHANT_NOT_EXIST(4102, "商户不存在"), + MERCHANT_SWITCH_CLOSE(4103, "商户开关未开启"), + MERCHANT_SWITCH_OPEN(4104, "商户开关已开启"), + MERCHANT_NOT_TAKE_THEIR(4104, "商户未开启自提"), + + MERCHANT_APPLY_NOT_EXIST(4201, "商户申请单不存在"), + + MERCHANT_TYPE_NOT_EXIST(4301, "商户类型不存在"), + MERCHANT_TYPE_USED(4302, "商户类型已使用"), + + MERCHANT_ADDRESS_NOT_EXIST(4401, "商户地址不存在"), + + MERCHANT_CATEGORY_NOT_EXIST(4501, "商户分类不存在"), + MERCHANT_CATEGORY_USED(4502, "商户分类已使用"), + + MERCHANT_CLOSING_RECORD_NOT_EXIST(4601, "商户结算单不存在"), + MERCHANT_CLOSING_RECORD_AUDIT_ED(4602, "商户提现申请已经处理"), + MERCHANT_CLOSING_RECORD_AUDIT_STATUS_ABNORMAL(4603, "商户提现申请审核状态异常"), + + MERCHANT_BALANCE_NOT_ENOUGH(4701, "商户余额不足"), + + MERCHANT_PRINT_NOT_EXIST(4701, "商户打印机不存在"), + + MERCHANT_EXPRESS_NOT_EXIST(4801, "商户物流公司不存在"), + + ; + + MerchantResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public MerchantResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public MerchantResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/OnePassResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/OnePassResultCode.java new file mode 100644 index 0000000..e218cc7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/OnePassResultCode.java @@ -0,0 +1,73 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 优惠券模块响应码 + */ +public enum OnePassResultCode implements BusinessExceptionAssert { + + ACCESS_KEY_NOT_CONFIG(12001, "请配置一号通access_key一号通后台应用管理获得APPID!"), + SECRET_KEY_NOT_CONFIG(12002, "请配置一号通secret_key一号通后台应用管理获得AppSecret"), + + SMS_NOT_OPEN(12101, "短信业务未开通"), + SMS_SHORTAGE_IN_NUMBER(12102, "短信业务数量不足"), + ; + + OnePassResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public OnePassResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public OnePassResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/OrderResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/OrderResultCode.java new file mode 100644 index 0000000..38f124a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/OrderResultCode.java @@ -0,0 +1,91 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 订单响应码 + * + */ +public enum OrderResultCode implements BusinessExceptionAssert { + + ORDER_NOT_EXIST(5001, "订单不存在"), + ORDER_DELETE(5002, "订单已删除"), + ORDER_LEVEL_ABNORMAL(5003, "订单等级异常"), + ORDER_REFUND_ED(5004, "订单已退款"), + ORDER_STATUS_ABNORMAL(5005, "订单状态异常"), + ORDER_SHIPPING_TYPE_PICK_UP(5006, "订单配送方式门店自提"), + ORDER_USER_NOT_DELETE(5007, "订单用户未删除"), + ORDER_VERIFICATION(5008, "订单已核销"), + PRE_ORDER_NOT_EXIST(5009, "预下单订单不存在"), + ORDER_CANCEL(5009, "订单已经取消"), + ORDER_PAID(5009, "订单已经支付"), + ORDER_NOT_PAID(5010, "订单未支付"), + + ORDER_INVOICE_NOT_EXIST(5101, "订单发货单不存在"), + ORDER_INVOICE_LOGISTICS_NOT_EXIST(5102, "订单发货单物流不存在"), + + ORDER_DETAIL_NOT_EXIST(5201, "订单详情不存在"), + ORDER_DETAIL_RECEIPT(5202, "订单详情已收货"), + ORDER_DETAIL_REPLY(5203, "订单详情已评价"), + + REFUND_ORDER_NOT_EXIST(5501, "退款单不存在"), + REFUND_ORDER_STATUS_ABNORMAL(5502, "退款单状态异常"), + ; + + OrderResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public OrderResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public OrderResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public OrderResultCode setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/PayResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/PayResultCode.java new file mode 100644 index 0000000..e9a19ec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/PayResultCode.java @@ -0,0 +1,71 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 支付模块响应码 + * + */ +public enum PayResultCode implements BusinessExceptionAssert { + + ALI_PAY_NOT_CONFIG(2101, "支付宝支付未配置"), + + ; + + PayResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public PayResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public PayResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/ProductResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/ProductResultCode.java new file mode 100644 index 0000000..16c2d0c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/ProductResultCode.java @@ -0,0 +1,112 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 商品模块响应状态码 + * + */ +public enum ProductResultCode implements BusinessExceptionAssert { + + PRODUCT_EXIST(6101, "商品已存在"), + PRODUCT_NOT_EXIST(6102, "商品不存在"), + PRODUCT_RECYCLE(6103, "商品已进入回收站"), + PRODUCT_AUDIT_STATUS_EXCEPTION(6104, "商品审核状态异常"), + PRODUCT_DELETE(6105, "商品已经删除"), + PRODUCT_IS_SHOW(6106, "商品已上架"), + PRODUCT_IS_NOT_SHOW(6108, "商品已下架"), + PRODUCT_AUDIT_ING(6107, "商品审核中"), + + PRODUCT_PLAT_CATEGORY_NOT_EXIST(6201, "商品平台分类不存在"), + PRODUCT_PLAT_CATEGORY_USED(6202, "商品分类已使用"), + PRODUCT_MER_CATEGORY_NOT_EXIST(6203, "商户商品分类不存在"), + PRODUCT_MER_CATEGORY_USED(6204, "商户商品分类已使用"), + + PRODUCT_CDKEY_LIBRARY_NOT_EXIST(6301, "商品卡密库不存在"), + PRODUCT_CDKEY_LIBRARY_INTERACTION(6302, "商品卡密库已经关联"), + PRODUCT_CDKEY_NOT_QUICK_ADD(6303, "卡密商品不支持快捷添加库存"), + PRODUCT_CARD_SECRET_NOT_EXIST(6304, "商品卡密不存在"), + PRODUCT_CARD_SECRET_USED(6305, "商品卡密已使用"), + PRODUCT_CARD_SECRET_DELETE(6306, "商品卡密已删除"), + + PRODUCT_TAG_STATUS_TRUE(6401, "商品标签状态已开启"), + + SHIPPING_TEMPLATES_NOT_EXIST(6501, "运费模板不存在"), + SHIPPING_TEMPLATES_USED(6502, "运费模板已使用"), + + PRODUCT_RULE_EXIST(6601, "商品规格值已经存在"), + PRODUCT_RULE_NOT_EXIST(6602, "商品规格值不存在"), + + PRODUCT_BRAND_USED(6701, "商品品牌已使用"), + PRODUCT_BRAND_NOT_EXIST(6702, "商品品牌不存在"), + PRODUCT_BRAND_EXIST(6703, "商品品牌已存在"), + + PRODUCT_GUARANTEE_GROUP_NOT_EXIST(6801, "商品保障服务组合不存在"), + PRODUCT_GUARANTEE_USED(6802, "商品保障服务已使用"), + PRODUCT_GUARANTEE_NOT_EXIST(6803, "商品保障服务不存在"), + + PRODUCT_ATTR_VALUE_NOT_EXIST(6901, "商品规格属性值不存在"), + + PRODUCT_REPLY_NOT_EXIST(6902, "商品评论不存在"), + PRODUCT_REPLY_ED(6903, "商品已评论"), + + + ; + + ProductResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public ProductResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public ProductResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/ResultAdvice.java b/fightwine-common/src/main/java/com/yzt/common/result/ResultAdvice.java new file mode 100644 index 0000000..ff5a10c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/ResultAdvice.java @@ -0,0 +1,60 @@ +package com.yzt.common.result; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yzt.common.annotation.CustomResponseAnnotation; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.MethodParameter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; + +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * 返回值/响应体统一处理 + * + */ +@RestControllerAdvice(basePackages = {"com.yzt"}) +public class ResultAdvice implements ResponseBodyAdvice { + + @Autowired + private ObjectMapper objectMapper; + + /* 使用自定义响应的标识 */ + private static final String CUSTOM_RESPONSE_RESULT_ANNOTATION = "CUSTOM-RESPONSE-RESULT-ANNOTATION"; + + /** + * 是否支持advice功能 + * true 支持,false 不支持 + */ + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = (HttpServletRequest) Objects.requireNonNull(sra).getRequest(); + CustomResponseAnnotation customResponseAnnotation = (CustomResponseAnnotation) request.getAttribute(CUSTOM_RESPONSE_RESULT_ANNOTATION); + // 判断返回体是否需要处理 + return customResponseAnnotation == null; + } + + /** + * 对返回数据进行处理 + */ + @SneakyThrows + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + if (body instanceof String) {// 如果Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json。 + return objectMapper.writeValueAsString(CommonResult.success(body)); + } + if (body instanceof CommonResult) {// 如果返回的结果是CommonResult对象,直接返回即可。 + return body; + } + return CommonResult.success(body); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/SystemConfigResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/SystemConfigResultCode.java new file mode 100644 index 0000000..5819b58 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/SystemConfigResultCode.java @@ -0,0 +1,95 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 系统设置响应码枚举 + * + */ +public enum SystemConfigResultCode implements BusinessExceptionAssert { + + FORM_TEMP_NOT_EXIST(7101, "表单不存在"), + FORM_TEMP_PARAMETER_ERROR(7102, "模板表单 【{}】 的内容不是正确的JSON格式!"), + FORM_TEMP_NAME_REPEAT(7103, "模板表单名称重复"), + + CATEGORY_NOT_EXIST(7201, "分类不存在"), + + NOTIFICATION_NOT_EXIST(7301, "消息通知不存在"), + NOTIFICATION_SMS_CLOSE(7302, "消息通知短信开关未开启"), + SMS_TEMPLATE_NOT_EXIST(7303, "短信模板不存在"), + NOTIFICATION_NOT_CONFIG_PUBLIC(7304, "消息通知没有配置公众号模板"), + NOTIFICATION_NOT_CONFIG_ROUTINE(7304, "消息通知没有配置小程序订阅模板"), + + SIGN_COFNIG_NOT_EXIST(7401, "签到配置不存在"), + + MENU_NOT_EXIST(7501, "菜单不存在"), + ROLE_NOT_EXIST(7502, "角色不存在"), + ROLE_DELETE(7502, "角色已删除"), + ROLE_USED(7502, "角色已使用"), + + USER_LEVEL_NOT_EXIST(7601, "系统用户等级不存在"), + + PAGE_DIY_NOT_EXIST(7801, "diy模板信息不存在"), + + CITY_REGION_NOT_EXIST(7901, "城市区域不存在"), + EXPRESS_NOT_EXIST(7905, "快递公司不存在"), + + ; + + SystemConfigResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public SystemConfigResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public SystemConfigResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/UserResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/UserResultCode.java new file mode 100644 index 0000000..30ab805 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/UserResultCode.java @@ -0,0 +1,92 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 用户模块响应状态码 + * + */ +public enum UserResultCode implements BusinessExceptionAssert { + + USER_EXIST(8101, "用户已存在"), + USER_NOT_EXIST(8102, "用户不存在"), + USER_ID_NULL(8103, "请选择用户"), + USER_STATUS_EXCEPTION(8104, "用户状态异常"), + USER_LOGOFF(8105, "用户已经注销"), + USER_REGISTER_FAILED(8106, "用户注册失败"), + USER_PHONE_EXIST(8107, "用户手机号已存在"), + USER_LOGOFF_FAILED(8108, "用户注销失败"), + USER_NOT_COLLECT_MERCHANT(8109, "用户未收藏商户"), + USER_BALANCE_INSUFFICIENT(8110, "用户余额不足"), + + USER_ADDRESS_NOT_EXIST(8201, "用户地址不存在"), + USER_ADDRESS_CREATE_FAILED(8202, "用户地址创建失败"), + + USER_CLOSING_PROCESSING(8301, "用户结算申请正常处理中"), + USER_CLOSING_NULL(8302, "用户结算单不存在"), + USER_CLOSING_AUDIT_STATUS_EXCEPTION(8303, "用户结算单审核状态异常"), + + + USER_BROKERAGE_INSUFFICIENT(8401, "用户佣金不足"), + + USER_TAG_USING(8501, "用户标签正在使用中"), + + ; + + UserResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public UserResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public UserResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/result/WechatResultCode.java b/fightwine-common/src/main/java/com/yzt/common/result/WechatResultCode.java new file mode 100644 index 0000000..535e8ea --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/result/WechatResultCode.java @@ -0,0 +1,77 @@ +package com.yzt.common.result; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.exception.BusinessExceptionAssert; + +/** + * 微信模块响应状态码 + * + */ +public enum WechatResultCode implements BusinessExceptionAssert { + + ADMIN_EXIST(13001, "管理员已存在"), + ADMIN_NOT_EXIST(13002, "管理员不存在"), + + PUBLIC_APPID_NOT_CONFIG(13101, "微信公众号appId未设置"), + PUBLIC_SECRET_NOT_CONFIG(13101, "微信公众号secret未设置"), + + ROUTINE_APPID_NOT_CONFIG(13201, "微信小程序appId未设置"), + ROUTINE_SECRET_NOT_CONFIG(13201, "微信小程序secret未设置"), + ; + + WechatResultCode(Integer code, String message) { + this.code = code; + this.message = message; + } + + /** + * 响应状态码 + */ + private Integer code; + /** + * 响应信息 + */ + private String message; + /** + * 响应信息补充 + */ + private Object[] msgParams; + + + @Override + public Integer getCode() { + return code; + } + + @Override + public WechatResultCode setCode(Integer code) { + this.code = code; + return this; + } + + @Override + public String getMessage() { + if (ArrayUtil.isNotEmpty(msgParams)) { + return StrUtil.format(message, msgParams); + } + return message; + } + + @Override + public WechatResultCode setMessage(String message) { + this.message = message; + return this; + } + + @Override + public IResultEnum setMsgParams(Object... msgParams) { + this.msgParams = msgParams; + return this; + } + + @Override + public Object[] getMsgParams() { + return msgParams; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/token/FrontTokenComponent.java b/fightwine-common/src/main/java/com/yzt/common/token/FrontTokenComponent.java new file mode 100644 index 0000000..4d2939b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/token/FrontTokenComponent.java @@ -0,0 +1,200 @@ +package com.yzt.common.token; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.user.User; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.RequestUtil; +import com.yzt.common.vo.LoginUserVo; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +/** + * token验证处理 + * + */ +@Component +public class FrontTokenComponent { + + @Resource + private RedisUtil redisUtil; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + private static final Long MILLIS_MINUTE = 60 * 1000L; + + // 令牌有效期(默认30分钟) todo 调试期改为5小时 +// private static final int expireTime = 30; + private static final int expireTime = 5 * 60; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUserVo getLoginUser(HttpServletRequest request) { + // 获取请求携带的令牌 + String token = getToken(request); + if (StrUtil.isNotEmpty(token)) { + String userKey = getTokenKey(token); + return redisUtil.get(userKey); + } + return null; + } + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUserVo loginUser) { + if (ObjectUtil.isNotNull(loginUser) && StrUtil.isNotEmpty(loginUser.getToken())) { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) { + if (StrUtil.isNotEmpty(token)) { + String userKey = getTokenKey(token); + redisUtil.delete(userKey); + } + } + + /** + * 创建令牌 + * + * @param user 用户信息 + * @return 令牌 + */ + public String createToken(User user) { + String token = UUID.randomUUID().toString().replace("-", ""); + redisUtil.set(getTokenKey(token), user.getUid(), Constants.TOKEN_EXPRESS_MINUTES, TimeUnit.MINUTES); + return token; + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser LoginUserVo + */ + public void verifyToken(LoginUserVo loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUserVo loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisUtil.set(userKey, loginUser, (long) expireTime, TimeUnit.MINUTES); + } + + /** + * 获取请求token + * + * @param request HttpServletRequest + * @return token + */ + public String getToken(HttpServletRequest request) { + String token = request.getHeader(Constants.HEADER_AUTHORIZATION_KEY); + if (StrUtil.isNotEmpty(token) && token.startsWith(Constants.USER_TOKEN_REDIS_KEY_PREFIX)) { + token = token.replace(Constants.USER_TOKEN_REDIS_KEY_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) { + return Constants.USER_TOKEN_REDIS_KEY_PREFIX + uuid; + } + + /** + * 推出登录 + * @param request HttpServletRequest + */ + public void logout(HttpServletRequest request) { + String token = getToken(request); + delLoginUser(token); + } + + /** + * 获取当前登录用户id + */ + public Integer getUserId() { + HttpServletRequest request = (HttpServletRequest) ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + String token = getToken(request); + if (StrUtil.isEmpty(token)) { + return null; +// throw new YztException("登录信息已过期,请重新登录!"); + } + return redisUtil.get(getTokenKey(token)); + } + + //路由在此处,则返回true,无论用户是否登录都可以访问 + public boolean checkRouter(String uri) { + String[] routerList = { + "api/front/product/detail", + "api/front/coupons", + "api/front/index", + "api/front/bargain/list", + "api/front/combination/list", + "api/front/seckill/list", + "api/front/index/product", + "api/front/combination/index", + "api/front/bargain/index", + "api/front/seckill/index", + "api/front/index/color/config", + "api/front/product/list", + "api/front/product/sku/detail", + "api/front/index/get/version", + "api/front/image/domain", + "api/front/product/leaderboard", + "api/front/menu/user", + "api/front/combination/header", + "api/front/combination/detail", + "api/front/bargain/header", + "api/front/bargain/detail", + "api/front/seckill/header", + "api/front/seckill/detail" + }; + + return ArrayUtils.contains(routerList, uri); + } + + public Boolean check(String token, HttpServletRequest request){ + + try { + boolean exists = redisUtil.exists(getTokenKey(token)); + if(exists){ + Integer uid = redisUtil.get(getTokenKey(token)); + redisUtil.set(getTokenKey(token), uid, Constants.TOKEN_EXPRESS_MINUTES, TimeUnit.MINUTES); + }else{ + //判断路由,部分路由不管用户是否登录/token过期都可以访问 + exists = checkRouter(RequestUtil.getUri(request)); + } + return exists; + }catch (Exception e){ + return false; + } + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/token/WeChatOauthToken.java b/fightwine-common/src/main/java/com/yzt/common/token/WeChatOauthToken.java new file mode 100644 index 0000000..4cc78bc --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/token/WeChatOauthToken.java @@ -0,0 +1,43 @@ +package com.yzt.common.token; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 微信用户授权返回数据 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WeChatAuthorizeLoginGetOpenIdResponse对象", description="微信开放平台获取accessToken对象") +public class WeChatOauthToken implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "accessToken接口调用凭证") + @TableField(value = "access_token") + private String accessToken; + + @ApiModelProperty(value = "access_token 接口调用凭证超时时间,单位(秒)") + @TableField(value = "expires_in") + private String expiresIn; + + @ApiModelProperty(value = "用户刷新access_token") + @TableField(value = "refresh_token") + private String refreshToken; + + @ApiModelProperty(value = "用户OpenId") + @TableField(value = "openid") + private String openId; + + @ApiModelProperty(value = "用户授权的作用域,使用逗号(,)分隔") + private String scope; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/AESUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/AESUtil.java new file mode 100644 index 0000000..a9d8d63 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/AESUtil.java @@ -0,0 +1,51 @@ +package com.yzt.common.utils; + + +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.*; + +/** + * AES加密工具类 + * fw_ + */ +public class AESUtil { + + public static boolean initialized = false; + + /** + * AES解密 + * + * @param content + * 密文 + */ + public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException { + initialize(); + try { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); + Key sKeySpec = new SecretKeySpec(keyByte, "AES"); + cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化 + return cipher.doFinal(content); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static void initialize() { + if (initialized) + return; + Security.addProvider(new BouncyCastleProvider()); + initialized = true; + } + + // 生成iv + public static AlgorithmParameters generateIV(byte[] iv) throws Exception { + AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); + params.init(new IvParameterSpec(iv)); + return params; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/AppleUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/AppleUtil.java new file mode 100644 index 0000000..3c00a4a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/AppleUtil.java @@ -0,0 +1,111 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.auth0.jwk.Jwk; +import io.jsonwebtoken.*; +import org.apache.commons.codec.binary.Base64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.client.RestTemplate; + +import java.security.PublicKey; + +/** + * 苹果工具类 + * fw_ + */ +public class AppleUtil { + + private static final Logger logger = LoggerFactory.getLogger(AppleUtil.class); + + /** + * 获取苹果的公钥 + * @return + */ + private static JSONArray getAuthKeys() { + String url = "https://appleid.apple.com/auth/keys"; + RestTemplate restTemplate = new RestTemplate(); + JSONObject json = restTemplate.getForObject(url, JSONObject.class); + if (ObjectUtil.isNull(json)) { + logger.error("获取苹果的公钥失败"); + } + JSONArray arr = json.getJSONArray("keys"); + return arr; + } + + public static Boolean verify(String jwt) throws Exception{ + JSONArray arr = getAuthKeys(); + if(arr == null){ + return false; + } + JSONObject authKey = null; + + //先取苹果第一个key进行校验 + authKey = JSONObject.parseObject(arr.getString(0)); + if(verifyExc(jwt, authKey)){ + return true; + }else{ + //再取第二个key校验 + authKey = JSONObject.parseObject(arr.getString(1)); + return verifyExc(jwt, authKey); + } + + } + + /** + * 对前端传来的identityToken进行验证 + * @param jwt 对应前端传来的 identityToken + * @param authKey 苹果的公钥 authKey + * @return + * @throws Exception + */ + public static Boolean verifyExc(String jwt, JSONObject authKey) throws Exception { + + // 生成publicKey + Jwk jwa = Jwk.fromValues(authKey); + PublicKey publicKey = jwa.getPublicKey(); + // 分割前台传过来的identifyToken(jwt格式的token)用base64解码使用 + String aud = ""; + String sub = ""; + if (jwt.split("\\.").length > 1) { + String claim = new String(Base64.decodeBase64(jwt.split("\\.")[1])); + aud = JSONObject.parseObject(claim).get("aud").toString(); + sub = JSONObject.parseObject(claim).get("sub").toString(); + } + JwtParser jwtParser = Jwts.parser().setSigningKey(publicKey); + jwtParser.requireIssuer("https://appleid.apple.com"); + jwtParser.requireAudience(aud); + jwtParser.requireSubject(sub); + + try { + Jws claim = jwtParser.parseClaimsJws(jwt); + if (claim != null && claim.getBody().containsKey("auth_time")) { + System.out.println(claim); + return true; + } + return false; + } catch (ExpiredJwtException e) { + logger.error("apple identityToken expired", e); + return false; + } catch (Exception e) { + logger.error("apple identityToken illegal", e); + return false; + } + } + + /** + * 对前端传来的JWT字符串identityToken的第二部分进行解码 + * 主要获取其中的aud和sub,aud大概对应ios前端的包名,sub大概对应当前用户的授权的openID + * @param identityToken iosToken + * @return {"aud":"com.xkj.****","sub":"000***.8da764d3f9e34d2183e8da08a1057***.0***","c_hash":"UsKAuEoI-****","email_verified":"true","auth_time":1574673481,"iss":"https://appleid.apple.com","exp":1574674081,"iat":1574673481,"email":"****@qq.com"} + */ + public static JSONObject parserIdentityToken(String identityToken){ + String[] arr = identityToken.split("\\."); + String decode = new String (Base64.decodeBase64(arr[1])); + String substring = decode.substring(0, decode.indexOf("}")+1); + return JSON.parseObject(substring); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/ArrayUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/ArrayUtil.java new file mode 100644 index 0000000..2f64620 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/ArrayUtil.java @@ -0,0 +1,59 @@ +package com.yzt.common.utils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * ArrayUtil + * fw_ + */ +public class ArrayUtil { + /** + * List去重,不打乱原来顺序,泛型list对象 + * 对象重写hashCode和equals + * @param + * @param list + * @return + */ + public static List distinctBySetOrder(List list){ + Set set = new HashSet(); + List newList = new ArrayList(); + for(T t: list){ + if(set.add(t)){ + newList.add(t); + } + } + return newList; + } + + /** + * List去重,可能打乱原来顺序,泛型list对象 + * 对象重写hashCode和equals + * @param list + * @return + */ + public static List distinctBySet(List list){ + return new ArrayList(new HashSet(list)); + } + + /** + * list转为字符串,专用于sql中in函数 + * @return String + * @param list + */ + public static String strListToSqlJoin(List list) { + if (null == list || list.size() < 1) { + return ""; + } + StringBuilder temp = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { + temp.append(","); + } + temp.append("'").append(list.get(i)).append("'"); + } + return temp.toString(); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/CommonUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/CommonUtil.java new file mode 100644 index 0000000..e00e8e3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/CommonUtil.java @@ -0,0 +1,35 @@ +package com.yzt.common.utils; + +import org.apache.commons.codec.digest.DigestUtils; + +/** + * 通用工具类 + * + */ +public class CommonUtil { + + /** + * 随机生成密码 + * + * @param phone 手机号 + * @return 密码 + * 使用des方式加密 + */ + public static String createPwd(String phone) { + String password = "Abc" + YztUtil.randomCount(10000, 99999); + return YztUtil.encryptPassword(password, phone); + } + + /** + * 随机生成用户昵称 + * + * @param phone 手机号 + * @return 昵称 + */ + public static String createNickName(String phone) { + return DigestUtils.md5Hex(phone + YztDateUtil.getNowTime()). + subSequence(0, 12). + toString(); + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/CustomerBigDecimalSerialize.java b/fightwine-common/src/main/java/com/yzt/common/utils/CustomerBigDecimalSerialize.java new file mode 100644 index 0000000..75fbc1a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/CustomerBigDecimalSerialize.java @@ -0,0 +1,25 @@ +package com.yzt.common.utils; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.math.BigDecimal; +import java.util.Objects; + +/** + * BigDecimal 传输类型:String转数字 + * fw_ + */ +public class CustomerBigDecimalSerialize extends JsonSerializer { + @Override + public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if(Objects.nonNull(value)) { + gen.writeNumber(value.stripTrailingZeros().doubleValue()); + //去除0后缀,如果想统一进行保留精度,也可以采用类似处理 + }else {//如果为null的话,就写null + gen.writeNull(); + } + } +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/ExportUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/ExportUtil.java new file mode 100644 index 0000000..9e998e3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/ExportUtil.java @@ -0,0 +1,91 @@ +package com.yzt.common.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelUtil; +import cn.hutool.poi.excel.ExcelWriter; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.Font; + +import java.io.File; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * 导出工具类 + * fw_ + */ +public class ExportUtil { + + /** + * 导出Excel文件 + * @param fileName 文件名 + * @param title 文件标题 + * @param voList 数据列表 + * @param aliasMap 别名Map(别名需要与数据列表的数据对应) + * @return 返回给前端的文件名(路径+文件名) + */ + public static String exportExecl(String fileName, String title, List voList, LinkedHashMap aliasMap) { + if (StrUtil.isBlank(fileName)) { + throw new YztException("文件名不能为空"); + } + if (StrUtil.isBlank(title)) { + throw new YztException("标题不能为空"); + } + if (CollUtil.isEmpty(voList)) { + throw new YztException("数据列表不能为空"); + } + if (CollUtil.isEmpty(aliasMap)) { + throw new YztException("别名map不能为空"); + } + + // 文件名部分 + String newFileName = UploadUtil.getWebPath() + fileName; + String filePath = UploadUtil.getServerPath(); + + // 判断是否存在当前目录,不存在则创建 + File file = new File(filePath); + if (!file.exists()) { + file.mkdirs(); + } + fileName = filePath.concat(fileName); + + // 通过工具类创建writer + ExcelWriter writer = ExcelUtil.getWriter(fileName); +// ExcelWriter writer = ExcelUtil.getWriter("d:/writeMapTest.xlsx"); + CellStyle headCellStyle = writer.getHeadCellStyle(); + Font font = writer.createFont(); + font.setBold(true); + headCellStyle.setFont(font); + + //自定义标题别名 + aliasMap.forEach((key, value) -> writer.addHeaderAlias(key, value)); + // 合并单元格后的标题行,使用默认标题样式 + writer.merge(aliasMap.size() - 1, title); + writer.merge(aliasMap.size() - 1, StrUtil.format("生成时间:{}", YztDateUtil.nowDateTimeStr())); + //设置宽度自适应 + writer.setColumnWidth(-1, 22); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.write(voList, true); + // 关闭writer,释放内存 + writer.close(); + + return newFileName; + } + + /** + * 上传部分设置 + */ + public static void setUpload(String rootPath, String modelPath, String type) { + if (StrUtil.isBlank(rootPath) || StrUtil.isBlank(modelPath) || StrUtil.isBlank(type)) { + throw new YztException("请检查上传参数,上传参数不能为空"); + } + UploadUtil.setRootPath(rootPath); + UploadUtil.setModelPath(UploadConstants.UPLOAD_FILE_KEYWORD +"/"+UploadConstants.DOWNLOAD_FILE_KEYWORD+"/"+modelPath); +// UploadUtil.setType(type); + } + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/ImageMergeUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/ImageMergeUtil.java new file mode 100644 index 0000000..0d6db35 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/ImageMergeUtil.java @@ -0,0 +1,142 @@ +package com.yzt.common.utils; + +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.ImageMergeUtilVo; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URL; +import java.net.URLConnection; +import java.util.List; + +/** + * + * 图片工具类 + */ +@Data +@Component +public class ImageMergeUtil { + public static BufferedImage bufferedImage; //背景图片 + public static String model = "merge"; + public static String ext = "jpg"; + + /** + * 合并生成新的图片文件 + * @param list List 图片集合 + * @author Mr.Zhang + * @since 2020-05-06 + */ + public static String drawWordFile(List list){ + buildImage(list); + if(bufferedImage == null){ + return null; + } + + try { + UploadUtil.setModelPath(model); + UploadUtil.setExtStr(ext); + + //文件名 + String newFileName = UploadUtil.fileName(ext); + // 创建目标文件的名称,规则请看destPath方法 + String destPath = UploadUtil.getDestPath(newFileName); + // 创建文件 + File file = UploadUtil.createFile(destPath); + ImageIO.write(bufferedImage, ext, file); + return destPath; + } catch (IOException ex) { + ex.printStackTrace(); + } + return null; + } + + private static void drawImage(ImageMergeUtilVo imageMergeUtilVo){ + String fileName = getFileSource(imageMergeUtilVo.getPath()); + if(StringUtils.isBlank(fileName)){ + return; + } + try{ + File file = new File(fileName); + BufferedImage read = ImageIO.read(file); + + if(bufferedImage == null || bufferedImage.equals("")){ + imageMergeUtilVo.setX(0); + imageMergeUtilVo.setY(0); + //创建新的画布,宽高以第一个图为准 + bufferedImage = new BufferedImage(read.getWidth(), read.getHeight(), BufferedImage.TYPE_INT_BGR); + } + + Graphics graphics = bufferedImage.getGraphics(); + //在画布上绘制背景图 + graphics.drawImage(read, imageMergeUtilVo.getX(), imageMergeUtilVo.getX(), read.getWidth(), read.getHeight(), null); + file.delete(); + }catch (Exception e){ + //合成图片xx失败 + throw new YztException("合成图片 + " + fileName + "失败"); + } + } + + /** + * 合并生成新的图片流 + * @param list List 图片集合 + * @author Mr.Zhang + * @since 2020-05-06 + */ + private static void buildImage(List list){ + if(list.size() < 2){ + throw new YztException("至少需要2张图片才可以做合并"); + } + + for (ImageMergeUtilVo imageMergeUtilVo : list) { + drawImage(imageMergeUtilVo); + } + } + + + + /** + * 根据图片路径输出File流 + * @param url String 文件地址 + * @author Mr.Zhang + * @since 2020-05-06 + */ + private static String getFileSource(String url){ + if(!url.contains("http")){ + return url; + } + + try { + URL urlInfo = new URL(url); + // 打开连接 + URLConnection con = urlInfo.openConnection(); + // 输入流 + InputStream is = con.getInputStream(); + // 1K的数据缓冲 + byte[] bs = new byte[1024]; + // 读取到的数据长度 + int len; + + String fileName = UploadUtil.fileName(ext); + // 输出的文件流 + OutputStream os = new FileOutputStream(fileName); + // 开始读取 + while ((len = is.read(bs)) != -1) { + os.write(bs, 0, len); + } + // 完毕,关闭所有链接 + os.close(); + is.close(); + + return fileName; + }catch (Exception e){ + e.printStackTrace(); + } + + return null; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/OnePassUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/OnePassUtil.java new file mode 100644 index 0000000..c34f71e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/OnePassUtil.java @@ -0,0 +1,51 @@ +package com.yzt.common.utils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; + +/** + * @Auther: 大粽子 + * @Date: 2023/8/29 12:14 + * @Description: 描述对应的业务场景 + */ +public class OnePassUtil { + private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding"; + + private static final String SECRET_KEY = "user-AppSecret-key"; + + /** + * 一号通商家寄件 回调数据揭秘方法 + * @param encryptedData 回调加密数据 + * @return 揭秘数据 + * @throws Exception 异常信息 + */ + public static String decrypt(String encryptedData) throws Exception { + byte[] decodedBytes = Base64.getDecoder().decode(encryptedData); + byte[] ivBytes = new byte[16]; + byte[] encryptedBytes = new byte[decodedBytes.length - 16]; + System.arraycopy(decodedBytes, 0, ivBytes, 0, 16); + System.arraycopy(decodedBytes, 16, encryptedBytes, 0, encryptedBytes.length); + + Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM); + SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.substring(0, 32).getBytes("UTF-8"), "AES"); + IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + return new String(decryptedBytes); + } + +// public static void main(String[] args) { +// try { +// // 加密字符串 +// String encryptedString = "85Z0kFc/X0EXUUZes5Wdni9jXOuZiWb5uRGZrk+48dkoourTAXBO4jZR8au8vXqFKKyqpTo/7Detwww9p8HdVN4cCD4wh/S3ic1jCTPJVI8cEowGAFoYNAi5mPOg4y8F/T1U8lqyL7TxrYx6P5KRoSwFbjj9z0e9rHvh/fWtaA/XirRLebVqA3zzYigKPx3m"; +// +// // 解密字符串 +// String decryptedString = decrypt(encryptedString); +// System.out.println("解密后的字符串: " + decryptedString); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/QRCodeUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/QRCodeUtil.java new file mode 100644 index 0000000..a8b3f43 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/QRCodeUtil.java @@ -0,0 +1,60 @@ +package com.yzt.common.utils; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.apache.commons.codec.binary.Base64; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.HashMap; + +/** + * + * 二维码工具 + */ +@Component +public class QRCodeUtil { + + public static String crateQRCode(String content, int width, int height) throws IOException { + + if (!StringUtils.isEmpty(content)) { + ServletOutputStream stream = null; + ByteArrayOutputStream os = new ByteArrayOutputStream(); + @SuppressWarnings("rawtypes") + HashMap hints = new HashMap<>(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8” + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定二维码的纠错等级为中级 + hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距 + + try { + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints); + + BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix); + ImageIO.write(bufferedImage, "png", os); + /** + * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,可以让前端加,也可以在下面加上 + */ + + return YztUtil.getBase64Image(Base64.encodeBase64String(os.toByteArray())); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (stream != null) { + stream.flush(); + stream.close(); + } + } + } + return null; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/RedisUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/RedisUtil.java new file mode 100644 index 0000000..64718f8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/RedisUtil.java @@ -0,0 +1,778 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * + * redis工具类 + */ + +@Component +public class RedisUtil { + + private final RedisConnectionFactory redisConnectionFactory; + private final RedisConnectionFactory secondRedisConnectionFactory; + + @Autowired + public RedisUtil(RedisConnectionFactory redisConnectionFactory, + @Qualifier("secondRedisConnectionFactory") RedisConnectionFactory secondRedisConnectionFactory) { + this.redisConnectionFactory = redisConnectionFactory; + this.secondRedisConnectionFactory = secondRedisConnectionFactory; + } + + public RedisTemplate getRedisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + StringRedisSerializer stringSerializer = new StringRedisSerializer(); + // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = serializer(); + + redisTemplate.setKeySerializer(stringSerializer);//key序列化 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 + redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 + redisTemplate.afterPropertiesSet(); + + return redisTemplate; + } + + public RedisTemplate getSecondRedisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(secondRedisConnectionFactory); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + StringRedisSerializer stringSerializer = new StringRedisSerializer(); + // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = serializer(); + + redisTemplate.setKeySerializer(stringSerializer);//key序列化 + redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 + redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 + redisTemplate.afterPropertiesSet(); + + return redisTemplate; + } + + /** + * 配置Jackson2JsonRedisSerializer序列化策略 + */ + private Jackson2JsonRedisSerializer serializer() { + //设置序列化 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper om = new ObjectMapper(); + // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 + om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); + // 不存在的字段,不被序列化 + om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + jackson2JsonRedisSerializer.setObjectMapper(om); + return jackson2JsonRedisSerializer; + } + + +// @Resource +// private RedisTemplate redisTemplate; + + // ============================ common ============================ + + /** + * 指定缓存失效时间 + * + * @param key 键 + * @param time 时间(秒) + * @return boolean + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + getRedisTemplate().expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 失效时间为负数,说明该主键未设置失效时间(失效时间默认为-1) + */ + public Long getExpire(String key) { + return getRedisTemplate().getExpire(key, TimeUnit.SECONDS); + } + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false 不存在 + */ + public Boolean exists(String key) { + try { + return getRedisTemplate().hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void delete(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + if (exists(key[0])) { + getRedisTemplate().delete(key[0]); + } + } else { + getRedisTemplate().delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } + + // ============================ String ============================= + + /** + * 读取缓存 + * + * @param key 键 + * @return T + */ + @SuppressWarnings("unchecked") + public T get(String key) { + return key == null ? null : (T) getRedisTemplate().opsForValue().get(key); + } + + /** + * 写入缓存 + * + * @param key 键 + * @param value 值 + */ + public boolean set(String key, Object value) { + try { + getRedisTemplate().opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 写入缓存带有效期(默认时间单位:秒) + * + * @param key key + * @param value value + * @param expireTime 过期时间 time要大于0 如果time小于等于0 将设置无限期 + * @return boolean + */ + public boolean set(String key, Object value, Long expireTime) { + try { + if (expireTime > 0) { + getRedisTemplate().opsForValue().set(key, value, expireTime, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 写入缓存带有效期 + * + * @param key key + * @param value value + * @param expireTime 过期时间 + * @param timeUnit 时间格式 + * @return boolean + */ + public boolean set(String key, Object value, Long expireTime, TimeUnit timeUnit) { + try { + getRedisTemplate().opsForValue().set(key, value, expireTime, timeUnit); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + * + * @param key 键 + * @return long + */ + public Long incrAndCreate(String key) { + if (!exists(key)) { + set(key, 1); + return 1L; + } + return incr(key, 1L); + } + + /** + * 递增 + * + * @param key 键 + * @param delta 要增加几(大于0) + * @return long + */ + public Long incrAndCreate(String key, long delta) { + if (!exists(key)) { + set(key, delta); + return delta; + } + return incr(key, delta); + } + + /** + * 递增 + * + * @param key 键 + * @param delta 要增加几(大于0) + * @return long + */ + public Long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return getRedisTemplate().opsForValue().increment(key, delta); + } + + /** + * 递减 + * + * @param key 键 + * @param delta 要减少几(小于0) + * @return Long + */ + public Long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return getRedisTemplate().opsForValue().increment(key, -delta); + } + + // ================================Map================================= + + /** + * 哈希获取数据 HashGet + * + * @param key 键 不能为null + * @param item 项 不能为nul + * @return 值 + */ + public Object hget(String key, String item) { + return getRedisTemplate().opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return getRedisTemplate().opsForHash().entries(key); + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + getRedisTemplate().opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + getRedisTemplate().opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet + * + * @param key 键 + * @param map 对应多个键值 + * @return true 成功 false 失败 + */ + public boolean hmSet(String key, Map map) { + try { + getRedisTemplate().opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * HashSet 并设置时间 + * + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + getRedisTemplate().opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 哈希删除 + * + * @param key 键 不能为null + * @param hashKey 项 不能为null + */ + public void hmDelete(String key, Object hashKey) { + getRedisTemplate().opsForHash().delete(key, hashKey); + } + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hmDelete(String key, Object... item) { + getRedisTemplate().opsForHash().delete(key, item); + } + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return getRedisTemplate().opsForHash().hasKey(key, item); + } + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + * @return 递增后的值 + */ + public long hincr(String key, String item, long by) { + return getRedisTemplate().opsForHash().increment(key, item, by); + } + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少几(小于0) + * @return 递减后的值 + */ + public long hdecr(String key, String item, long by) { + return getRedisTemplate().opsForHash().increment(key, item, -by); + } + + /** + * 哈希数量 + * + * @param key 键 + * @return 键下的数量 + */ + public Long getHashSize(String key) { + return getRedisTemplate().opsForHash().size(key); + } + + // ===============================list================================= + + /** + * 列表添加左边添加 + * + * @param key 键 + * @param value 值 + */ + public boolean lPush(String key, Object value) { + try { + getRedisTemplate().opsForList().leftPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 列表添加左边添加 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + */ + public boolean lSet(String key, Object value, long time) { + try { + getRedisTemplate().opsForList().leftPush(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 从右边拿出来一个 + * + * @param k string key + * @param t Long 超时秒数 + */ + public Object getRightPop(String k, Long t) { + return getRedisTemplate().opsForList().rightPop(k, t, TimeUnit.SECONDS); + } + + /** + * 列表获取数量 + * + * @param key 键 + * @return Long + */ + public Long getListSize(String key) { + try { + return getRedisTemplate().opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + * @return list缓存的内容 + */ + public List lGet(String key, long start, long end) { + try { + return getRedisTemplate().opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + */ + public Object lGetIndex(String key, long index) { + try { + return getRedisTemplate().opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + */ + public boolean lUpdateIndex(String key, long index, Object value) { + try { + getRedisTemplate().opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + public Long lRemove(String key, long count, Object value) { + try { + return getRedisTemplate().opsForList().remove(key, count, value); + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * + * @param key 键 + * @return key对应的所有值 + */ + public Set sGet(String key) { + try { + return getRedisTemplate().opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public Boolean sHasKey(String key, Object value) { + try { + return getRedisTemplate().opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public Long sSet(String key, Object... values) { + try { + return getRedisTemplate().opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public Long sSetAndTime(String key, long time, Object... values) { + try { + Long count = getRedisTemplate().opsForSet().add(key, values); + if (time > 0) + expire(key, time); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + /** + * 获取set缓存的长度 + * + * @param key 键 + * @return set缓存的长度 + */ + public Long sGetSetSize(String key) { + try { + return getRedisTemplate().opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + public Long setRemove(String key, Object... values) { + try { + return getRedisTemplate().opsForSet().remove(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0L; + } + } + + + /** + * 有序集合添加 排行榜使用 + * + * @param key string key + * @param value Object value + * @param score double scoure + */ + public void zAdd(String key, Object value, double score) { + ZSetOperations zset = getRedisTemplate().opsForZSet(); + zset.add(key, value, score); + } + + + /** + * 有序集合获取 排行榜使用 + * + * @param key string key + * @param score double scoure + * @return Set + */ + public Set rangeByScore(String key, double score, double score1) { + ZSetOperations zset = getRedisTemplate().opsForZSet(); + return zset.rangeByScore(key, score, score1); + } + + + // =================第二数据源部分=========================== + + /** + * 判断key是否存在 + * + * @param key 键 + * @return true 存在 false 不存在 + */ + public Boolean secondKeyExists(String key) { + try { + return getSecondRedisTemplate().hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 读取缓存 + * + * @param key 键 + * @return T + */ + public T getSecondObject(String key) { + if (StrUtil.isBlank(key)) { + return null; + } + return (T) getSecondRedisTemplate().opsForValue().get(key); + } + + /** + * 写入缓存带有效期 + * + * @param key key + * @param value value + * @param expireTime 过期时间 + * @param timeUnit 时间格式 + * @return boolean + */ + public boolean setSecondObject(String key, Object value, Long expireTime, TimeUnit timeUnit) { + try { + getSecondRedisTemplate().opsForValue().set(key, value, expireTime, timeUnit); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 删除缓存 + * + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void secondDelete(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + if (exists(key[0])) { + getSecondRedisTemplate().delete(key[0]); + } + } else { + getSecondRedisTemplate().delete((Collection) CollectionUtils.arrayToList(key)); + } + } + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/RequestUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/RequestUtil.java new file mode 100644 index 0000000..3a5210c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/RequestUtil.java @@ -0,0 +1,98 @@ +package com.yzt.common.utils; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +/** + * Request工具类 + * fw_ + */ +public class RequestUtil extends HttpServlet{ + public static HttpServletRequest getRequest() { + if(RequestContextHolder.getRequestAttributes() != null){ + return (HttpServletRequest) ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + + } + + return null; + } + public static HashMap getRequestParamAndHeader(){ + + try{ + HttpServletRequest request = getRequest(); + if(request == null){ + return null; + } + + //request信息 + HashMap data = new HashMap<>(); + HashMap requestParams = new HashMap<>(); + Enumeration paraNames = request.getParameterNames(); + if(paraNames != null){ + for(Enumeration enumeration =paraNames;enumeration.hasMoreElements();){ + String key= enumeration.nextElement(); + requestParams.put(key, request.getParameter(key)); + } + } + + HashMap requestFilter = new HashMap<>(); + Enumeration attributeNames = request.getAttributeNames(); + if(attributeNames != null){ + for ( Enumeration attributeNames1 = attributeNames; attributeNames1.hasMoreElements();) { + String key= attributeNames1.nextElement(); + if(key.contains("request_")){ + requestFilter.put(key, request.getAttribute(key)); + } + } + } + + data.put("url", request.getRequestURL()); + data.put("uri", request.getRequestURI()); + data.put("method", request.getMethod()); + data.put("request", requestParams); + data.put("request_filter", requestFilter); + + //header 信息 + Enumeration headerNames = request.getHeaderNames(); + HashMap headerParams = new HashMap<>(); + if(headerNames != null){ + for(Enumeration enumeration = headerNames;enumeration.hasMoreElements();){ + String key= enumeration.nextElement(); + String value=request.getHeader(key); + headerParams.put(key, value); + } + } + data.put("header", headerParams); + + + return data; + }catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + public static String getDomain(){ + HttpServletRequest request = getRequest(); + if(request == null){ + return null; + } + return request.getServerName() + ":" + request.getServerPort(); + } + + public static String getUri(HttpServletRequest request){ + String uri = request.getRequestURI(); + List list = YztUtil.stringToArrayStrRegex(uri, "/"); + list.removeIf(StringUtils::isNumeric); //去掉url中的数字参数 + list.removeIf(c -> c.contains(","));// 去掉url中的逗号分隔参数 + return StringUtils.join(list, "/"); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/RestTemplateUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/RestTemplateUtil.java new file mode 100644 index 0000000..fed9365 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/RestTemplateUtil.java @@ -0,0 +1,476 @@ +package com.yzt.common.utils; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.DefaultHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.BasicHttpClientConnectionManager; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import java.io.FileInputStream; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +/** + * + * httpClient 工具类 + */ + +@Component +public class RestTemplateUtil { + + @Autowired + private RestTemplate restTemplate; + + public static final String WXPAYSDK_VERSION = "WXPaySDK/3.0.9"; + public static final String USER_AGENT = WXPAYSDK_VERSION + + " (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") + + ") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion(); + +// /** +// * 设置超时时间 +// */ +// public RestTemplateUtil() { +// SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); +// //30s +// requestFactory.setConnectTimeout(30*1000); +// requestFactory.setReadTimeout(30*1000); +// restTemplate = new RestTemplate(requestFactory); +// } + + /** + * 发送GET请求 + * @param url + * @param param + * @return + */ + + public String getData(String url, Map param) { + // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交 + HttpHeaders headers = new HttpHeaders(); + for (Map.Entry entry : param.entrySet()) { + headers.add(entry.getKey(), entry.getValue()); + } + RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, URI.create(url)); + return restTemplate.exchange(requestEntity, String.class).getBody(); + } + + /** + * 发送GET请求 + * @param url + * @return + */ + + public String getLink(String url) { + return restTemplate.getForEntity(url, String.class).getBody(); + } + + + /** + * 发送GET请求 + * @param url + * @return + */ + + public JSONObject getData(String url) { + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity> requestEntity = + new HttpEntity<>( headers); + + return restTemplate.exchange( url, HttpMethod.GET, requestEntity, JSONObject.class).getBody(); + } + + /** + * 发送GET请求 支持header + * @param url + * @return + */ + + public JSONObject getData(String url, HashMap hashMap) { + + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + for (Map.Entry entry : hashMap.entrySet()) { + headers.add(entry.getKey(), entry.getValue()); + } + + HttpEntity> requestEntity = + new HttpEntity<>( headers); + + return restTemplate.exchange( url, HttpMethod.GET, requestEntity, JSONObject.class).getBody(); + } + + + /** + * 发送POST-JSON请求 + * + * @param url + * @param param + * @return + */ + + public String postJsonData(String url, JSONObject param) { + + HttpHeaders headers = new HttpHeaders(); + + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity requestEntity = new HttpEntity(param, headers); + + return restTemplate.postForEntity(url, param, String.class).getBody(); + + } + + /** + * 发送POST 表单请求 + * + * @param url + * @return + */ + + public String postFormData(String url, MultiValueMap map) { + HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.MULTIPART_FORM_DATA); + HttpEntity> requests = new HttpEntity>(map, headers); + String body = restTemplate.postForEntity(url, requests, String.class).getBody(); + return body; + + + } + + + + + /** + * 发送POST-JSON请求 + * + * @param url + * @param param + * @return + */ + + public JSONObject postJsonDataAndReturnJson(String url, JSONObject param) { + HttpHeaders headers = new HttpHeaders(); + + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity requestEntity = new HttpEntity(param, headers); + + JSONObject body = restTemplate.postForEntity(url, requestEntity, JSONObject.class).getBody(); + + return body; + + } + + /** + * 发送POST-JSON请求 + * + * @param url + * @return + */ + + public JSONObject post(String url) { + HttpHeaders headers = new HttpHeaders(); + + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity requestEntity = new HttpEntity<>( headers); + + JSONObject body = restTemplate.postForEntity(url, requestEntity, JSONObject.class).getBody(); + + return body; + + } + + /** + * 发送POST-JSON请求 + * + * @param url + * @return + */ + + public String postXml(String url, String xml){ + HttpHeaders headers = new HttpHeaders(); + + MediaType type = MediaType.parseMediaType("application/xml; charset=UTF-8"); + headers.setContentType(type); + HttpEntity requestEntity = new HttpEntity<>(xml, headers); + + ResponseEntity responseEntity = restTemplate.postForEntity(url, requestEntity, String.class); + try{ + System.out.println("responseEntity"+responseEntity); + return new String(Objects.requireNonNull(responseEntity.getBody()).getBytes("UTF-8"), StandardCharsets.UTF_8); + }catch (Exception e){ + return ""; + } + } + + /** + * 发送POST-JSON请求(微信退款专用) + * + * @param url + * @return + */ + + public String postWXRefundXml(String url, String xml, String mchId, String path) throws Exception { + KeyStore clientStore = KeyStore.getInstance("PKCS12"); + // 读取本机存放的PKCS12证书文件 + FileInputStream instream = new FileInputStream(path); + try { + // 指定PKCS12的密码(商户ID) + clientStore.load(instream, mchId.toCharArray()); + } finally { + instream.close(); + } + + // 实例化密钥库 & 初始化密钥工厂 + KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(clientStore, mchId.toCharArray()); + + // 创建 SSLContext + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(kmf.getKeyManagers(), null, new SecureRandom()); + + SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory( + sslContext, +// new String[]{"TLSv1"}, +// null, + new DefaultHostnameVerifier()); + + BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager( + RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", sslConnectionSocketFactory) + .build(), + null, + null, + null + ); + + HttpClient httpClient = HttpClientBuilder.create() + .setConnectionManager(connManager) + .build(); + + HttpPost httpPost = new HttpPost(url); + + RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(8*1000).setConnectTimeout(6*1000).build(); + httpPost.setConfig(requestConfig); + + StringEntity postEntity = new StringEntity(xml, "UTF-8"); + httpPost.addHeader("Content-Type", "text/xml"); + httpPost.addHeader("User-Agent", USER_AGENT + " " + mchId); + httpPost.setEntity(postEntity); + + HttpResponse httpResponse = httpClient.execute(httpPost); + org.apache.http.HttpEntity httpEntity = httpResponse.getEntity(); + return EntityUtils.toString(httpEntity, "UTF-8"); + } + + /** + * 发送POST 表单请求 + * + * @param url + * @param params + * @return + * + * 表单提交,返回数据分为两部分,一个代表成功,一个是返回的数据内容 + */ + + public String postFormData(String url, LinkedMultiValueMap params ) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + + HttpEntity> requestEntity = + new HttpEntity<>(params, headers); + + ResponseEntity responseEntity = restTemplate.exchange( + url, + HttpMethod.POST, + requestEntity, + String.class); + + String body = responseEntity.getBody(); + + return body; + + } + + + + public String postMapData(String url, Map params ) { + + //cs + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity> requestEntity = + new HttpEntity<>(params, headers); + + String body1 = restTemplate.postForEntity( url, requestEntity, String.class).getBody(); + + + System.out.println(body1); + + return body1; + + } + + public String postMapData(String url, Map params, Map header) { + + //cs + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + for (Map.Entry entry : header.entrySet()) { + headers.add(entry.getKey(), entry.getValue()); + } + + HttpEntity> requestEntity = + new HttpEntity<>(params, headers); + + String body1 = restTemplate.postForEntity( url, requestEntity, String.class).getBody(); + + + System.out.println(body1); + + return body1; + + } + + + public String postStringData(String url,String data ) { + + //cs + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity requestEntity = + new HttpEntity<>(data, headers); + + String body1 = restTemplate.postForEntity(url, requestEntity, String.class).getBody(); + + + System.out.println(body1); + + return body1; + + } + + public byte[] postJsonDataAndReturnBuffer(String url, JSONObject param) { + HttpHeaders headers = new HttpHeaders(); + + headers.setContentType(MediaType.APPLICATION_JSON_UTF8); + + headers.add("Accept", MediaType.APPLICATION_JSON.toString()); + + HttpEntity requestEntity = new HttpEntity(param, headers); + + return restTemplate.postForEntity(url, param, byte[].class).getBody(); + } + + + public byte[] getBuffer(String url) { + return restTemplate.getForEntity(url, byte[].class).getBody(); + } + + /** + * post——from-urlencoded格式请求 + */ + public String postFromUrlencoded(String url, MultiValueMap params, Map header) { + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + if (CollUtil.isNotEmpty(header)) { + for (Map.Entry entry : header.entrySet()) { + headers.add(entry.getKey(), entry.getValue()); + } + } + + HttpEntity> requestEntity = + new HttpEntity<>(params, headers); + +// SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); +// //30s +// requestFactory.setConnectTimeout(30*1000); +// requestFactory.setReadTimeout(30*1000); +// restTemplate = new RestTemplate(requestFactory); + return restTemplate.postForEntity(url, requestEntity, String.class).getBody(); + } + + /** + * 发送GET请求 支持header + * @param url + * @return + */ + + public JSONObject getDataForm(String url, MultiValueMap params, Map header) { + // 构建带参数的 URL + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url); + if (CollUtil.isNotEmpty(params)) { + for (Map.Entry> entry : params.entrySet()) { + for (Object value : entry.getValue()) { + builder.queryParam(entry.getKey(), value); + } + } + } + String finalUrl = builder.build().toUriString(); + + // 设置请求头 + HttpHeaders headers = new HttpHeaders(); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); + if (CollUtil.isNotEmpty(header)) { + for (Map.Entry entry : header.entrySet()) { + headers.add(entry.getKey(), entry.getValue()); + } + } + + // 发送 GET 请求 + HttpEntity requestEntity = new HttpEntity<>(headers); + return restTemplate.exchange(finalUrl, HttpMethod.GET, requestEntity, JSONObject.class).getBody(); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/SCRMUtils.java b/fightwine-common/src/main/java/com/yzt/common/utils/SCRMUtils.java new file mode 100644 index 0000000..050e8d0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/SCRMUtils.java @@ -0,0 +1,32 @@ +package com.yzt.common.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +/** + * For SCRM + */ + +@Component +public class SCRMUtils { + + @Autowired + private RestTemplateUtil restTemplateUtil; + + private String scrm_addUser_URL = "http://api.scrm.crmeb.com/api/contactBatchAdd"; + + public void addUserForSCRM(String phone, String nikename){ + String type = "拼酒系统"; + HashMap addUserPram = new HashMap<>(); + addUserPram.put("phone", phone); + addUserPram.put("nikename", nikename); + addUserPram.put("type", type); + String result = restTemplateUtil.postMapData(scrm_addUser_URL, addUserPram); + System.out.println("result:"+result); + } + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/SecurityUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/SecurityUtil.java new file mode 100644 index 0000000..e36d593 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/SecurityUtil.java @@ -0,0 +1,42 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.LoginUserVo; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * security工具类 + * + */ +public class SecurityUtil { + + /** + * 获取管理员信息(从security中) + */ + public static LoginUserVo getLoginUserVo() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + LoginUserVo loginUserVo = (LoginUserVo) authentication.getPrincipal(); + if (ObjectUtil.isNull(loginUserVo)) { + throw new YztException("登录信息已过期,请重新登录"); + } + return loginUserVo; + } + + public static Integer getCurrentUserId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null || !authentication.isAuthenticated()) { + return null; + } + + Object principal = authentication.getPrincipal(); + if (principal instanceof LoginUserVo) { + LoginUserVo loginUser = (LoginUserVo) principal; + return loginUser.getUser().getId(); + } else if (principal instanceof String) { + return null; + } + return null; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/SpringUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/SpringUtil.java new file mode 100644 index 0000000..0504a11 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/SpringUtil.java @@ -0,0 +1,42 @@ +package com.yzt.common.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * Spring 工具类 + * + */ +@Component +public class SpringUtil implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + if(SpringUtil.applicationContext == null) { + SpringUtil.applicationContext = applicationContext; + } + } + + //获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + //通过name获取 Bean. + public static Object getBean(String name){ + return getApplicationContext().getBean(name); + } + + //通过class获取Bean. + public static T getBean(Class clazz){ + return getApplicationContext().getBean(clazz); + } + + //通过name,以及Clazz返回指定的Bean + public static T getBean(String name,Class clazz){ + return getApplicationContext().getBean(name, clazz); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/UploadUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/UploadUtil.java new file mode 100644 index 0000000..b3b62de --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/UploadUtil.java @@ -0,0 +1,136 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.RandomUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import org.apache.commons.io.FilenameUtils; + +import java.io.File; +import java.io.IOException; + +/** + * 上传工具类 + * + */ +public class UploadUtil { + + //服务器存储地址 +// private static String rootPath = "/www/wwwroot/upload"; + private static String rootPath = ""; + + //类型 + private static String type = "/" + UploadConstants.UPLOAD_FILE_KEYWORD; + + + //模块 +// private static String modelPath = "/store"; + private static String modelPath = "/public"; + + //扩展名 + private static String extStr = "png,jpg"; + + //文件大小上限 + private static int size = 2; + + public static String getRootPath() { + return rootPath; + } + + public static void setRootPath(String rootPath) { + UploadUtil.rootPath = (rootPath + "/").replace(" ", "").replace("//", "/"); + } + + public static String getType() { + return type; + } + + public static void setType(String type) { + UploadUtil.type = type + "/"; + } + + public static String getModelPath() { + return modelPath; + } + + public static void setModelPath(String modelPath) { + UploadUtil.modelPath = modelPath + "/"; + } + + public static String getExtStr() { + return extStr; + } + + public static void setExtStr(String extStr) { + UploadUtil.extStr = extStr; + } + + public static int getSize() { + return size; + } + + public static void setSize(int size) { + UploadUtil.size = size; + } + + /** + * 根据文件的绝对路径创建一个文件对象. + */ + public static File createFile(String filePath) throws IOException { + // 获取文件的完整目录 + String fileDir = FilenameUtils.getFullPath(filePath); + // 判断目录是否存在,不存在就创建一个目录 + File file = new File(fileDir); + if (!file.isDirectory()) { + //创建失败返回null + if (!file.mkdirs()) { + throw new YztException("文件目录创建失败..."); + } + } + // 判断这个文件是否存在,不存在就创建 + file = new File(filePath); + if (!file.exists()) { + if (!file.createNewFile()) { + throw new YztException("目标文件创建失败..."); + } + } + return file; + } + + /** + * 生成文件文件名 + * @param fileName 文件名 + * @author Mr.Zhang + * @since 2020-05-08 + */ + public static String getDestPath(String fileName) { + //规则: 子目录/年/月/日.后缀名 + return getServerPath() + fileName; + } + + public static String fileName(String extName){ + return YztUtil.getUuid() + RandomUtil.randomString(10) + "." + extName; + } + + /** + * 生成文件在的实际的路径 + * @author Mr.Zhang + * @since 2020-05-08 + */ + public static String getServerPath() { + // 文件分隔符转化为当前系统的格式 + return FilenameUtils.separatorsToSystem( getRootPath() + getWebPath()); + } + + /** + * web目录可访问的路径 + * @author Mr.Zhang + * @since 2020-05-08 + */ + public static String getWebPath() { + // 文件分隔符转化为当前系统的格式 + return getModelPath() + YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE).replace("-", "/") + "/"; + +// return getType() + getModelPath() + DateUtil.nowDate(Constants.DATE_FORMAT_DATE).replace("-", "/") + "/"; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/UploadWeChatMediaUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/UploadWeChatMediaUtil.java new file mode 100644 index 0000000..1996509 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/UploadWeChatMediaUtil.java @@ -0,0 +1,92 @@ +package com.yzt.common.utils; + + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.exception.YztException; +import org.apache.http.HttpEntity; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.mime.MultipartEntityBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * http通用工具类 + * + */ +public class UploadWeChatMediaUtil { + /** + * 把文件上传到指定url上去 + * @param url 上传地址 + * @param file 待上传文件 + */ + public static JSONObject uploadFile(String url, InputStream file, String fileName) throws IOException { + CloseableHttpClient httpclient = HttpClients.createDefault(); + try { + HttpPost httppost = new HttpPost(url); + + RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000).build(); + httppost.setConfig(requestConfig); + + /** + * 这一步最关键: + *调用addBinaryBody("media",input2byte(file),ContentType.DEFAULT_BINARY, fileName), + * fileName可以为任意值,但不能为null,如果为null则上传失败。 + * input2byte(file):把inputstream转为byte[], + * 如果直接调用addPart用FileBody做参数,则MultifilePart不好转换; + * 如果直接调用addPart用InpustreamBody做参数,则因为没有fileName会造成上传失败 + */ + HttpEntity reqEntity = MultipartEntityBuilder.create() + .addBinaryBody("media", input2byte(file), ContentType.DEFAULT_BINARY, + fileName).build(); + + httppost.setEntity(reqEntity); + CloseableHttpResponse response = httpclient.execute(httppost); + try { + System.out.println(response.getStatusLine()); + HttpEntity resEntity = response.getEntity(); + if (resEntity != null) { + String responseEntityStr = EntityUtils.toString(response.getEntity()); + return JSONObject.parseObject(responseEntityStr); + } + EntityUtils.consume(resEntity); + }catch (Exception e){ + e.printStackTrace(); + throw new YztException(e.getMessage()); + }finally { + response.close(); + } + } catch (IOException e) { + e.printStackTrace(); + throw new YztException(e.getMessage()); + } finally { + try { + httpclient.close(); + } catch (IOException e) { + throw new YztException(e.getMessage()); + } + } + + return null; + } + + + private static byte[] input2byte(InputStream inStream) + throws IOException { + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + byte[] buff = new byte[100]; + int rc = 0; + while ((rc = inStream.read(buff, 0, 100)) > 0) { + swapStream.write(buff, 0, rc); + } + return swapStream.toByteArray(); + } +} + diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/UrlUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/UrlUtil.java new file mode 100644 index 0000000..8555040 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/UrlUtil.java @@ -0,0 +1,72 @@ +package com.yzt.common.utils; + +import java.util.HashMap; +import java.util.Map; + +/** + * url 工具类 + * fw_ + */ +public class UrlUtil { + public static class UrlEntity { + /** + * 基础url + */ + public String baseUrl; + /** + * url参数 + */ + public Map params; + } + + /** + * 解析url + * + * @param url + * @return + */ + public static UrlEntity parse(String url) { + UrlEntity entity = new UrlEntity(); + if (url == null) { + return entity; + } + url = url.trim(); + if (url.equals("")) { + return entity; + } + String[] urlParts = url.split("\\?"); + entity.baseUrl = urlParts[0]; + //没有参数 + if (urlParts.length == 1) { + return entity; + } + //有参数 + String[] params = urlParts[1].split("&"); + entity.params = new HashMap<>(); + for (String param : params) { + String[] keyValue = param.split("="); + if (keyValue.length > 1) { + entity.params.put(keyValue[0], keyValue[1]); + } + } + + return entity; + } + + public static String getParamsByKey(String url,String key){ + UrlEntity entity = parse(url); + return entity.params.get(key); + } + + /** + * 测试 + * + * @param args + */ + public static void main(String[] args) { + UrlEntity entity = parse(null); + entity = parse("http://www.123.com?id=1&name=小明"); + System.out.println(entity.baseUrl + "\n" + entity.params); + System.out.println(entity.params.get("id")); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/ValidateCodeUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/ValidateCodeUtil.java new file mode 100644 index 0000000..ac1d4ff --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/ValidateCodeUtil.java @@ -0,0 +1,199 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.druid.util.Base64; +import org.springframework.stereotype.Component; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.util.Random; + +/** + * 验证码生成工具类 + * + */ +@Component +public class ValidateCodeUtil { + private static Validate validate = null; //验证码类,用于最后返回此对象,包含验证码图片base64和真值 + private static Random random = new Random(); //随机类,用于生成随机参数 + private static String randString = "0123456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";//随机生成字符串的取值范围 + + private static int width = 80; //图片宽度 + private static int height = 34; //图片高度 + private static int stringNum = 4; //字符的数量 + private static int lineSize = 40; //干扰线数量 + + /** + * 将构造函数私有化 禁止new创建 + * @author Mr.Zhang + * @since 2020-04-16 + */ + private ValidateCodeUtil() { + super(); + } + + /** + * 获取随机字符 + * @author Mr.Zhang + * @since 2020-04-16 + * @return String + */ + private static String getRandomChar(int index) { + //获取指定位置index的字符,并转换成字符串表示形式 + return String.valueOf(randString.charAt(index)); + } + + /** + * 获取随机指定区间的随机数 + * @param min (指定最小数) + * @param max (指定最大数) + * @author Mr.Zhang + * @since 2020-04-16 + * @return String + */ + private static int getRandomNum(int min,int max) { + return RandomUtil.randomInt(min, max); + } + + /** + * 获得字体 + */ + private static Font getFont() { + return new Font("Fixedsys", Font.CENTER_BASELINE, 25); //名称、样式、磅值 + } + + /** + * 获得颜色 + * @param frontColor 覆盖颜色 + * @param backColor 背景色 + * @author Mr.Zhang + * @since 2020-04-16 + * @return Color + */ + private static Color getRandColor(int frontColor, int backColor) { + if(frontColor > 255) + frontColor = 255; + if(backColor > 255) + backColor = 255; + + int red = frontColor + random.nextInt(backColor - frontColor - 16); + int green = frontColor + random.nextInt(backColor - frontColor -14); + int blue = frontColor + random.nextInt(backColor - frontColor -18); + return new Color(red, green, blue); + } + + /** + * 绘制字符串,返回绘制的字符串 + * @param graphics 获得BufferedImage对象的Graphics对象 + * @param randomString 随机字符串 + * @param i 坐标倍数 + * @author Mr.Zhang + * @since 2020-04-16 + * @return string + */ + private static String drawString(Graphics graphics, String randomString, int i) { + Graphics2D g2d = (Graphics2D) graphics; + g2d.setFont(getFont()); //设置字体 + g2d.setColor(new Color(random.nextFloat(), random.nextFloat(), random.nextFloat()));//设置颜色 + String randChar = getRandomChar(random.nextInt(randString.length())); + randomString += randChar; //组装 + int rot = getRandomNum(1,10); + g2d.translate(random.nextInt(3), random.nextInt(3)); + g2d.rotate(rot * Math.PI / 180); + g2d.drawString(randChar, 13*i, 20); + g2d.rotate(-rot * Math.PI / 180); + return randomString; + } + + /** + * 绘制干扰线 + * @param graphics 获得BufferedImage对象的Graphics对象 + * @author Mr.Zhang + * @since 2020-04-16 + */ + private static void drawLine(Graphics graphics) { + //起点(x,y) 偏移量x1、y1 + int x = random.nextInt(width); + int y = random.nextInt(height); + int xl = random.nextInt(13); + int yl = random.nextInt(15); + graphics.setColor(new Color(random.nextFloat(), random.nextFloat(), random.nextFloat())); + graphics.drawLine(x, y, x + xl, y + yl); + } + + /** + * 生成Base64图片验证码 + * @author Mr.Zhang + * @since 2020-04-16 + * @return String + */ + public static Validate getRandomCode() { + validate = validate == null ? new Validate() : validate; + + // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); + Graphics Graphics = image.getGraphics();// 获得BufferedImage对象的Graphics对象 + Graphics.fillRect(0, 0, width, height);//填充矩形 + Graphics.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//设置字体 + Graphics.setColor(getRandColor(110, 133));//设置颜色 + //绘制干扰线 + for(int i = 0; i <= lineSize; i++) { + drawLine(Graphics); + } + //绘制字符 + String randomString = ""; + for(int i = 1; i <= stringNum; i++) { + randomString = drawString(Graphics, randomString, i); + validate.setValue(randomString); + } + + Graphics.dispose();//释放绘图资源 + ByteArrayOutputStream bs = null; + try { + bs = new ByteArrayOutputStream(); + ImageIO.write(image, "png", bs);//将绘制得图片输出到流 + String imgSrc = Base64.byteArrayToBase64(bs.toByteArray()); + validate.setBase64Str(imgSrc); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + bs.close(); + } catch (IOException e) { + e.printStackTrace(); + }finally{ + bs = null; + } + } + return validate; + } + + /** + * 验证码类 + * @author Mr.Zhang + * @since 2020-04-16 + */ + public static class Validate implements Serializable{ + private static final long serialVersionUID = 1L; + private String Base64Str; //Base64 值 + private String value; //验证码值 + + public String getBase64Str() { + return Base64Str; + } + public void setBase64Str(String base64Str) { + Base64Str = base64Str; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/ValidateFormUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/ValidateFormUtil.java new file mode 100644 index 0000000..3e9a880 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/ValidateFormUtil.java @@ -0,0 +1,209 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.ReUtil; +import com.yzt.common.constants.RegularConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.regex.Pattern; + +/** + * 表单验证类 + * + */ +public class ValidateFormUtil { + /** + * 检测类型 + * @param systemConfig SystemConfig 需要验证的类 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void checkType(SystemConfig systemConfig, String rule){ + if(StringUtils.isBlank(rule)){ + return; + } + + //required:true,min:0,max:100,number:true + List list = YztUtil.stringToArrayStr(rule); + + for (String value : list) { + List val = YztUtil.stringToArrayStrRegex(value, ":"); + + ////必填 + if(val.get(0).equals("required") && val.get(1).equals("true")){ + isRequire(systemConfig.getValue(), systemConfig.getTitle()); + continue; + } + + //数字 + if(val.get(0).equals("number") && val.get(1).equals("true")){ + isNumber(systemConfig.getValue(), systemConfig.getTitle()); + continue; + } + + //最大值 + if(val.get(0).equals("max")){ + isNumber(systemConfig.getValue(), systemConfig.getTitle()); + continue; + } + + //最小值 + if(val.get(0).equals("min")){ + isNumber(systemConfig.getValue(), systemConfig.getTitle()); + continue; + } + + //邮箱 + if(val.get(0).equals("email") && val.get(1).equals("true")){ + isEmail(systemConfig.getValue(), systemConfig.getTitle()); + continue; + } + + //手机 + if(val.get(0).equals("phone") && val.get(1).equals("true")){ + isPhone(systemConfig.getValue(), systemConfig.getTitle()); + } + } + } + + /** + * 邮箱 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void isEmail(String value, String info) { + regularException(value, info, RegularConstants.EMAIL, "邮箱"); + } + + /** + * 手机 + * @param value String 值 + * @param info String 字段名 + */ + public static void isPhone(String value, String info) { + regularException(value, info, RegularConstants.PHONE_TWO, "手机"); + } + + /** + * 验证必填 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void isRequire(String value, String info){ + if(StringUtils.isBlank(value) ){ + throw new YztException("请填写/选择" + info); + } + } + + /** + * 数字验证 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void isNumber(String value, String info){ + regularException(value, info, RegularConstants.NUMBER, "数字"); + } + + /** + * 数字范围 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void range(String value, String info, Integer max, Integer min){ + isNumber(value, info); + max(value, info, max); + min(value, info, min); + } + + /** + * 最大数值 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void max(String value, String info, Integer max){ + isNumber(value, info); + int number = Integer.parseInt(value); + if(number > max ){ + throw new YztException(info + "不在取值范围内,最大不能大于" + max); + } + } + + /** + * 最小数值 + * @param value String 值 + * @param info String 字段名 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void min(String value, String info, Integer min){ + isNumber(value, info); + int number = Integer.parseInt(value); + if(number > min ){ + throw new YztException(info + "不在取值范围内,最小不能小于" + min); + } + } + + /** + * 正则表达式验证 + * @param value String 值 + * @param info String 字段名 + * @param regular String 正则表达式 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static void regularException(String value, String info, String regular, String title){ + if(!regular(value, info, regular)){ + //正则验证 + throw new YztException(info + " 格式必须为 " + title); + } + } + + /** + * 正则表达式验证 + * @param value String 值 + * @param info String 字段名 + * @param regular String 正则表达式 + * @author Mr.Zhang + * @since 2020-05-11 + */ + public static boolean regular(String value, String info, String regular){ + isRequire(value, info); + Pattern pattern = Pattern.compile(regular); + return pattern.matcher(value).matches(); + } + + /** + * 校验是否是手机号,不是则抛出异常 + * @param phone 手机号 + * @param errMsg 异常内容 + */ + public static void isPhoneException(String phone, String errMsg) { + boolean match = ReUtil.isMatch(RegularConstants.PHONE_TWO, phone); + if (!match) { + throw new YztException(errMsg); + } + } + + /** + * 校验是否是手机号,不是则抛出异常 + * @param phone 手机号 + */ + public static void isPhoneException(String phone) { + boolean match = ReUtil.isMatch(RegularConstants.PHONE_TWO, phone); + if (!match) { + throw new YztException("请输入正确的手机号"); + } + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/WXPayXmlUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/WXPayXmlUtil.java new file mode 100644 index 0000000..4c5b7f7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/WXPayXmlUtil.java @@ -0,0 +1,31 @@ +package com.yzt.common.utils; + +import org.w3c.dom.Document; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +/** + * 微信支付xml工具类 + * fw_ + */ +public final class WXPayXmlUtil { + public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + documentBuilderFactory.setXIncludeAware(false); + documentBuilderFactory.setExpandEntityReferences(false); + + return documentBuilderFactory.newDocumentBuilder(); + } + + public static Document newDocument() throws ParserConfigurationException { + return newDocumentBuilder().newDocument(); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/WxPKCS7Encoder.java b/fightwine-common/src/main/java/com/yzt/common/utils/WxPKCS7Encoder.java new file mode 100644 index 0000000..864a47d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/WxPKCS7Encoder.java @@ -0,0 +1,64 @@ +package com.yzt.common.utils; + +import java.nio.charset.Charset; +import java.util.Arrays; + +/** + * 微信小程序加解密 + * fw_ + */ +public class WxPKCS7Encoder { + + private static final Charset CHARSET = Charset.forName("utf-8"); + private static final int BLOCK_SIZE = 32; + + /** + * 获得对明文进行补位填充的字节. + * + * @param count + * 需要进行填充补位操作的明文字节个数 + * @return 补齐用的字节数组 + */ + public static byte[] encode(int count) { + // 计算需要填充的位数 + int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE); + if (amountToPad == 0) { + amountToPad = BLOCK_SIZE; + } + // 获得补位所用的字符 + char padChr = chr(amountToPad); + String tmp = new String(); + for (int index = 0; index < amountToPad; index++) { + tmp += padChr; + } + return tmp.getBytes(CHARSET); + } + + /** + * 删除解密后明文的补位字符 + * + * @param decrypted + * 解密后的明文 + * @return 删除补位字符后的明文 + */ + public static byte[] decode(byte[] decrypted) { + int pad = decrypted[decrypted.length - 1]; + if (pad < 1 || pad > 32) { + pad = 0; + } + return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad); + } + + /** + * 将数字转化成ASCII码对应的字符,用于对明文进行补码 + * + * @param a + * 需要转化的数字 + * @return 转化得到的字符 + */ + public static char chr(int a) { + byte target = (byte) (a & 0xFF); + return (char) target; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/WxPayUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/WxPayUtil.java new file mode 100644 index 0000000..cb31da2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/WxPayUtil.java @@ -0,0 +1,217 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.CreateOrderRequestVo; +import com.yzt.common.vo.WxRefundVo; +import org.apache.commons.codec.digest.DigestUtils; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * 微信支付工具类 + * fw_ + */ +public class WxPayUtil { + + /** + * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。 + * + * @param xmlStr API返回的XML格式数据 + * @return Map类型数据 + * @throws Exception + */ + public static HashMap processResponseXml(String xmlStr) throws Exception { + String RETURN_CODE = "return_code"; + String return_code; + HashMap respData = XmlUtil.xmlToMap(xmlStr); + if (respData.containsKey(RETURN_CODE)) { + return_code = (String) respData.get(RETURN_CODE); + } else { + throw new YztException(String.format("No `return_code` in XML: %s", xmlStr)); + } + + if (return_code.equals(Constants.FAIL)) { + return respData; + } else if (return_code.equals(Constants.SUCCESS)) { + return respData; + } else { + throw new YztException(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr)); + } + } + + /** + * 获取随机字符串,长度要求在32位以内。 + */ + public static String getNonceStr() { + return DigestUtils.md5Hex(YztUtil.getUuid() + YztUtil.randomCount(111111, 666666)); + } + + /** + * 获取sign + * @param vo 微信公共下单对象 + * @param signKey 微信签名key + * @return String + */ + public static String getSign(CreateOrderRequestVo vo, String signKey) { + // 对象转map + Map map = JSONObject.parseObject(JSONObject.toJSONString(vo), Map.class); + // map排序 + Set keySet = map.keySet(); + String[] keyArray = keySet.toArray(new String[keySet.size()]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(PayConstants.FIELD_SIGN)) { + continue; + } + if (ObjectUtil.isNotNull(map.get(k))) // 参数值为空,则不参与签名 + sb.append(k).append("=").append(map.get(k)).append("&"); + } + sb.append("key=").append(signKey); + String sign = SecureUtil.md5(sb.toString()).toUpperCase(); + System.out.println("sign ========== " + sign); + return sign; + } + + /** + * 获取sign + * @param wxRefundVo 微信退款对象 + * @param signKey 微信签名key + * @return String + */ + public static String getSign(WxRefundVo wxRefundVo, String signKey) { + // 对象转map + Map map = JSONObject.parseObject(JSONObject.toJSONString(wxRefundVo), Map.class); + // map排序 + Set keySet = map.keySet(); + String[] keyArray = keySet.toArray(new String[keySet.size()]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(PayConstants.FIELD_SIGN)) { + continue; + } + if (ObjectUtil.isNotNull(map.get(k))) // 参数值为空,则不参与签名 + sb.append(k).append("=").append(map.get(k)).append("&"); + } + sb.append("key=").append(signKey); + String sign = SecureUtil.md5(sb.toString()).toUpperCase(); + System.out.println("sign ========== " + sign); + return sign; + } + + /** + * 获取sign + * @param map 待签名数据 + * @param signKey 微信签名key + * @return String + */ + public static String getSign(Map map, String signKey) { + // map排序 + Set keySet = map.keySet(); + String[] keyArray = keySet.toArray(new String[keySet.size()]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(PayConstants.FIELD_SIGN)) { + continue; + } + if (StrUtil.isNotBlank(map.get(k)) && map.get(k).trim().length() > 0) // 参数值为空,则不参与签名 + sb.append(k).append("=").append(map.get(k).trim()).append("&"); + } + sb.append("key=").append(signKey); + String sign = SecureUtil.md5(sb.toString()).toUpperCase(); + System.out.println("sign ========== " + sign); + return sign; + } + + /** + * 获取sign + * @param map 待签名数据 + * @param signKey 微信签名key + * @return String + */ + public static String getSignObject(Map map, String signKey) { + // map排序 + Set keySet = map.keySet(); + String[] keyArray = keySet.toArray(new String[keySet.size()]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(PayConstants.FIELD_SIGN)) { + continue; + } + if (ObjectUtil.isNotNull(map.get(k))) // 参数值为空,则不参与签名 + sb.append(k).append("=").append(map.get(k)).append("&"); + } + sb.append("key=").append(signKey); + String sign = SecureUtil.md5(sb.toString()).toUpperCase(); + System.out.println("sign ========== " + sign); + return sign; + } + + /** + * 获取当前时间戳,单位秒 + * @return Long + */ + public static Long getCurrentTimestamp() { + return System.currentTimeMillis()/1000; + } + + /** + * 获取当前时间戳,单位毫秒 + * @return Long + */ + public static Long getCurrentTimestampMs() { + return System.currentTimeMillis(); + } + + /** + * XML格式字符串转换为Map + * + * @param strXML XML字符串 + * @return XML数据转换后的Map + * @throws Exception + */ + public static Map xmlToMap(String strXML) throws Exception { + try { + Map data = new HashMap(); + DocumentBuilder documentBuilder = WXPayXmlUtil.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) { + System.out.println(StrUtil.format("Invalid XML, can not convert to map. Error message: {}. XML content: {}", ex.getMessage(), strXML)); + throw ex; + } + + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/WxUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/WxUtil.java new file mode 100644 index 0000000..a4c6d5e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/WxUtil.java @@ -0,0 +1,59 @@ +package com.yzt.common.utils; + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.exception.YztException; +import org.apache.commons.codec.binary.Base64; + +/** + * 微信工具类 + * fw_ + */ +public class WxUtil { + + private static final String WATERMARK = "watermark"; + private static final String APPID = "appid"; + /** + * 解密数据 + * @return + * @throws Exception + */ + public static String decrypt(String appId, String encryptedData, String sessionKey, String iv){ + String result = ""; + try { + AESUtil aes = new AESUtil(); + byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv)); + if(null != resultByte && resultByte.length > 0){ + result = new String(WxPKCS7Encoder.decode(resultByte)); + JSONObject jsonObject = JSONObject.parseObject(result); + String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString(APPID); + if(!appId.equals(decryptAppid)){ + result = ""; + } + } + } catch (Exception e) { + result = ""; + e.printStackTrace(); + } + return result; + } + + /** + * 检测结构请求返回的数据 + * @param result 接口返回的结果 + * @return JSONObject + */ + public static JSONObject checkResult(JSONObject result){ + if(ObjectUtil.isNull(result)){ + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if(result.containsKey("errcode") && result.getString("errcode").equals("0")){ + return result; + } + if(result.containsKey("errmsg")){ + throw new YztException("微信接口调用失败:" + result.getString("errcode") + result.getString("errmsg")); + } + return result; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/XmlUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/XmlUtil.java new file mode 100644 index 0000000..be936b6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/XmlUtil.java @@ -0,0 +1,153 @@ +package com.yzt.common.utils; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.io.naming.NoNameCoder; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; +import org.apache.commons.lang3.StringUtils; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import javax.servlet.http.HttpServletRequest; +import javax.xml.parsers.DocumentBuilder; +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.IOException; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * XML 工具类 + * + */ +public class XmlUtil { + public static Map xmlToMap(HttpServletRequest request) { + Map map = new HashMap<>(); + SAXReader reader = new SAXReader(); + + InputStream in = null; + try { + in = request.getInputStream(); + Document doc = reader.read(in); + Element root = doc.getRootElement(); + List list = root.elements(); + for (Element element : list) { + map.put(element.getName(), element.getText()); + } + } catch (IOException | DocumentException e) { + e.printStackTrace(); + } finally { + try { + assert in != null; + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return map; + } + + /** + * 将发送消息封装成对应的xml格式 + */ +// public static HashMap xmlToMap(String strxml) throws Exception { +// strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\""); +// +// HashMap map = new HashMap<>(); +// SAXReader reader = new SAXReader(); +// InputStream inputStream = new ByteArrayInputStream(strxml.getBytes(StandardCharsets.UTF_8)); +// +// if (StringUtils.isBlank(strxml)) { +// return null; +// } +// +// Document document = reader.read(inputStream); +// Element root = document.getRootElement(); +// List list = root.elements(); +// +// for (Element e : list) { +// map.put(e.getName(), e.getText()); +// } +// inputStream.close(); +// +// return map; +// } + + public static HashMap xmlToMap(String strxml) { + strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\""); + + if (StringUtils.isBlank(strxml)) { + return null; + } + HashMap map = new HashMap<>(); + try { + DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder(); + org.w3c.dom.Document document = documentBuilder.parse(new InputSource(new StringReader(strxml))); + org.w3c.dom.Element element = document.getDocumentElement(); + NodeList nodeList = element.getChildNodes(); + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + map.put(node.getNodeName(), node.getTextContent()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + /** + * 将发送消息封装成对应的xml格式 + */ + public static String objectToXml(Object object) { + XStream xstream = new XStream(new Xpp3Driver(new NoNameCoder())); //不需要转义 + xstream.alias("xml", object.getClass()); + return xstream.toXML(object); + } + + /** + * 将Map转换为XML格式的字符串 + * + * @param data Map类型数据 + * @return XML格式的字符串 + * @throws Exception + */ + public static String mapToXml(Map data) throws Exception { + org.w3c.dom.Document document = WXPayXmlUtil.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", ""); + writer.close(); + return output; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/YztDateUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/YztDateUtil.java new file mode 100644 index 0000000..fb2b427 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/YztDateUtil.java @@ -0,0 +1,734 @@ +package com.yzt.common.utils; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.DateConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.DateLimitUtilVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Date工具类 + * + **/ +public final class YztDateUtil { + + private static final Logger LOGGER = LoggerFactory.getLogger(YztDateUtil.class); + + private YztDateUtil() { + throw new IllegalStateException("Utility class"); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nowDate() { + return nowDate(DateConstants.DATE_FORMAT_NUM); + } + + /** + * 获取当前年,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nowYear() { + Calendar cal = Calendar.getInstance(); + return cal.get(Calendar.YEAR) + ""; + } + + /** + * 获取上一年,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String lastYear() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.YEAR, -1); + return cal.get(Calendar.YEAR) + ""; + } + + /** + * 获取下一年,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nextYear() { + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.YEAR, +1); + return cal.get(Calendar.YEAR) + ""; + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static Date nowDateTime() { + return strToDate(nowDateTimeStr(), DateConstants.DATE_FORMAT); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nowDateTimeStr() { + return nowDate(DateConstants.DATE_FORMAT); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nowDate(String DATE_FORMAT) { + SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT); + return dft.format(new Date()); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static String nowDateTime(String DATE_FORMAT) { + SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT); + return dft.format(new Date()); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static Integer getNowTime() { + long t = (System.currentTimeMillis() / 1000L); + return Integer.parseInt(String.valueOf(t)); + } + + /** + * 获取当前时间戳(秒级) + * + * @return + */ + public static Long getTime() { + return (System.currentTimeMillis() / 1000L); + } + + /** + * 获取当前日期,指定格式 + * 描述:<描述函数实现的功能>. + * + * @return + */ + public static Date nowDateTimeReturnDate(String DATE_FORMAT) { + SimpleDateFormat dft = new SimpleDateFormat(DATE_FORMAT); + return strToDate(dft.format(new Date()), DATE_FORMAT); + } + + /** + * convert a date to string in a specifies fromat. + * + * @param date + * @param DATE_FORMAT + * @return + */ + public static String dateToStr(Date date, String DATE_FORMAT) { + if (date == null) { + return null; + } + SimpleDateFormat myFormat = new SimpleDateFormat(DATE_FORMAT); + return myFormat.format(date); + } + + /** + * parse a String to Date in a specifies fromat. + * + * @param dateStr + * @param DATE_FORMAT + * @return + * @throws ParseException + */ + public static Date strToDate(String dateStr, String DATE_FORMAT) { + SimpleDateFormat myFormat = new SimpleDateFormat(DATE_FORMAT); + try { + return myFormat.parse(dateStr); + } catch (ParseException e) { + return null; + } + } + + + /** + * date add Second + * + * @param date + * @param num + * @return + */ + public static Date addSecond(Date date, int num) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.SECOND, num); + return calendar.getTime(); + } + + /** + * date add Second return String + * + * @param date + * @param num + * @return + */ + public static String addSecond(Date date, int num, String DATE_FORMAT) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.SECOND, num); + return dateToStr(calendar.getTime(), DATE_FORMAT); + } + + /** + * 指定日期加上天数后的日期 + * + * @param num 为增加的天数 + * @param newDate 创建时间 + * @return + */ + public static final String addDay(String newDate, int num, String pattern) { + SimpleDateFormat format = new SimpleDateFormat(pattern); + try { + Date currdate = format.parse(newDate); + Calendar ca = Calendar.getInstance(); + ca.setTime(currdate); + ca.add(Calendar.DATE, num); + return format.format(ca.getTime()); + } catch (ParseException e) { + LOGGER.error("转化时间出错,", e); + return null; + } + } + + /** + * 指定日期加上天数后的日期 + * + * @param num 为增加的天数 + * @param newDate 创建时间 + * @return + */ + public static final String addDay(Date newDate, int num, String pattern) { + SimpleDateFormat format = new SimpleDateFormat(pattern); + Calendar ca = Calendar.getInstance(); + ca.setTime(newDate); + ca.add(Calendar.DATE, num); + return format.format(ca.getTime()); + } + + /** + * convert long to date + * + * @param date 待转换时间戳 + * @return 转换后时间 + */ + public static Date timeStamp11ToDate(Integer date) { + return new Date(date); + } + + /** + * convert long to date string + * + * @param date 待转换时间戳 + * @param DATE_FORMAT 格式化时间 + * @return 格式化后的时间 + */ + public static String timeStamp11ToDate(Integer date, String DATE_FORMAT) { + return dateToStr(new Date(date), DATE_FORMAT); + } + + /** + * compare two date String with a pattern + * + * @param date1 开始时间 + * @param date2 结束时间 + * @param pattern 时间格式 + * @return 1=D1大 ,-1=D2大,0=相等 + */ + public static int compareDate(String date1, String date2, String pattern) { + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(pattern); + try { + Date dt1 = DATE_FORMAT.parse(date1); + Date dt2 = DATE_FORMAT.parse(date2); + if (dt1.getTime() > dt2.getTime()) { + return 1; + } else if (dt1.getTime() < dt2.getTime()) { + return -1; + } else { + return 0; + } + + } catch (ParseException e) { + e.printStackTrace(); + return 0; + } + } + + /** + * 检查日期格式是否合法 + * + * @param date + * @param style + * @return + */ + public static boolean checkDateFormat(String date, String style) { + SimpleDateFormat DATE_FORMAT = new SimpleDateFormat(style); + try { + // 设置lenient为false. + // 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01 + DATE_FORMAT.setLenient(false); + DATE_FORMAT.parse(date); + return true; + } catch (ParseException e) { + return false; + } + } + + /** + * 计算两个时间之间的天数差 + * + * @param beforeDay 开始时间 + * @param afterDay 结束时间 + * @return 相差天数 + */ + public static long getTwoDateDays(Date beforeDay, Date afterDay) { + SimpleDateFormat sm = new SimpleDateFormat(DateConstants.DATE_FORMAT_NUM); + long days = -1; + try { + days = (sm.parse(sm.format(afterDay)).getTime() - sm.parse(sm.format(beforeDay)).getTime()) / (1000 * 3600 * 24); + } catch (Exception e) { + e.printStackTrace(); + } + + return days; + } + + + //获取时间戳11位 + public static int getSecondTimestamp(Date date) { + if (null == date) { + return 0; + } + String timestamp = String.valueOf(date.getTime() / 1000); + return Integer.parseInt(timestamp); + } + + //获取时间戳11位 + public static int getSecondTimestamp(String date) { + if (null == date) { + return 0; + } + Date date1 = strToDate(date, DateConstants.DATE_FORMAT); + if (date1 == null) { + return 0; + } + String timestamp = String.valueOf(date1.getTime() / 1000); + return Integer.parseInt(timestamp); + } + + //获取时间戳10位 + public static int getSecondTimestamp(Long timeMillis) { + if (null == timeMillis) { + return 0; + } + String timestamp = String.valueOf(timeMillis / 1000); + return Integer.parseInt(timestamp); + } + + //获取时间戳11位 + public static int getSecondTimestamp() { + Date date = strToDate(nowDateTime(DateConstants.DATE_FORMAT), DateConstants.DATE_FORMAT); + if (null == date) { + return 0; + } + String timestamp = String.valueOf(date.getTime() / 1000); + return Integer.parseInt(timestamp); + } + + /** + * 获得昨天日期:yyyy-MM-dd HH:mm:ss + */ + public static String getYesterdayStr() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.DATE, -1); + SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return startSdf.format(c.getTime()); + } + + /** + * 获得本周第一天:yyyy-MM-dd HH:mm:ss + */ + public static String getWeekStartDay() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.WEEK_OF_MONTH, 0); + c.set(Calendar.DAY_OF_WEEK, 2); + SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00"); + return startSdf.format(c.getTime()); + } + + /** + * 获得本周最后一天:yyyy-MM-dd HH:mm:ss + */ + public static String getWeekEndDay() { + return addDay(getWeekStartDay(), 7, DateConstants.DATE_FORMAT); + } + + /** + * 获得上周第一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastWeekStartDay() { + return addDay(getWeekStartDay(), -7, DateConstants.DATE_FORMAT); + } + + /** + * 获得上周最后一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastWeekEndDay() { + return addDay(getLastWeekStartDay(), 7, DateConstants.DATE_FORMAT); + } + + /** + * 获得本月最后一天:yyyy-MM-dd HH:mm:ss + */ + public static String getMonthEndDay() { + Calendar c = Calendar.getInstance(); + c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); + SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59"); + return endSdf.format(c.getTime()); + } + + /** + * 获得上月第一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastMonthStartDay() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.MONTH, -1); + c.set(Calendar.DAY_OF_MONTH, 1); + SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-MM-01 00:00:00"); + return startSdf.format(c.getTime()); + } + + /** + * 获得上月最后一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastMonthEndDay() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.MONTH, -1); + c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); + SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59"); + return endSdf.format(c.getTime()); + } + + /** + * 获得上年第一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastYearStartDay() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.YEAR, -1); + SimpleDateFormat startSdf = new SimpleDateFormat("yyyy-01-01 00:00:00"); + return startSdf.format(c.getTime()); + } + + /** + * 获得上年最后一天:yyyy-MM-dd HH:mm:ss + */ + public static String getLastYearEndDay() { + Calendar c = Calendar.getInstance(); + c.add(Calendar.YEAR, -1); + SimpleDateFormat endSdf = new SimpleDateFormat("yyyy-12-31 23:59:59"); + return endSdf.format(c.getTime()); + } + + /** + * 计算时间范围 + * + * @param data string 类型 + * @return dateLimitUtilVo + * @since 2020-05-06 + */ + public static DateLimitUtilVo getDateLimit(String data) { + //时间计算 + String startTime = null; + String endTime = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT); + String day = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT_START); + String end = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT_END); + + if (StrUtil.isNotBlank(data)) { + switch (data) { + case DateConstants.SEARCH_DATE_DAY: + startTime = day; + break; + case DateConstants.SEARCH_DATE_YESTERDAY: + startTime = YztDateUtil.addDay(day, -1, DateConstants.DATE_FORMAT_START); + endTime = YztDateUtil.addDay(end, -1, DateConstants.DATE_FORMAT_END); + break; + case DateConstants.SEARCH_DATE_LATELY_7: + startTime = YztDateUtil.addDay(day, -6, DateConstants.DATE_FORMAT_START); + break; + case DateConstants.SEARCH_DATE_WEEK: + startTime = getWeekStartDay(); + endTime = getWeekEndDay(); + break; + case DateConstants.SEARCH_DATE_PRE_WEEK: + startTime = getLastWeekStartDay(); + endTime = getLastWeekEndDay(); + break; + case DateConstants.SEARCH_DATE_LATELY_30: + startTime = YztDateUtil.addDay(day, -30, DateConstants.DATE_FORMAT_START); + break; + case DateConstants.SEARCH_DATE_LATELY_90: + startTime = YztDateUtil.addDay(day, -90, DateConstants.DATE_FORMAT_START); + break; + case DateConstants.SEARCH_DATE_LATELY_180: + startTime = YztDateUtil.addDay(day, -180, DateConstants.DATE_FORMAT_START); + break; + case DateConstants.SEARCH_DATE_MONTH: + startTime = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT_MONTH_START); + endTime = getMonthEndDay(); + break; + case DateConstants.SEARCH_DATE_PRE_MONTH: + startTime = getLastMonthStartDay(); + endTime = getLastMonthEndDay(); + break; + case DateConstants.SEARCH_DATE_YEAR: + startTime = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT_YEAR_START); + endTime = YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT_YEAR_END); + break; + case DateConstants.SEARCH_DATE_PRE_YEAR: + startTime = getLastYearStartDay(); + endTime = getLastYearEndDay(); + break; + default: + List list = YztUtil.stringToArrayStr(data); + if (list.size() == 1) { + throw new YztException("选择时间参数格式错误,请在 " + + DateConstants.SEARCH_DATE_DAY + "|" + + DateConstants.SEARCH_DATE_YESTERDAY + "|" + + DateConstants.SEARCH_DATE_LATELY_7 + "|" + + DateConstants.SEARCH_DATE_LATELY_30 + "|" + + DateConstants.SEARCH_DATE_MONTH + "|" + + DateConstants.SEARCH_DATE_YEAR + "|自定义时间范围(格式:yyyy-MM-dd HH:mm:ss,两个时间范围用逗号分割)"); + } + startTime = list.get(0); + endTime = list.get(1); + +// if (startTime.equals(endTime)) { + startTime = YztDateUtil.appointedDayStrToFormatStr(startTime, DateConstants.DATE_FORMAT_DATE, DateConstants.DATE_FORMAT_START); + endTime = YztDateUtil.appointedDayStrToFormatStr(endTime, DateConstants.DATE_FORMAT_DATE, DateConstants.DATE_FORMAT_END); +// } + break; + } + } + return new DateLimitUtilVo(startTime, endTime); + } + + /** + * 计算月时间范围 + * + * @param data string 时间祖父穿 + * @return dateLimitUtilVo + */ + public static DateLimitUtilVo getMonthLimit(String data) { + List monthList = YztUtil.stringToArrayStr(data); + if (monthList.size() != 2) { + throw new YztException("选择时间参数格式错误范围(格式:yyyy-MM,两个时间范围用逗号分割)"); + } + String startMonth = monthList.get(0); + String endMonth = monthList.get(1); + if (!isValidMonth(startMonth) || !isValidMonth(endMonth)) { + throw new YztException("时间参数格式错误,格式yyyy-MM"); + } + return new DateLimitUtilVo(startMonth, endMonth); + } + + /** + * 校验是否是年-月格式 + * + * @param month 月份:年-月 + * @return boolean + */ + public static boolean isValidMonth(String month) { + SimpleDateFormat format = new SimpleDateFormat(DateConstants.DATE_FORMAT_MONTH); + ParsePosition pos = new ParsePosition(0); + format.setLenient(false); + Date result = format.parse(month, pos); + return !(pos.getIndex() == 0) && month.equals(format.format(result)); + } + + /** + * 获取某一时间段内的时间集合 + * + * @param data string 类型 + * @return List + * @since 2020-05-06 + */ + public static List getListDate(String data) { + + //获取30天的开始结束日期 + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(data); + + //定义日期集合 + List date = new ArrayList<>(); + + //开始日期 + Date startDate = YztDateUtil.strToDate(dateLimit.getStartTime(), DateConstants.DATE_FORMAT); + + //结束日期 + Date endDate = YztDateUtil.strToDate(dateLimit.getEndTime(), DateConstants.DATE_FORMAT); + + while (endDate.after(startDate)) { + date.add(YztDateUtil.dateToStr(startDate, DateConstants.DATE_FORMAT_DATE)); // 放入集合 + startDate = YztDateUtil.strToDate(YztDateUtil.addDay(startDate, 1, DateConstants.DATE_FORMAT), DateConstants.DATE_FORMAT); //循环一次 加一天 + } + + return date; + } + + /** + * 两个日期之前的相差天数 + * + * @param starDate 开始日期 + * @param endDate 结束日期 + * @return 相差天数 + */ + public static int daysBetween(Date starDate, Date endDate) { + + Calendar cal = Calendar.getInstance(); + + cal.setTime(starDate); + + long time1 = cal.getTimeInMillis(); + + cal.setTime(endDate); + + long time2 = cal.getTimeInMillis(); + + long between_days = (time2 - time1) / (1000 * 3600 * 24); + + return Integer.parseInt(String.valueOf(between_days)); + + } + + /** + * 获取指定日期指定格式字符串 + * + * @param dateStr + * @param DATE_FORMAT + * @return + * @throws ParseException + */ + public static String appointedDayStrToFormatStr(String dateStr, String STR_DATE_FORMAT, String DATE_FORMAT) { + Date date = YztDateUtil.strToDate(dateStr, STR_DATE_FORMAT); + return YztDateUtil.dateToStr(date, DATE_FORMAT); + } + + /** + * 获取当前时间小时 + * + * @return 当前时间小时 默认24小时 + */ + public static int getCurrentHour() { + int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); + return hour; + } + + /** + * 13位时间戳转字符串 + * + * @param timestamp + * @param dateFormat + * @return + */ + public static String timestamp2DateStr(Long timestamp, String dateFormat) { + if (ObjectUtil.isNull(timestamp)) { + return ""; + } + if (StrUtil.isBlank(dateFormat)) { + dateFormat = DateConstants.DATE_FORMAT; + } + Date date = new Date(timestamp); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat); + return simpleDateFormat.format(date); + } + + /** + * 字符串转13位时间戳 + */ + public static Long dateStr2Timestamp(String dateStr, String type) { + DateTime parse = DateUtil.parse(dateStr); + if (StrUtil.isNotBlank(type)) { + if (type.equals(DateConstants.DATE_TIME_TYPE_BEGIN)) { + parse = DateUtil.beginOfDay(parse); + } + if (type.equals(DateConstants.DATE_TIME_TYPE_END)) { + parse = DateUtil.endOfDay(parse); + } + } + return parse.getTime(); + } + + public static void main(String[] args) { + DateLimitUtilVo dateLimit = getDateLimit(DateConstants.SEARCH_DATE_LATELY_7); + System.out.println(dateLimit.getStartTime()); + System.out.println(dateLimit.getEndTime()); + } + + /** + * 获取某个月的每一天 + * @param yearParam 年 + * @param monthParam 月 + * @return 每一天列表 + */ + public static List getAllDayByMonth(Integer yearParam, Integer monthParam) { + List list = new ArrayList<>(); + Calendar calendar = Calendar.getInstance(Locale.CHINA); + calendar.set(yearParam, monthParam - 1, 1); + int year = calendar.get(Calendar.YEAR);//年份 + int month = calendar.get(Calendar.MONTH) + 1;//月份 + int day = calendar.getActualMaximum(Calendar.DATE); + for (int i = 1; i <= day; i++) { + String date = null; + if (month < 10 && i < 10) { + date = year + "-0" + month + "-0" + i; + } + if (month < 10 && i >= 10) { + date = year + "-0" + month + "-" + i; + } + if (month >= 10 && i < 10) { + date = year + "-" + month + "-0" + i; + } + if (month >= 10 && i >= 10) { + date = year + "-" + month + "-" + i; + } + + list.add(date); + } + return list; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/utils/YztUtil.java b/fightwine-common/src/main/java/com/yzt/common/utils/YztUtil.java new file mode 100644 index 0000000..3f64d01 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/utils/YztUtil.java @@ -0,0 +1,879 @@ +package com.yzt.common.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.crypto.symmetric.DES; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.text.NumberFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 加解密工具类 + * + */ +public class YztUtil { + + public static String encryptPassword(String pwd, String key) { + DES des = new DES(getDESSecretKey(key)); + byte[] result = des.encrypt(pwd); + return Base64.encode(result); + } + + /** + * 解密密码 + */ + public static String decryptPassword(String pwd, String key) { + DES des = new DES(getDESSecretKey(key)); + return des.decryptStr(pwd); + } + + /** + * 获得DES加密秘钥 + * @param key + * @return + */ + public static byte[] getDESSecretKey(String key) { + byte[] result = new byte[8]; + byte[] keys = null; + keys = key.getBytes(StandardCharsets.UTF_8); + for(int i = 0; i<8;i++){ + if(i < keys.length){ + result[i] = keys[i]; + }else{ + result[i] = 0x01; + } + } + return result; + } + + /** + * 对象转map + * @param object 对象 + * @author Mr.Zhang + * @since 2020-04-14 + * @return Map + */ + public static Map objectToMap(Object object){ + return JSONObject.parseObject(JSONObject.toJSONString(object), Map.class); + } + + public static Map StringToMap(String strValue){ + return JSONObject.parseObject(strValue, HashMap.class); + } + + /** + * map转对象 + * @param map map + * @param clz 对象 + * @author Mr.Zhang + * @since 2020-04-14 + * @return Map + */ + public static T mapToObj(HashMap map, Class clz){ + if (map == null) return null; + return JSONObject.parseObject(JSONObject.toJSONString(map), clz); + } + + /** + * map转对象 + * @param map map + * @param clz 对象 + * @author Mr.Zhang + * @since 2020-04-14 + * @return Map + */ + public static T mapStringToObj(HashMap map, Class clz){ + if (map == null) return null; + return JSONObject.parseObject(JSONObject.toJSONString(map), clz); + } + + + /** + * 密码工具 + * @param args String[] 字符串数组 + */ + public static void main(String[] args) throws Exception { +// System.out.println(encryptPassword("123456", "admin")); +// System.out.println(decryptPassowrd("", "")); + +// String key = "123456"; +// String data = "中国123ABCabc"; +// System.out.println("原始数据:" + data); +// String encryptPassword = encryptPassword(data, key); +// System.out.println("加密结果:" + encryptPassword); +// String decryptPassowrd = decryptPassowrd(encryptPassword, key); +// System.out.println("解密结果:" + decryptPassowrd); + // 执行结果如下: + // 原始数据:中国123ABCabc + // 加密结果:5JNGj04iE/XUuTZM75zMrA== + // 解密结果:中国123ABCabc +// System.out.println(encryptPassword("Yzt_123456", "18292417675")); +// System.out.println(decryptPassword("c7Nwx1WsDdewbab2TlkpUg==", "18292417675")); + System.out.println(decryptPassword("ZRHx7lLKlTzrjD7fpVAVOQ==", "19924716954")); + // 执行结果:f6mcpGQ8NEmwbab2TlkpUg== + // 与 SQL 中的数据一致 + } + + /** + * map合并 + * @param map 对象 + * @author Mr.Zhang + * @since 2020-04-14 + * @return Object + */ + public static Map mergeMap(Map map, Map map1){ + HashMap map2 = new HashMap<>(); + map2.putAll(map); + map2.putAll(map1); + return map2; + } + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArray(String str){ + return stringToArrayByRegex(str, ","); + } + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @param regex 分隔符有 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArrayByRegex(String str, String regex ){ + List list = new ArrayList<>(); + if (str.contains(regex)){ + + String[] split = str.split(regex); + + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(Integer.parseInt(value.trim())); + } + } + }else { + list.add(Integer.parseInt(str)); + } + return list; + } + + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArrayStr(String str){ + return stringToArrayStrRegex(str, ","); + } + + /** + * 数字字符数据转int格式数据 + * @param str 待转换的数字字符串 + * @return int数组 + */ + public static List stringToArrayInt(String str){ + List strings = stringToArrayStrRegex(str, ","); + List ids = new ArrayList<>(); + for (String string : strings) { + ids.add(Integer.parseInt(string.trim())); + } + return ids; + } + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @param regex 分隔符有 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArrayStrRegex(String str, String regex ){ + List list = new ArrayList<>(); + if (str.contains(regex)){ + + String[] split = str.split(regex); + + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(value); + } + } + }else { + list.add(str); + } + return list; + } + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArrayObject(String str){ + return stringToArrayObjectRegex(str, ","); + } + + /** + * 字符串分割,转化为数组 + * @param str 字符串 + * @param regex 分隔符有 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List stringToArrayObjectRegex(String str, String regex ){ + List list = new ArrayList<>(); + if (str.contains(regex)){ + + String[] split = str.split(regex); + + for (String value : split) { + if(!StringUtils.isBlank(value)){ + list.add(value); + } + } + }else { + list.add(str); + } + return list; + } + + /** + * json字符串转数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List jsonToListString(String str){ + try{ + return JSONObject.parseArray(str).toJavaList(String.class); + }catch (Exception e){ + ArrayList list = new ArrayList<>(); + list.add(str); + return list; + } + } + + /** + * json字符串转数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List jsonToListInteger(String str){ + try{ + return JSONObject.parseArray(str).toJavaList(Integer.class); + }catch (Exception e){ + ArrayList list = new ArrayList<>(); + list.add(Integer.parseInt(str)); + return list; + } + } + + /** + * json字符串转数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List jsonToListObject(String str){ + try{ + return JSONObject.parseArray(str).toJavaList(Object.class); + }catch (Exception e){ + ArrayList list = new ArrayList<>(); + list.add(str); + return list; + } + } + + /** + * json字符串转数组 + * @param str 字符串 + * @author Mr.Zhang + * @since 2020-04-22 + * @return List + */ + public static List jsonToListClass(String str, Class cls){ + try{ + return JSONObject.parseArray(str, cls); + }catch (Exception e){ + return new ArrayList<>(); + } + } + + /** + * 去掉域名 https / http / www 信息 + * @param domain 域名 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getCleanLowerDomain(String domain){ + domain = domain.toLowerCase(); + domain = domain.replaceAll("http://", ""); + domain = domain.replaceAll("https://", ""); + domain = domain.replaceAll("www.", ""); + domain = domain.replaceAll("/", ""); + return domain; + } + + /** + * 获取根域名 + * @param domain 域名 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getBaseLowerDomain(String domain){ + if(!domain.contains(".")){ + domain += ".com"; + } + domain = getCleanLowerDomain(domain); + String[] split = domain.split("\\."); + int len = split.length; + if(len == 0){ + return domain; + } + return split[len - 2] + "." + split[len - 1]; + } + + /** + * 获取客户端ip + * @param request 参数 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getClientIp(HttpServletRequest request){ + String ip = request.getHeader("X-Forwarded-For"); + if(checkIsIp(ip)){ + return ip; + } + + ip = request.getHeader("X-Real-IP"); + if(checkIsIp(ip)){ + return ip; + } + + ip = request.getRemoteAddr(); + if("0:0:0:0:0:0:0:1".equals(ip)){ + //本地 localhost访问 ipv6 + ip = "127.0.0.1"; + } + if(checkIsIp(ip)){ + return ip; + } + + return ""; + } + + /** + * 检测是否为ip + * @param ip 参数 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static boolean checkIsIp(String ip){ + if(StringUtils.isBlank(ip)){ + return false; + } + + if("unKnown".equals(ip)){ + return false; + } + + if("unknown".equals(ip)){ + return false; + } + + return ip.split("\\.").length == 4; + } + + /** + * 获取fin_in_set拼装sql + * @param field String 字段 + * @param value Integer 值 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getFindInSetSql(String field, Integer value ){ + return "find_in_set(" + value +", " + field + ")"; + } + + /** + * 获取fin_in_set拼装sql + * @param field String 字段 + * @param list ArrayList 值 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getFindInSetSql(String field, ArrayList list ){ + ArrayList sqlList = new ArrayList<>(); + for (Integer value: list) { + sqlList.add(getFindInSetSql(field, value)); + } + return "( " + StringUtils.join(sqlList, " or ") + ")"; + } + + /** + * 获取fin_in_set拼装sql + * @param field String 字段 + * @param idStr String 多个值,逗号分割 + * @author Mr.Zhang + * @since 2020-04-22 + * @return String + */ + public static String getFindInSetSql(String field, String idStr ){ + List list = stringToArray(idStr); + ArrayList sqlList = new ArrayList<>(); + for (Integer value: list) { + sqlList.add(getFindInSetSql(field, value)); + } + return "( " + StringUtils.join(sqlList, " or ") + ")"; + } + + /** + * 通过id获取分类名称 + * @param list 分类集合 + * @param categoryIdStr id字符串 + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static String getValueByIndex(HashMap list, String categoryIdStr){ + if(list.size() < 1 || StringUtils.isBlank(categoryIdStr)){ + return ""; + } + ArrayList name = new ArrayList<>(); + List idList = YztUtil.stringToArray(categoryIdStr); + + String str = ""; + for (Integer id : idList) { + str = getStrValueByIndex(list, id); + if(!StringUtils.isBlank(str)){ + name.add(getStrValueByIndex(list, id)); + } + } + if(name.size() < 1){ + return ""; + } + return StringUtils.join(name, ","); + } + + /** + * 通过id获取分类名称 + * @param list 分类集合 + * @param key id + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static String getStrValueByIndex(HashMap list, Integer key){ + if(list.size() < 1){ + return ""; + } + return list.getOrDefault(key, ""); + } + + /** + * 通过id获取分类名称 + * @param list 分类集合 + * @param key id + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static Integer getIntValueByIndex(HashMap list, Integer key){ + if(null == list ||list.size() < 1){ + return 0; + } + return list.getOrDefault(key, 0); + } + + /** + * 获取uuid + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static String getUuid(){ + return UUID.randomUUID().toString().replace("-", ""); + } + + /** + * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% + * @param i1 当前周期 + * @param i2 上一个周期 + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static int getRate(Integer i1, Integer i2){ + BigDecimal b1 = new BigDecimal(i1); + BigDecimal b2 = new BigDecimal(i2); + return getRate(b1, b2); + } + + /** + * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% + * @param b1 当前周期 + * @param b2 上一个周期 + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static int getRate(BigDecimal b1, BigDecimal b2){ + //计算差值 + + if(b2.equals(b1)){ + //数值一样,说明没有增长 + return Constants.NUM_ZERO; + } + + if(b2.equals(BigDecimal.ZERO)){ + //b2是0 + return Constants.NUM_ONE_HUNDRED; + } + + return (b1.subtract(b2)).divide(b2, 2, BigDecimal.ROUND_UP).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue(); + + +// BigDecimal.setScale();//用于格式化小数点 +// setScale(1);//表示保留以为小数,默认用四舍五入方式 +// setScale(1,BigDecimal.ROUND_DOWN);//直接删除多余的小数位,如2.35会变成2.3 +// setScale(1,BigDecimal.ROUND_UP);//进位处理,2.35变成2.4 +// setScale(1,BigDecimal.ROUND_HALF_UP);//四舍五入,2.35变成2.4 +// setScaler(1,BigDecimal.ROUND_HALF_DOWN);//四舍五入,2.35变成2.3,如果是5则向下舍 + } + + /** + * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% + * @param i1 当前周期 + * @param i2 上一个周期 + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static BigDecimal getRateBig(Integer i1, Integer i2){ + BigDecimal b1 = new BigDecimal(i1); + BigDecimal b2 = new BigDecimal(i2); + return getRateBig(b1, b2); + } + + /** + * 同比率计算 //同比增长率= ((当前周期 - 上一个周期) ÷ 上一个周期 ) *100% + * 如果上个周期为0, = 当前周期 * 100% + * @param b1 当前周期 + * @param b2 上一个周期 + * @author Mr.Zhang + * @since 2020-05-06 + * @ + */ + public static BigDecimal getRateBig(BigDecimal b1, BigDecimal b2){ + //计算差值 + + if(b2.compareTo(b1) == 0){ + //数值一样,说明没有增长 + return BigDecimal.ZERO; + } + + if(b2.compareTo(BigDecimal.ZERO) == 0){ + //b2是0 + return b1.setScale(2, BigDecimal.ROUND_UP); + } + + return (b1.subtract(b2)).multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).divide(b2, BigDecimal.ROUND_UP); + } + + /** + * hash 转换 + * @param hash final byte[] hash参数 + * @author Mr.Zhang + * @since 2020-06-03 + * @return String + */ + public static String byteToHex(final byte[] hash) { + Formatter formatter = new Formatter(); + for (byte b : hash) { + formatter.format("%02x", b); + } + String result = formatter.toString(); + formatter.close(); + return result; + } + + /** + * hash 转换 + * @param base64 String 图片流 + * @author Mr.Zhang + * @since 2020-06-03 + * @return String + */ + public static String getBase64Image(String base64) { + return "data:image/png;base64," + base64; + } + + /** + * 去掉字符串第一位和最后一位 + * @param param String 参数 + * @return String + */ + public static String trimSingeQua(String param){ + return param.substring(1,param.length()-1); + } + + + /** + * 根据长度生成随机数字 + * @param start 起始数字 + * @param end 结束数字 + * @return 生成的随机码 + */ + public static Integer randomCount(Integer start, Integer end){ + return (int)(Math.random()*(end - start +1) + start); + } + + /** + * 订单号生成 + * @param payType String 支付类型 + * @return 生成的随机码 + */ + public static String getOrderNo(String payType){ + return payType + randomCount(11111, 99999) + System.currentTimeMillis() + randomCount(11111, 99999); + } + + /** + * 订单号生成 + * @param payType String 支付类型 + * @return 生成的随机码 + */ + public static String getOrderNoPrefix(String payType){ + switch (payType){ + case Constants.PAY_TYPE_WE_CHAT: + return Constants.ORDER_NO_PREFIX_WE_CHAT; + //其他平台 + default: + return Constants.ORDER_NO_PREFIX_H5; + } + } + + /** + * map排序 + * @param map Map 支付类型 + * @return 生成的随机码 + */ + public static Map mapSort(Map map) { + return new TreeMap<>(map); + } + + /** + * map排序然后按照url模式拼接 + * @param map Map 支付类型 + * @return 生成的随机码 + */ + public static String mapToStringUrl(Map map){ + map = YztUtil.mapSort(map); + StringBuilder sb = new StringBuilder(); // 多线程访问的情况下需要用StringBuffer + Set es = map.keySet(); // 所有参与传参的key按照accsii排序(升序) + for (Object set : es) { + String k = set.toString(); + Object v = map.get(k); + sb.append(k).append("=").append(v.toString()).append("&"); + } + String str = sb.toString(); + return str.substring(0, str.length() - 1); + } + + public static BigDecimal getBigDecimalRate(String rate) { + return new BigDecimal(rate).divide(BigDecimal.TEN.multiply(BigDecimal.TEN)); + } + + /** + * unicode编码转换为汉字 + * @param unicodeStr 待转化的编码 + * @return 返回转化后的汉子 + */ + public static String UnicodeToCN(String unicodeStr) { + Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))"); + Matcher matcher = pattern.matcher(unicodeStr); + char ch; + while (matcher.find()) { + //group + String group = matcher.group(2); + //ch:'李四' + ch = (char) Integer.parseInt(group, 16); + //group1 + String group1 = matcher.group(1); + unicodeStr = unicodeStr.replace(group1, ch + ""); + } + + return unicodeStr.replace("\\", "").trim(); + } + + /** + * 汉字转化为Unicode编码 + * @param CN 待转化的中文 + * @return 返回转化之后的unicode编码 + */ + public static String CNToUnicode(String CN) { + + try { + StringBuffer out = new StringBuffer(""); + //直接获取字符串的unicode二进制 + byte[] bytes = CN.getBytes("unicode"); + //然后将其byte转换成对应的16进制表示即可 + for (int i = 0; i < bytes.length - 1; i += 2) { + out.append("\\u"); + String str = Integer.toHexString(bytes[i + 1] & 0xff); + for (int j = str.length(); j < 2; j++) { + out.append("0"); + } + String str1 = Integer.toHexString(bytes[i] & 0xff); + out.append(str1); + out.append(str); + } + return out.toString(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return null; + } + } + + public static String getSign(Map map, String signKey){ + String result = YztUtil.mapToStringUrl(map) + "&key=" + signKey; +// return DigestUtils.md5Hex(result).toUpperCase(); + String sign = SecureUtil.md5(result).toUpperCase(); + System.out.println("sign ========== " + sign); + return sign; + } + + /** + * 检查是否可以转换int + * @param str + * @return + */ + public static boolean isString2Num(String str){ + Pattern pattern = Pattern.compile("^[0-9]*$"); + Matcher matcher = pattern.matcher(str); + return matcher.matches(); + } + + //数组去重 + public static List arrayUnique(Integer[] arr){ + List list = new ArrayList<>(); + for (Integer integer : arr) { + if (!list.contains(integer)) { + list.add(integer); + } + } + + return list; + } + + + /** + * 百分比计算 + * @param detailTotalNumber 销售量 + * @param totalNumber 限量库存 + * @return 百分比 + */ + public static String percentInstance(Integer detailTotalNumber, Integer totalNumber) { + Double bfTotalNumber = Double.valueOf(detailTotalNumber); + Double zcTotalNumber = Double.valueOf(totalNumber); + double percent = bfTotalNumber/zcTotalNumber; + //获取格式化对象 + NumberFormat nt = NumberFormat.getPercentInstance(); + //设置百分数精确度2即保留两位小数 + nt.setMinimumFractionDigits(2); + return nt.format(percent); + } + + /** + * 百分比计算 + * @param detailTotalNumber 销售量 + * @param totalNumber 限量库存 + * @return 百分比 + */ + public static int percentInstanceIntVal(Integer detailTotalNumber, Integer totalNumber) { + BigDecimal sales = new BigDecimal(detailTotalNumber); + BigDecimal total = new BigDecimal(totalNumber); + int percentage = sales.divide(total, 2, BigDecimal.ROUND_UP).multiply(new BigDecimal(100)).intValue(); + return Math.min(percentage, 100); + } + + /** + * 百分比计算 + * @param detailTotalNumber 销售量 + * @param totalNumber 限量库存 + * @return 百分比 + */ + public static int percentInstanceIntVal(BigDecimal detailTotalNumber, BigDecimal totalNumber) { + int percentage = detailTotalNumber.divide(totalNumber, 2, BigDecimal.ROUND_UP).multiply(new BigDecimal(100)).intValue(); + return Math.min(percentage, 100); + } + + /** + * Object转List + */ + public static List castList(Object obj, Class clazz) { + List result = new ArrayList<>(); + if(obj instanceof List) { + for (Object o : (List) obj) { + result.add(clazz.cast(o)); + } + return result; + } + return null; + } + + public static List jsonArrayToJsonObjectList(JSONArray jsonArray) { + List list = CollUtil.newArrayList(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject arrayJSONObject = jsonArray.getJSONObject(i); + list.add(arrayJSONObject); + } + return list; + } + + /** + * 手机号脱敏处理 + * @param phone 手机号 + */ + public static String maskMobile(String phone) { + if (StrUtil.isBlank(phone)) { + return ""; + } + return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/validation/StringContainsValidator.java b/fightwine-common/src/main/java/com/yzt/common/validation/StringContainsValidator.java new file mode 100644 index 0000000..9ae34d5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/validation/StringContainsValidator.java @@ -0,0 +1,32 @@ +package com.yzt.common.validation; + +import cn.hutool.core.util.StrUtil; +import com.yzt.common.annotation.StringContains; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 校验一个字符串是否包含在指定字符数组内 + * fw_ + */ +public class StringContainsValidator implements ConstraintValidator { + + private Set limitValues; + + @Override + public void initialize (StringContains constraintAnnotation) { + limitValues = Arrays.stream(constraintAnnotation.limitValues()).collect(Collectors.toSet()); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StrUtil.isBlank(value)) { + return true; + } + return limitValues.contains(value.trim()); + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/AftersaleProductInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/AftersaleProductInfoVo.java new file mode 100644 index 0000000..5cd5d9f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/AftersaleProductInfoVo.java @@ -0,0 +1,25 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * + * fw_ + */ +@Data +public class AftersaleProductInfoVo { + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 商家自定义sku ID, 如果没有则不填 */ + @TableField(value = "out_sku_id") + private String outSkuId; + + /** 参与售后的商品数量 */ + @TableField(value = "product_cnt") + private Integer productCnt; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/AliPayJsResultVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/AliPayJsResultVo.java new file mode 100644 index 0000000..0d0b2ce --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/AliPayJsResultVo.java @@ -0,0 +1,44 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信调起支付参数对象 + * fw_ + */ +@Data +@ApiModel(value="AliPayJsResultVo对象", description="支付宝调起支付参数对象") +public class AliPayJsResultVo { + + @ApiModelProperty(value = "支付宝id") + private String appId; + + @ApiModelProperty(value = "接口名称") + private String method; + + @ApiModelProperty(value = "仅支持JSON") + private String format = "JSON"; + + @ApiModelProperty(value = "编码格式") + private String charset; + + @ApiModelProperty(value = "签名算法类型:RSA,RSA2") + private String signType; + + @ApiModelProperty(value = "支付签名") + private String sign; + + @ApiModelProperty(value = "发送请求时间,格式'yyyy-MM-dd HH:mm:ss'") + private String timestamp; + + @ApiModelProperty(value = "调用的接口版本") + private String version = "1.0"; + + @ApiModelProperty(value = "异步回调地址") + private String notifyUrl; + + @ApiModelProperty(value = "业务请求参数集合") + private String bizContent; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ArticleVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ArticleVo.java new file mode 100644 index 0000000..c203ca7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ArticleVo.java @@ -0,0 +1,49 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文章管理 Vo + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ArticleVo对象", description="文章管理表") +public class ArticleVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "文章管理ID") + private Integer id; + + @ApiModelProperty(value = "分类id") + private String cid; + + @ApiModelProperty(value = "文章标题") + private String title; + + @ApiModelProperty(value = "文章作者") + private String author; + + @ApiModelProperty(value = "文章图片") + private String imageInput; + + @ApiModelProperty(value = "文章简介") + private String synopsis; + + @ApiModelProperty(value = "浏览次数") + private String visit; + + @ApiModelProperty(value = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8") + private Date updateTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/AttachVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/AttachVo.java new file mode 100644 index 0000000..e8bd3f4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/AttachVo.java @@ -0,0 +1,33 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 支付附加对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="AttachVo对象", description="支付附加对象") +public class AttachVo { + + public AttachVo() { + } + + public AttachVo(String type, Integer userId) { + this.type = type; + this.userId = userId; + } + + @ApiModelProperty(value = "业务类型, 订单 = order, 充值 = recharge", required = true) + private String type = "order"; + + @ApiModelProperty(value = "用户id", required = true) + private Integer userId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/BargainProductExcelVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/BargainProductExcelVo.java new file mode 100644 index 0000000..75eab34 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/BargainProductExcelVo.java @@ -0,0 +1,47 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 砍价商品ExeclVo对象 + * + */ +@Data +public class BargainProductExcelVo { + + @ApiModelProperty(value = "砍价活动名称") + private String title; + +// @ApiModelProperty(value = "砍价活动简介") +// private String info; + + @ApiModelProperty(value = "砍价金额") + private String price; + + @ApiModelProperty(value = "用户每次砍价的次数") + private Integer bargainNum; + + @ApiModelProperty(value = "砍价状态 0(到砍价时间不自动开启) 1(到砍价时间自动开启时间)") + private String status; + + @ApiModelProperty(value = "砍价开启时间") + private String startTime; + + @ApiModelProperty(value = "砍价结束时间") + private String stopTime; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "库存剩余") + private Integer quotaShow; + + @ApiModelProperty(value = "反多少积分") + private BigDecimal giveIntegral; + + @ApiModelProperty(value = "添加时间") + private String addTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/BaseResultResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/BaseResultResponseVo.java new file mode 100644 index 0000000..d04c06c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/BaseResultResponseVo.java @@ -0,0 +1,14 @@ +package com.yzt.common.vo; + + +import lombok.Data; + +/** + * Base Result + * fw_ + */ +@Data +public class BaseResultResponseVo { + private Integer errcode; + private String errmsg; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CallbackVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CallbackVo.java new file mode 100644 index 0000000..f3b5dd0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CallbackVo.java @@ -0,0 +1,92 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信回调对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CallbackVo对象", description="微信回调") +public class CallbackVo { + @ApiModelProperty(value = "调用接口提交的公众账号ID") + @JsonProperty(value = "appid") + private String appId; + + @ApiModelProperty(value = "调用接口提交的商户号") + @JsonProperty(value = "mch_id") + private String mchId; + + @ApiModelProperty(value = "调用接口提交的终端设备号") + @JsonProperty(value = "device_info") + private String deviceInfo; + + @ApiModelProperty(value = "微信返回的随机字符串") + @JsonProperty(value = "nonce_str") + private String nonceStr; + + @ApiModelProperty(value = "微信返回的签名") + private String sign; + + @ApiModelProperty(value = "SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断") + @JsonProperty(value = "return_code") + private String returnCode; + + @ApiModelProperty(value = "当return_code为FAIL时返回信息为错误原因 ,例如 签名失败 参数格式校验错误") + @JsonProperty(value = "return_msg") + private String returnMsg; + + @ApiModelProperty(value = "SUCCESS/FAIL 业务结果") + @JsonProperty(value = "result_code") + private String resultCode; + + @ApiModelProperty(value = "详细参见错误列表") + @JsonProperty(value = "err_code") + private String errCode; + + @ApiModelProperty(value = "错误返回的信息描述") + @JsonProperty(value = "err_code_des") + private String errCodeDes; + + @ApiModelProperty(value = "用户在商户appid下的唯一标识") + private String openid; + + @ApiModelProperty(value = "微信支付订单号") + @JsonProperty(value = "transaction_id") + private String transactionId; + + @ApiModelProperty(value = "微信支付订单号") + @JsonProperty(value = "out_trade_no") + private String outTradeNo; + + @ApiModelProperty(value = "商家数据包,原样返回") + private String attach; + + @ApiModelProperty(value = "支付完成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则") + @JsonProperty(value = "time_end") + private String timeEnd; + + @ApiModelProperty(value = "用户是否关注公众账号,Y-关注,N-未关注") + @JsonProperty(value = "is_subscribe") + private String isSubscribe; + + @ApiModelProperty(value = "银行类型") + @JsonProperty(value = "bank_type") + private String bankType; + + @ApiModelProperty(value = "现金支付金额") + @JsonProperty(value = "cash_fee") + private Integer cashFee; + + @ApiModelProperty(value = "总代金券金额") + @JsonProperty(value = "coupon_fee") + private Integer couponFee; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CatItem.java b/fightwine-common/src/main/java/com/yzt/common/vo/CatItem.java new file mode 100644 index 0000000..3007824 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CatItem.java @@ -0,0 +1,36 @@ +package com.yzt.common.vo; + +import lombok.Data; + +import java.util.List; + +/** + * + * fw_ + */ +@Data +public class CatItem { + + private Integer value; + + private String label; + + private String qualification; + + private Integer qualificationType; + + private String productQualification; + + private Integer productQualificationType; + + private List children; + + public CatItem() { + } + + public CatItem(Integer value, String label, List childrens) { + this.value = value; + this.label = label; + this.children = childrens; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CategoryTreeVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CategoryTreeVo.java new file mode 100644 index 0000000..d222984 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CategoryTreeVo.java @@ -0,0 +1,51 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 分类表 + * fw_ + */ +@Data +public class CategoryTreeVo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "路径") + private String path; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "类型,类型,1 产品分类,2 附件分类,3 文章分类, 4 设置分类, 5 菜单分类, 6 配置分类, 7 秒杀配置") + private Integer type; + + @ApiModelProperty(value = "地址") + private String url; + + @ApiModelProperty(value = "扩展字段") + private String extra; + + @ApiModelProperty(value = "状态, 0正常,1失效") + private Boolean status; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @JsonInclude(JsonInclude.Include.NON_EMPTY) //属性为 空("")[] 或者为 NULL 都不序列化 + private List child = new ArrayList<>(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CloudVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CloudVo.java new file mode 100644 index 0000000..4dd1eb5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CloudVo.java @@ -0,0 +1,35 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 文件信息 + * + */ +@Data +public class CloudVo { + + //域名空间 + private String domain; + + //accessKey + private String accessKey; + + //secretKey + private String secretKey; + + //bucketName + private String bucketName; + +// //webPath web访问的url地址,云服务会自动创建相对应的文件夹 +// private String webPath; +// +// //服务器存储的文件绝对路径 +// private String filePath; +// +// //图片id +// private Integer id; + + //节点 + private String region; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CombinationProductExcelVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CombinationProductExcelVo.java new file mode 100644 index 0000000..1e18e59 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CombinationProductExcelVo.java @@ -0,0 +1,47 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 拼团商品ExeclVo对象 + * + */ +@Data +public class CombinationProductExcelVo { + + @ApiModelProperty(value = "编号") + private Integer id; + + @ApiModelProperty(value = "拼团名称") + private String title; + + @ApiModelProperty(value = "原价") + private BigDecimal otPrice; + + @ApiModelProperty(value = "拼团价") + private BigDecimal price; + + @ApiModelProperty(value = "库存剩余") + private Integer quotaShow; + + @ApiModelProperty(value = "拼团人数") + private Integer countPeople; + + @ApiModelProperty(value = "参与人数") + private Integer countPeopleAll; + + @ApiModelProperty(value = "成团数量") + private Integer countPeoplePink; + + @ApiModelProperty(value = "销量") + private Integer sales; + + @ApiModelProperty(value = "商品状态") + private String isShow; + + @ApiModelProperty(value = "拼团结束时间") + private String stopTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoDetailVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoDetailVo.java new file mode 100644 index 0000000..45f62c4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoDetailVo.java @@ -0,0 +1,34 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 上报支付的场景信息详情 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CreateOrderH5SceneInfoDetailVo对象", description="上报支付的场景信息详情") +public class CreateOrderH5SceneInfoDetailVo { + public CreateOrderH5SceneInfoDetailVo() { + } + + public CreateOrderH5SceneInfoDetailVo(String url, String name) { + this.wap_url = url; + this.wap_name = name; + } + + @ApiModelProperty(value = "场景类型", required = true) + private String type = "Wap"; + + @ApiModelProperty(value = "WAP网站URL地址", required = true) + private String wap_url; + + @ApiModelProperty(value = "WAP 网站名", required = true) + private String wap_name; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoVo.java new file mode 100644 index 0000000..1f038c9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderH5SceneInfoVo.java @@ -0,0 +1,29 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 上报支付的场景信息 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CreateOrderH5SceneInfoVo对象", description="上报支付的场景信息") +public class CreateOrderH5SceneInfoVo { + public CreateOrderH5SceneInfoVo() { + } + + public CreateOrderH5SceneInfoVo(CreateOrderH5SceneInfoDetailVo h5Info) { + this.h5_info = h5Info; + } + + @ApiModelProperty(value = "h5_info", required = true) + @JsonProperty(value = "h5_info") + private CreateOrderH5SceneInfoDetailVo h5_info; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderRequestVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderRequestVo.java new file mode 100644 index 0000000..1de237f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderRequestVo.java @@ -0,0 +1,90 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信统一下单对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CreateOrderRequestVo对象", description="微信统一下单对象") +public class CreateOrderRequestVo { + @ApiModelProperty(value = "appId,公众号名称,由商户传入", required = true) + private String appid; + + @ApiModelProperty(value = "直连商户的商户号,由微信支付生成并下发", required = true) + private String mch_id; + + @ApiModelProperty(value = "终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传 WEB") + private String device_info = "WEB"; + + @ApiModelProperty(value = "随机字符串,不长于32位", required = true) + private String nonce_str; + + @ApiModelProperty(value = "签名", required = true) + private String sign; + + @ApiModelProperty(value = "签名类型,默认为MD5,支持HMAC-SHA256和MD5。") + private String sign_type; + + @ApiModelProperty(value = "商品简单描述,该字段须严格按照规范传递", required = true) + private String body; + + @ApiModelProperty(value = "商品简单描述") + private String detail; + + @ApiModelProperty(value = "附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据, String(127)") + private String attach; + + @ApiModelProperty(value = "商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号", required = true) + private String out_trade_no; + + @ApiModelProperty(value = "符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型") + private String fee_type = "CNY"; + + @ApiModelProperty(value = "订单总金额,单位为分", required = true) + private int total_fee; + + @ApiModelProperty(value = "必须传正确的用户端IP,支持ipv4、ipv6格式,获取方式详见获取用户ip指引", required = true) + private String spbill_create_ip; + + @ApiModelProperty(value = "订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则") + private String time_start; + + @ApiModelProperty(value = "订单失效时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则") + private String time_expire; + + @ApiModelProperty(value = "商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠") + private String goods_tag; + + @ApiModelProperty(value = "接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。") + private String notify_url; + + @ApiModelProperty(value = "JSAPI -JSAPI支付(或小程序支付), NATIVE -Native支付, APP -APP支付,MWEB--H5支付", required = true) + private String trade_type; + + @ApiModelProperty(value = "trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。") + private String product_id; + + @ApiModelProperty(value = "no_credit--指定不能使用信用卡支付") + private String limit_pay; + + @ApiModelProperty(value = "trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换") + private String openid; + + @ApiModelProperty(value = "Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效") + private String receipt = "N"; + + @ApiModelProperty(value = "该字段用于上报支付的场景信息,针对H5支付有以下三种场景,请根据对应场景上报,H5支付不建议在APP端使用,针对场景1,2请接入APP支付,不然可能会出现兼容性问题") + private String scene_info; + + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderResponseVo.java new file mode 100644 index 0000000..b94b347 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CreateOrderResponseVo.java @@ -0,0 +1,75 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 统一下单返回对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CreateOrderResponseVo对象", description="统一下单返回对象") +public class CreateOrderResponseVo { + @ApiModelProperty(value = "调用接口提交的公众账号ID") + @JsonProperty(value = "appid") + private String appId; + + @ApiModelProperty(value = "调用接口提交的商户号") + @JsonProperty(value = "mch_id") + private String mchId; + + @ApiModelProperty(value = "调用接口提交的终端设备号") + @JsonProperty(value = "device_info") + private String deviceInfo; + + @ApiModelProperty(value = "微信返回的随机字符串") + @JsonProperty(value = "nonce_str") + private String nonceStr; + + @ApiModelProperty(value = "微信返回的签名") + private String sign; + + @ApiModelProperty(value = "SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断") + @JsonProperty(value = "return_code") + private String returnCode; + + @ApiModelProperty(value = "当return_code为FAIL时返回信息为错误原因 ,例如 签名失败 参数格式校验错误") + @JsonProperty(value = "return_msg") + private String returnMsg; + + @ApiModelProperty(value = "SUCCESS/FAIL 业务结果") + @JsonProperty(value = "result_code") + private String resultCode; + + @ApiModelProperty(value = "详细参见错误列表") + @JsonProperty(value = "err_code") + private String errCode; + + @ApiModelProperty(value = "错误返回的信息描述") + @JsonProperty(value = "err_code_des") + private String errCodeDes; + + @ApiModelProperty(value = "调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP,,H5支付固定传MWEB") + @JsonProperty(value = "trade_type") + private String tradeType; + + @ApiModelProperty(value = "微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时,针对H5支付此参数无特殊用途") + @JsonProperty(value = "prepay_id") + private String prepayId; + + @ApiModelProperty(value = "mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟") + @JsonProperty(value = "mweb_url") + private String mWebUrl; + + @ApiModelProperty(value = "该字段用于上报支付的场景信息,针对H5支付有以下三种场景,请根据对应场景上报,H5支付不建议在APP端使用,针对场景1,2请接入APP支付,不然可能会出现兼容性问题") + @JsonProperty(value = "scene_info") + private String extra; + + private Object transJsConfig; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/CustomerExcelVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/CustomerExcelVo.java new file mode 100644 index 0000000..80e313b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/CustomerExcelVo.java @@ -0,0 +1,45 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CustomerExcelVo", description = "客户导出") +public class CustomerExcelVo { + +// @ApiModelProperty(value = "商品productID", example = "36", required = true) +// private Long prodId; +// + @ApiModelProperty(value = "属性规格", example = "", required = true) + private String sku; + + @ApiModelProperty(value = "ID", example = "36", required = true) + private Integer id; + + @ApiModelProperty(value = "参会人姓名", example = "郑先生", required = true) + private String realName; + + @NotBlank(message = "手机号不能为空") + private String phone; + +// @ApiModelProperty(value = "性别:1=男,2=女") +// private Integer sex; // 1=男, 2=女 + + @ApiModelProperty(value = "客户类型") + private String type; + +// @ApiModelProperty(value = "省市区(格式:省 市 区)") +// private String proCity; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/DateLimitUtilVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/DateLimitUtilVo.java new file mode 100644 index 0000000..5d97c0e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/DateLimitUtilVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 时间Vo类 + * + */ +@Data +public class DateLimitUtilVo { + public DateLimitUtilVo() {} + public DateLimitUtilVo(String startTime, String endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + private String startTime; //开始时间 + + private String endTime; //结束时间 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryCompanyVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryCompanyVo.java new file mode 100644 index 0000000..55223ee --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryCompanyVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * fw_ + */ +@Data +public class DeliveryCompanyVo { + + /** 快递公司id */ + @TableField(value = "delivery_id") + private String deliveryId; + + /** 快递公司名称 */ + @TableField(value = "delivery_name") + private String deliveryName; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryInfoVo.java new file mode 100644 index 0000000..a45ebad --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/DeliveryInfoVo.java @@ -0,0 +1,19 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * fw_ + */ +@Data +public class DeliveryInfoVo { + + /** 快递公司ID,通过获取快递公司列表获取 */ + @TableField(value = "delivery_id") + private String deliveryId; + + /** 快递单号 */ + @TableField(value = "waybill_id") + private String waybillId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/DeliverySendVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/DeliverySendVo.java new file mode 100644 index 0000000..fb581a7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/DeliverySendVo.java @@ -0,0 +1,33 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 订单发货Vo对象 + * fw_ + */ +@Data +public class DeliverySendVo { + + /** 订单ID */ + @TableField(value = "order_id") + private Integer orderId; + + /** 商家自定义订单ID,与 order_id 二选一 */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 用户的openid */ + private String openid; + + /** 发货完成标志位, 0: 未发完, 1:已发完 */ + @TableField(value = "finish_all_delivery") + private Integer finishSllDelivery; + + /** 快递信息,delivery_type=1时必填 */ + @TableField(value = "delivery_list") + private List deliveryList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ExpressSheetVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ExpressSheetVo.java new file mode 100644 index 0000000..78b385b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ExpressSheetVo.java @@ -0,0 +1,57 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 系统电子面单对象 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ExpressSheetVo对象", description="系统电子面单对象") +public class ExpressSheetVo { + + public ExpressSheetVo() { + } + + public ExpressSheetVo(Integer exportId, String exportCom, String exportTempId, String exportToName, String exportToTel, String exportToAddress, String exportSiid, Integer exportOpen) { + this.exportId = exportId; + this.exportCom = exportCom; + this.exportTempId = exportTempId; + this.exportToName = exportToName; + this.exportToTel = exportToTel; + this.exportToAddress = exportToAddress; + this.exportSiid = exportSiid; + this.exportOpen = exportOpen; + } + + @ApiModelProperty(value = "快递公司简称,物流、电子面单开通必填") + private Integer exportId; + + @ApiModelProperty(value = "快递公司简称,物流、电子面单开通必填") + private String exportCom; + + @ApiModelProperty(value = "快递公司模板Id、电子面单开通必填") + private String exportTempId; + + @ApiModelProperty(value = "快递面单发货人姓名,物流、电子面单开通必填") + private String exportToName; + + @ApiModelProperty(value = "快递面单发货人电话,物流、电子面单开通必填") + private String exportToTel; + + @ApiModelProperty(value = "发货人详细地址,物流、电子面单开通必填") + private String exportToAddress; + + @ApiModelProperty(value = "电子面单打印机编号,物流、电子面单开通必填") + private String exportSiid; + + @ApiModelProperty(value = "电子面单是否开启") + private Integer exportOpen; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/FileResultVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/FileResultVo.java new file mode 100644 index 0000000..a3e3037 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/FileResultVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import lombok.Data; +/** + * 文件信息 + * + */ +@Data +public class FileResultVo{ + + // 文件名 + private String fileName; + + // 扩展名 + private String extName; + + // 文件大小,字节 + private Long fileSize; + + // 文件存储在服务器的相对地址 +// private String serverPath; + + //可供访问的url 域名根据配置存储,代替了上面serverPath 的功能 + private String url; + + //类型 + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/FirstCatVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/FirstCatVo.java new file mode 100644 index 0000000..b0999a5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/FirstCatVo.java @@ -0,0 +1,23 @@ +package com.yzt.common.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 第一级类目 + * fw_ + */ +@Data +public class FirstCatVo { + + /** 一级类目ID */ + private Integer firstCatId; + + /** 一级类目名称 */ + private String firstCatName; + + /** 二级类目数组 */ + private List secondCatList; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ImageMergeUtilVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ImageMergeUtilVo.java new file mode 100644 index 0000000..511c42e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ImageMergeUtilVo.java @@ -0,0 +1,27 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; + +/** + * 图片合成详情 + * fw_ + */ +@Data +public class ImageMergeUtilVo { + + @ApiModelProperty(value = "图片地址", required = true) + @NotBlank(message = "图片地址必须填写") + private String path; //地址 + + @ApiModelProperty(value = "x轴", required = true) + @Min(value = 0, message = "x轴至少为0") + private int x; //x轴 + + @ApiModelProperty(value = "y轴", required = true) + @Min(value = 0, message = "y轴至少为0") + private int y; //y轴 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/InvoiceRequestVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/InvoiceRequestVo.java new file mode 100644 index 0000000..3232305 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/InvoiceRequestVo.java @@ -0,0 +1,35 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 发票请求对象 + */ +@Data +@ApiModel(value="InvoiceRequestVo", description="发票请求对象") +public class InvoiceRequestVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "是否需要发票:true=需要,false=不需要", required = true) + @NotNull(message = "请选择是否需要发票") + private Boolean needInvoice; + + @ApiModelProperty(value = "发票抬头类型:1=个人,2=单位") + private Integer invoiceType; + + @ApiModelProperty(value = "发票抬头(个人名称或单位名称)") + private String invoiceTitle; + + @ApiModelProperty(value = "纳税人识别号(单位必填)") + private String taxNumber; + + @ApiModelProperty(value = "发票内容,默认:商品明细") + private String invoiceContent; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/LoginUserVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/LoginUserVo.java new file mode 100644 index 0000000..8f9a30f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/LoginUserVo.java @@ -0,0 +1,204 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemPermissions; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 登录用户身份权限 + */ +public class LoginUserVo implements UserDetails { + + private static final long serialVersionUID = 1L; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登陆时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private List permissions; + + /** + * 用户信息 + */ + private SystemAdmin user; + + public LoginUserVo() { + } + + public LoginUserVo(SystemAdmin user, List permissions) { + this.user = user; + this.permissions = permissions; + } + + @Override + @JsonIgnore + public Collection getAuthorities() { + List authorities = new ArrayList<>(permissions.size()); + for (SystemPermissions permission : permissions) { + authorities.add(new SimpleGrantedAuthority(permission.getPath())); + } + return authorities; + } + + @JsonIgnore + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return null; + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + */ + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + */ + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + */ + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } + + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + + public Long getExpireTime() { + return expireTime; + } + + public void setExpireTime(Long expireTime) { + this.expireTime = expireTime; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public List getPermissions() { + return permissions; + } + + public void setPermissions(List permissions) { + this.permissions = permissions; + } + + public SystemAdmin getUser() { + return user; + } + + public void setUser(SystemAdmin user) { + this.user = user; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultListVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultListVo.java new file mode 100644 index 0000000..2319698 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultListVo.java @@ -0,0 +1,24 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 快递轨迹 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="LogisticsResultListVo对象", description="快递轨迹") +public class LogisticsResultListVo { + + @ApiModelProperty(value = "时间") + private String time; + + @ApiModelProperty(value = "日志") + private String status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultVo.java new file mode 100644 index 0000000..5c6f928 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/LogisticsResultVo.java @@ -0,0 +1,63 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 快递轨迹 + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="LogisticsResultVo对象", description="快递接口返回数据") +public class LogisticsResultVo { + + @ApiModelProperty(value = "快递单号") + private String number; + + @ApiModelProperty(value = "快递简写") + private String type; + + @ApiModelProperty(value = "快递运送轨迹") + private List list; + + @ApiModelProperty(value = "快递收件(揽件)1.在途中 2.正在派件 3.已签收 4.派送失败 5.疑难件 6.退件签收 */") + @JsonProperty("deliverystatus") + private String deliveryStatus; + + @ApiModelProperty(value = "是否签收") + @JsonProperty("issign") + private String isSign; + + @ApiModelProperty(value = "快递公司名称") + private String expName; + + @ApiModelProperty(value = "快递公司官网") + private String expSite; + + @ApiModelProperty(value = "快递公司电话") + private String expPhone; + + @ApiModelProperty(value = "快递员 或 快递站(没有则为空") + private String courier; + + @ApiModelProperty(value = "快递员电话 (没有则为空)") + private String courierPhone; + + @ApiModelProperty(value = "快递轨迹信息最新时间 ") + private String updateTime; + + @ApiModelProperty(value = "发货到收货消耗时长 (截止最新轨迹)") + private String takeTime; + + @ApiModelProperty(value = "快递公司LOGO") + private String logo; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckTree.java b/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckTree.java new file mode 100644 index 0000000..dcc9678 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckTree.java @@ -0,0 +1,67 @@ +package com.yzt.common.vo; + +import cn.hutool.core.collection.CollUtil; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单选中树 + * + */ +public class MenuCheckTree { + + private List menuList = new ArrayList(); + + public MenuCheckTree(List menuList) { + this.menuList = menuList; + } + + //建立树形结构 + public List buildTree(){ + List treeMenus = new ArrayList(); + for(MenuCheckVo menuNode : getRootNode()) { + menuNode = buildChildTree(menuNode); + treeMenus.add(menuNode); + } + return sortList(treeMenus); +// return treeMenus; + } + + // 排序 + private List sortList(List treeMenus) { + treeMenus = treeMenus.stream().sorted(Comparator.comparing(MenuCheckVo::getSort).reversed()).collect(Collectors.toList()); + treeMenus.forEach(e -> { + if (CollUtil.isNotEmpty(e.getChildList())) { + e.setChildList(sortList(e.getChildList())); + } + }); + return treeMenus; + } + + //递归,建立子树形结构 + private MenuCheckVo buildChildTree(MenuCheckVo pNode){ + List childMenus = new ArrayList(); + for(MenuCheckVo menuNode : menuList) { + if(menuNode.getPid().equals(pNode.getId())) { + childMenus.add(buildChildTree(menuNode)); + } + } + pNode.setChildList(childMenus); + return pNode; + } + + //获取根节点 + private List getRootNode() { + List rootMenuLists = new ArrayList(); + for(MenuCheckVo menuNode : menuList) { + if(menuNode.getPid().equals(0)) { + rootMenuLists.add(menuNode); + } + } + return rootMenuLists; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckVo.java new file mode 100644 index 0000000..f65ee7d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/MenuCheckVo.java @@ -0,0 +1,44 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 菜单待选中Vo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="MenuCheckVo对象", description="菜单待选中Vo对象") +public class MenuCheckVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "菜单ID") + private Integer id; + + @ApiModelProperty(value = "父级ID") + private Integer pid; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "icon") + private String icon; + + @ApiModelProperty(value = "是否选中") + private Boolean checked; + + @ApiModelProperty(value = "排序") + private Integer sort; + + @ApiModelProperty(value = "子对象列表") + private List childList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/MenuTree.java b/fightwine-common/src/main/java/com/yzt/common/vo/MenuTree.java new file mode 100644 index 0000000..f2c12fc --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/MenuTree.java @@ -0,0 +1,68 @@ +package com.yzt.common.vo; + +import cn.hutool.core.collection.CollUtil; +import com.yzt.common.response.MenusResponse; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 菜单树 + * + */ +public class MenuTree { + + private List menuList = new ArrayList(); + + public MenuTree(List menuList) { + this.menuList = menuList; + } + + //建立树形结构 + public List buildTree(){ + List treeMenus = new ArrayList(); + for(MenusResponse menuNode : getRootNode()) { + menuNode = buildChildTree(menuNode); + treeMenus.add(menuNode); + } + return sortList(treeMenus); +// return treeMenus; + } + + // 排序 + private List sortList(List treeMenus) { + treeMenus = treeMenus.stream().sorted(Comparator.comparing(MenusResponse::getSort).reversed()).collect(Collectors.toList()); + treeMenus.forEach(e -> { + if (CollUtil.isNotEmpty(e.getChildList())) { + e.setChildList(sortList(e.getChildList())); + } + }); + return treeMenus; + } + + //递归,建立子树形结构 + private MenusResponse buildChildTree(MenusResponse pNode){ + List childMenus = new ArrayList(); + for(MenusResponse menuNode : menuList) { + if(menuNode.getPid().equals(pNode.getId())) { + childMenus.add(buildChildTree(menuNode)); + } + } + pNode.setChildList(childMenus); + return pNode; + } + + //获取根节点 + private List getRootNode() { + List rootMenuLists = new ArrayList(); + for(MenusResponse menuNode : menuList) { + if(menuNode.getPid().equals(0)) { + rootMenuLists.add(menuNode); + } + } + return rootMenuLists; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/MyRecord.java b/fightwine-common/src/main/java/com/yzt/common/vo/MyRecord.java new file mode 100644 index 0000000..b697713 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/MyRecord.java @@ -0,0 +1,461 @@ +package com.yzt.common.vo; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import java.io.Serializable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.*; + +/** + * 公共对象 + * + */ +public class MyRecord implements Serializable { + + private static final long serialVersionUID = 905784513600884082L; + + private static final Logger logger = LoggerFactory.getLogger(MyRecord.class); + + private Map columns; + + void setColumnsMap(Map columns) { + this.columns = columns; + } + + /** + * Return columns map. + */ + public Map getColumns() { + if (null == columns) { + columns = new HashMap(); + } + return columns; + } + + /** + * Set columns value with map. + * + * @param columns the columns map + */ + public MyRecord setColums(Map columns) { + this.getColumns().putAll(columns); + return this; + } + + /** + * Set columns value with MyRecord. + * + * @param record the MyRecord object + */ + public MyRecord setColums(MyRecord record) { + this.getColumns().putAll(record.getColumns()); + return this; + } + + /** + * Set columns value with JSONObject. + * + * @param jsonObject the MyRecord object + */ + public MyRecord setColums(JSONObject jsonObject) { + Map columns = this.getColumns(); + jsonObject.forEach(columns::put); + return this; + } + + /** + * Set columns value with Model object. + * + * @param t + * @param + * @return + */ + public MyRecord setColums(T t) { + Map columns = this.getColumns(); + + String[] fieldNames = getFiledName(t); + + for (int i = 0; i < fieldNames.length; i++) { + String name = fieldNames[i]; + if (!StringUtils.isEmpty(name) && "serialVersionUID".equals(name)) { + continue; + } + Object value = getFieldValueByName(name, t); + if (null != value) { +// if (getFiledType(name, t).equals(Date.class)) { +// value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date)value); +// } + columns.put(name, value); + } + } + return this; + } + + /** + * Remove attribute of this myRecord. + * + * @param column the column name of the myRecord + */ + public MyRecord remove(String column) { + getColumns().remove(column); + return this; + } + + /** + * Remove columns of this myRecord. + * + * @param columns the column names of the myRecord + */ + public MyRecord remove(String... columns) { + if (columns != null) + for (String c : columns) + this.getColumns().remove(c); + return this; + } + + /** + * Remove columns if it is null. + */ + public MyRecord removeNullValueColumns() { + for (Iterator> it = getColumns().entrySet().iterator(); it.hasNext(); ) { + Map.Entry e = it.next(); + if (e.getValue() == null) { + it.remove(); + } + } + return this; + } + + /** + * Keep columns of this record and remove other columns. + * + * @param columns the column names of the record + */ + public MyRecord keep(String... columns) { + if (columns != null && columns.length > 0) { + Map newColumns = new HashMap(columns.length); // getConfig().containerFactory.getColumnsMap(); + for (String c : columns) + if (this.getColumns().containsKey(c)) // prevent put null value to the newColumns + newColumns.put(c, this.getColumns().get(c)); + + this.getColumns().clear(); + this.getColumns().putAll(newColumns); + } else + this.getColumns().clear(); + return this; + } + + /** + * Keep column of this record and remove other columns. + * + * @param column the column names of the record + */ + public MyRecord keep(String column) { + if (getColumns().containsKey(column)) { // prevent put null value to the newColumns + Object keepIt = getColumns().get(column); + getColumns().clear(); + getColumns().put(column, keepIt); + } else + getColumns().clear(); + return this; + } + + /** + * Remove all columns of this record. + */ + public MyRecord clear() { + getColumns().clear(); + return this; + } + + /** + * Set column to record. + * + * @param column the column name + * @param value the value of the column + */ + public MyRecord set(String column, Object value) { + getColumns().put(column, value); + return this; + } + + /** + * Set column to record. + * + * @param column the column name + * @param valueList the value of the column + */ + public MyRecord set(String column, List valueList) { + List> value = new ArrayList<>(); + valueList.forEach(o -> { + HashMap va = new HashMap<>(o.getColumns()); + value.add(va); + }); + getColumns().put(column, value); + return this; + } + + /** + * Get column of any mysql type + */ + public T get(String column) { + return (T) getColumns().get(column); + } + + /** + * Get column of any mysql type. Returns defaultValue if null. + */ + public T get(String column, Object defaultValue) { + Object result = getColumns().get(column); + return (T) (result != null ? result : defaultValue); + } + + public Object getObject(String column) { + return getColumns().get(column); + } + + public Object getObject(String column, Object defaultValue) { + Object result = getColumns().get(column); + return result != null ? result : defaultValue; + } + + /** + * Get column of mysql type: varchar, char, enum, set, text, tinytext, mediumtext, longtext + */ + public String getStr(String column) { + // return (String)getColumns().get(column); + Object s = getColumns().get(column); + return s != null ? s.toString() : null; + } + + /** + * Get column of mysql type: int, integer, tinyint(n) n > 1, smallint, mediumint + */ + public Integer getInt(String column) { + Number n = getNumber(column); + return n != null ? n.intValue() : null; + } + + /** + * Get column of mysql type: bigint + */ + public Long getLong(String column) { + Number n = getNumber(column); + return n != null ? n.longValue() : null; + } + + /** + * Get column of mysql type: unsigned bigint + */ + public java.math.BigInteger getBigInteger(String column) { + return (java.math.BigInteger) getColumns().get(column); + } + + /** + * Get column of mysql type: date, year + */ + public Date getDate(String column) { + return (Date) getColumns().get(column); + } + + /** + * Get column of mysql type: time + */ + public java.sql.Time getTime(String column) { + return (java.sql.Time) getColumns().get(column); + } + + /** + * Get column of mysql type: timestamp, datetime + */ + public java.sql.Timestamp getTimestamp(String column) { + return (java.sql.Timestamp) getColumns().get(column); + } + + /** + * Get column of mysql type: real, double + */ + public Double getDouble(String column) { + Number n = getNumber(column); + return n != null ? n.doubleValue() : null; + } + + /** + * Get column of mysql type: float + */ + public Float getFloat(String column) { + Number n = getNumber(column); + return n != null ? n.floatValue() : null; + } + + public Short getShort(String column) { + Number n = getNumber(column); + return n != null ? n.shortValue() : null; + } + + public Byte getByte(String column) { + Number n = getNumber(column); + return n != null ? n.byteValue() : null; + } + + /** + * Get column of mysql type: bit, tinyint(1) + */ + public Boolean getBoolean(String column) { + return (Boolean) getColumns().get(column); + } + + /** + * Get column of mysql type: decimal, numeric + */ + public BigDecimal getBigDecimal(String column) { + Object n = getColumns().get(column); + if (n instanceof BigDecimal) { + return (BigDecimal) n; + } else if (n != null) { + return new BigDecimal(n.toString()); + } else { + return null; + } + } + + /** + * Get column of mysql type: binary, varbinary, tinyblob, blob, mediumblob, longblob + * I have not finished the test. + */ + public byte[] getBytes(String column) { + return (byte[]) getColumns().get(column); + } + + /** + * Get column of any type that extends from Number + */ + public Number getNumber(String column) { + if (getColumns().get(column) instanceof String) { + try { + return NumberFormat.getInstance().parse(getColumns().get(column).toString()); + } catch (ParseException e) { + System.out.println("类型转换错误e = " + e.getMessage()); + e.printStackTrace(); + } + } + return (Number) getColumns().get(column); + } + + public String toString() { + if (columns == null) { + return "{}"; + } + StringBuilder sb = new StringBuilder(); + sb.append('{'); + boolean first = true; + for (Map.Entry e : getColumns().entrySet()) { + if (first) { + first = false; + } else { + sb.append(", "); + } + Object value = e.getValue(); + if (value != null) { + value = value.toString(); + } + sb.append(e.getKey()).append(':').append(value); + } + sb.append('}'); + return sb.toString(); + } + + public boolean equals(Object o) { + if (!(o instanceof MyRecord)) + return false; + if (o == this) + return true; + return getColumns().equals(((MyRecord) o).getColumns()); + } + + public int hashCode() { + return getColumns().hashCode(); + } + + /** + * Return column names of this record. + */ + public String[] getColumnNames() { + Set attrNameSet = getColumns().keySet(); + return attrNameSet.toArray(new String[attrNameSet.size()]); + } + + /** + * Return column values of this record. + */ + public Object[] getColumnValues() { + Collection attrValueCollection = getColumns().values(); + return attrValueCollection.toArray(new Object[attrValueCollection.size()]); + } + + /** + * Return json string of this record. + */ + public String toJson() { + return JSON.toJSONString(getColumns()); + } + + /** + * @param o + * @return + * @desc 获取属性名数组 + */ + private static String[] getFiledName(Object o) { + Field[] fields = o.getClass().getDeclaredFields(); + String[] fieldNames = new String[fields.length]; + for (int i = 0; i < fields.length; i++) { + fieldNames[i] = fields[i].getName(); + } + return fieldNames; + } + + /** + * @param fieldName + * @param o + * @return + * @desc 根据属性名获取属性值 + */ + private static Object getFieldValueByName(String fieldName, Object o) { + try { + String firstLetter = fieldName.substring(0, 1).toUpperCase(); + String getter = "get" + firstLetter + fieldName.substring(1); + Method method = o.getClass().getMethod(getter, new Class[]{}); + Object value = method.invoke(o, new Object[]{}); + return value; + } catch (Exception e) { + e.printStackTrace(); + logger.error("获取属性值失败!" + e, e); + } + return null; + } + + /** + * @param fieldName + * @param o + * @return + * @desc 获取属性的数据类型 + */ + private static Object getFiledType(String fieldName, Object o) { + Field[] fields = o.getClass().getDeclaredFields(); + for (Field field : fields) { + if (Objects.equals(fieldName, field.getName())) { + return field.getType(); + } + } + return null; + } + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLoginVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLoginVo.java new file mode 100644 index 0000000..db67872 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLoginVo.java @@ -0,0 +1,26 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 一号通登录对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OnePassLoginVo对象", description = "一号通登录对象") +public class OnePassLoginVo { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "access_key一号通后台AccessKey管理获得", required = true) + private String accessKey; + + @ApiModelProperty(value = "secret_key一号通后台AccessKey管理获得", required = true) + private String secretKey; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsQueryVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsQueryVo.java new file mode 100644 index 0000000..f280c52 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsQueryVo.java @@ -0,0 +1,38 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 一号通物流查询结果对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OnePassLogisticsQueryVo对象", description = "一号通物流查询结果对象") +public class OnePassLogisticsQueryVo { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "是否签收") + private String ischeck; + + @ApiModelProperty(value = "物流状态:0:快递收件(揽件)1.在途中 2.正在派件 3.已签收 4.派送失败 5.疑难件 6.退件签收 ") + private String status; + + @ApiModelProperty(value = "物流公司") + private String com; + + @ApiModelProperty(value = "快递单号") + private String num; + + @ApiModelProperty(value = "物流详情") + private List content; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsTrackVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsTrackVo.java new file mode 100644 index 0000000..0b27185 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OnePassLogisticsTrackVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 一号通物流轨迹对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OnePassLogisticsTrackVo对象", description = "一号通物流轨迹对象") +public class OnePassLogisticsTrackVo { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "变动时间") + private String time; + + private String ftime; + + @ApiModelProperty(value = "变动详情") + private String status; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OrderExcelVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OrderExcelVo.java new file mode 100644 index 0000000..ef44a0f --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OrderExcelVo.java @@ -0,0 +1,89 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 产品导出 + * + **/ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderExcelVo", description = "产品导出") +public class OrderExcelVo implements Serializable { + + @ApiModelProperty(value = "订单号") + private String orderId; + + @ApiModelProperty(value = "实际支付金额") + private String payPrice; + +// @ApiModelProperty(value = "支付方式") +// private String payType; + + @ApiModelProperty(value = "创建时间") + private String createTime; + +// @ApiModelProperty(value = "订单状态(0:待发货;1:待收货;2:已收货,待评价;3:已完成;)") +// private String status; + + @ApiModelProperty(value = "商品信息") + private String productName; + + @ApiModelProperty(value = "订单状态") + private String statusStr; + + @ApiModelProperty(value = "支付方式") + private String payTypeStr; + +// @ApiModelProperty(value = "是否删除") +// private String isDel; +// +// @ApiModelProperty(value = "退款图片") +// private String refundReasonWapImg; +// +// @ApiModelProperty(value = "退款用户说明") +// private String refundReasonWapExplain; +// +// @ApiModelProperty(value = "退款时间") +// private String refundReasonTime; +// +// @ApiModelProperty(value = "前台退款原因") +// private String refundReasonWap; +// +// @ApiModelProperty(value = "不退款的理由") +// private String refundReason; +// +// @ApiModelProperty(value = "退款金额") +// private String refundPrice; +// +// @ApiModelProperty(value = "0 未退款 1 申请中 2 已退款") +// private String refundStatus; +// +// @ApiModelProperty(value = "核销码") +// private String verifyCode; + + @ApiModelProperty(value = "订单类型") + private String orderType; + +// @ApiModelProperty(value = "订单管理员备注") +// private String remark; + + @ApiModelProperty(value = "用户姓名") + private String realName; + +// @ApiModelProperty(value = "支付状态") +// private String paid; +// +// @ApiModelProperty(value = "订单类型:0-普通订单,1-视频号订单") +// private String type; +// +// @ApiModelProperty(value = "是否改价,0-否,1-是") +// private String isAlterPrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoDetailVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoDetailVo.java new file mode 100644 index 0000000..6daecb7 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoDetailVo.java @@ -0,0 +1,58 @@ +package com.yzt.common.vo; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单详情Vo对象 + * + */ +@Data +public class OrderInfoDetailVo { + + /** 商品id */ + private Integer productId; + + /** 商品名称 */ + private String productName; + + /** 规格属性id */ + private Integer attrValueId; + + /** 商品图片 */ + private String image; + + /** sku */ + private String sku; + + /** 单价 */ + private BigDecimal price; + + /** 购买数量 */ + private Integer payNum; + + /** 重量 */ + private BigDecimal weight; + + /** 体积 */ + private BigDecimal volume; + + /** 运费模板ID */ + private Integer tempId; + + /** 获得积分 */ + private Integer giveIntegral; + + /** 是否评价 */ + private Integer isReply; + + /** 是否单独分佣 */ + private Boolean isSub; + + /** 会员价 */ + private BigDecimal vipPrice; + + /** 商品类型:0-普通,1-秒杀,2-砍价,3-拼团,4-视频号 */ + private Integer productType; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoVo.java new file mode 100644 index 0000000..3713ce1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/OrderInfoVo.java @@ -0,0 +1,93 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 预下单Vo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="OrderInfoVo对象", description="预下单Vo对象") +public class OrderInfoVo { + + @ApiModelProperty(value = "运费金额") + private BigDecimal freightFee; + + @ApiModelProperty(value = "优惠券编号(选择优惠券时有值") + private Integer userCouponId; + + @ApiModelProperty(value = "优惠金额") + private BigDecimal couponFee; + + @ApiModelProperty(value = "商品总计金额") + private BigDecimal proTotalFee; + + @ApiModelProperty(value = "订单商品数量") + private Integer orderProNum; + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payFee; + + @ApiModelProperty(value = "地址id") + private Integer addressId; + + @ApiModelProperty(value = "收货人姓名(前端用)") + private String realName; + + @ApiModelProperty(value = "收货人电话(前端用)") + private String phone; + + @ApiModelProperty(value = "收货人所在省(前端用)") + private String province; + + @ApiModelProperty(value = "收货人所在市(前端用)") + private String city; + + @ApiModelProperty(value = "收货人所在区(前端用)") + private String district; + + @ApiModelProperty(value = "收货人详细地址(前端用)") + private String detail; + + @ApiModelProperty(value = "用户剩余积分") + private java.math.BigDecimal userIntegral; + + @ApiModelProperty(value = "用户可用余额") + private BigDecimal userBalance; + + @ApiModelProperty(value = "订单备注") + private String remark; + + @ApiModelProperty(value = "订单详情数组") + private List orderDetailList; + + @ApiModelProperty(value = "秒杀商品Id") + private Integer seckillId = 0; + + @ApiModelProperty(value = "砍价商品Id") + private Integer bargainId = 0; + + @ApiModelProperty(value = "用户砍价活动id") + private Integer bargainUserId; + + @ApiModelProperty(value = "拼团商品Id") + private Integer combinationId = 0; + + @ApiModelProperty(value = "拼团团长Id") + private Integer pinkId = 0; + + @ApiModelProperty(value = "购物车编号列表") + private List cartIdList; + + @ApiModelProperty(value = "是否视频号订单") + private Boolean isVideo = false; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ProductExcelVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ProductExcelVo.java new file mode 100644 index 0000000..a91ce51 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ProductExcelVo.java @@ -0,0 +1,43 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 商品ExcelVo对象类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProductExcelVo对象", description = "产品导出") +public class ProductExcelVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "商品名称") + private String storeName; + +// @ApiModelProperty(value = "商品简介") +// private String storeInfo; + + @ApiModelProperty(value = "商品分类") + private String cateName; + + @ApiModelProperty(value = "价格") + private String price; + + @ApiModelProperty(value = "库存") + private String stock; + + @ApiModelProperty(value = "销量") + private String sales; + + @ApiModelProperty(value = "浏览量") + private String browse; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTempKeywordsVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTempKeywordsVo.java new file mode 100644 index 0000000..9472c76 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTempKeywordsVo.java @@ -0,0 +1,38 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 小程序关键词 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProgramTempKeywordsVo对象", description="小程序关键词") +public class ProgramTempKeywordsVo { + @ApiModelProperty(value = "关键词 id,选用模板时需要") + private Integer kid; + + @ApiModelProperty(value = "关键词内容") + private String name; + + @ApiModelProperty(value = "关键词内容对应的示例") + private String example; + + @ApiModelProperty(value = "参数类型") + private String rule; + + @ApiModelProperty(value = "代码里组装数据的时候,需要用到这个key") + @JsonIgnore + private String key; + + @ApiModelProperty(value = "代码里组装数据的时候,需要用到这个key") + @JsonIgnore + private String sendKey; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTemplateMessageVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTemplateMessageVo.java new file mode 100644 index 0000000..a9ce662 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ProgramTemplateMessageVo.java @@ -0,0 +1,37 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.HashMap; + +/** + * 微信模板发送类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SendTemplateMessageVo对象", description="微信模板发送类") +public class ProgramTemplateMessageVo { + @ApiModelProperty(value = "OPENID", required = true) + private String touser; + + @ApiModelProperty(value = "模板ID", required = true) + private String template_id; + + @ApiModelProperty(value = "模板跳转链接小程序地址") + private String page; + + @ApiModelProperty(value = "发送内容", required = true) + private HashMap data; + + @ApiModelProperty(value = "跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版") + private String miniprogram_state = "formal"; + + @ApiModelProperty(value = "进入小程序查看”的语言类型,支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN\n") + private String lang = "zh_CN"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/PublicMyTemplateVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/PublicMyTemplateVo.java new file mode 100644 index 0000000..b23521e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/PublicMyTemplateVo.java @@ -0,0 +1,36 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信公众号私有模板消息Vo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="PublicMyTemplateVo对象", description="微信公众号私有模板消息Vo对象") +public class PublicMyTemplateVo { + + @ApiModelProperty(value = "模板ID") + private String template_id; + + @ApiModelProperty(value = "模板ID") + private String title; + + @ApiModelProperty(value = "一级行业") + private String primary_industry; + + @ApiModelProperty(value = "二级行业") + private String deputy_industry; + + @ApiModelProperty(value = "模板内容") + private String content; + + @ApiModelProperty(value = "模板示例") + private String example; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/QrCodeVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/QrCodeVo.java new file mode 100644 index 0000000..b636ef8 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/QrCodeVo.java @@ -0,0 +1,21 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 二维码Vo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "QrCodeVo对象", description = "二维码Vo对象") +public class QrCodeVo { + + @ApiModelProperty(value = "二维码(base64已处理)") + private String code; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckAccessInfoItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckAccessInfoItemVo.java new file mode 100644 index 0000000..f43902c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckAccessInfoItemVo.java @@ -0,0 +1,15 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * + * fw_ + */ +@Data +public class RegisterCheckAccessInfoItemVo { + // 上传商品并审核成功 + private Integer spu_audit_success; + // 发起第一笔订单并支付成功 + private Integer pay_order_success; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckDataItemnVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckDataItemnVo.java new file mode 100644 index 0000000..ab0a595 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckDataItemnVo.java @@ -0,0 +1,14 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * RegisterCheckAccessInfoItemVo 获取接入状态Response + * fw_ + */ +@Data +public class RegisterCheckDataItemnVo { + // 审核状态, 2: 已接入, 3: 封禁中 + private Integer status; + private RegisterCheckAccessInfoItemVo access_info; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckResponseVo.java new file mode 100644 index 0000000..59de884 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/RegisterCheckResponseVo.java @@ -0,0 +1,15 @@ +package com.yzt.common.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 获取接入状态 response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class RegisterCheckResponseVo extends BaseResultResponseVo { + + private RegisterCheckDataItemnVo data; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/RoutineMyTemplateVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/RoutineMyTemplateVo.java new file mode 100644 index 0000000..d4fb1e5 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/RoutineMyTemplateVo.java @@ -0,0 +1,33 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信小程序订阅消息Vo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RoutineMyTemplateVo对象", description="微信小程序订阅消息Vo对象") +public class RoutineMyTemplateVo { + + @ApiModelProperty(value = "模板ID") + private String priTmplId; + + @ApiModelProperty(value = "模板标题") + private String title; + + @ApiModelProperty(value = "模板内容") + private String content; + + @ApiModelProperty(value = "模板示例") + private String example; + + @ApiModelProperty(value = "类型") + private String type; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/RoutineTemplateKeyVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/RoutineTemplateKeyVo.java new file mode 100644 index 0000000..a81ab32 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/RoutineTemplateKeyVo.java @@ -0,0 +1,31 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信小程序订阅消息Vo对象(从微信获取的) + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RoutineTemplateKeyVo对象", description="微信小程序订阅消息KeyVo对象(从微信获取的)") +public class RoutineTemplateKeyVo { + + @ApiModelProperty(value = "关键词 id,选用模板时需要") + private Integer kid; + + @ApiModelProperty(value = "关键词内容") + private String name; + + @ApiModelProperty(value = "关键词内容对应的示例") + private String example; + + @ApiModelProperty(value = "参数类型") + private String rule; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SecondCatVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SecondCatVo.java new file mode 100644 index 0000000..f2a2832 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SecondCatVo.java @@ -0,0 +1,22 @@ +package com.yzt.common.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 第二级类目 + * + **/ +@Data +public class SecondCatVo { + + /** 二级类目ID */ + private Integer secondCatId; + + /** 二级类目名称 */ + private String secondCatName; + + /** 三级类目数组 */ + private List thirdCatList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SendProgramTemplateMessageItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SendProgramTemplateMessageItemVo.java new file mode 100644 index 0000000..2d20b6d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SendProgramTemplateMessageItemVo.java @@ -0,0 +1,25 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信模板发送数据类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SendTemplateMessageItemVo对象", description="微信模板发送数据类") +public class SendProgramTemplateMessageItemVo { + public SendProgramTemplateMessageItemVo() {} + public SendProgramTemplateMessageItemVo(String value) { + this.value = value; + } + + @ApiModelProperty(value = "显示的文字内容", required = true) + private String value; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SendSmsVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SendSmsVo.java new file mode 100644 index 0000000..2317851 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SendSmsVo.java @@ -0,0 +1,25 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 短信发送api第三方参数实体类 + * + */ +@Data +public class SendSmsVo { + private String uid; + private String token; + + // 待发送短信手机号 + private String mobile; + + // 模版id + private Integer template; + + // 发送参数 + private String param; + + private String content; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SendTemplateMessageItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SendTemplateMessageItemVo.java new file mode 100644 index 0000000..fdb1771 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SendTemplateMessageItemVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信模板发送数据类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SendTemplateMessageItemVo对象", description="微信模板发送数据类") +public class SendTemplateMessageItemVo { + public SendTemplateMessageItemVo() {} + public SendTemplateMessageItemVo(String value) { + this.value = value; + } + + @ApiModelProperty(value = "显示的文字内容", required = true) + private String value; + + @ApiModelProperty(value = "颜色") + private String color = "#173177"; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleAddVo.java new file mode 100644 index 0000000..d8f9c04 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleAddVo.java @@ -0,0 +1,47 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 创建售后Vo对象 + * fw_ + */ +@Data +public class ShopAftersaleAddVo { + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 商家自定义售后ID,与aftersale_id二选一 */ + @TableField(value = "out_aftersale_id") + private String outAftersaleId; + + /** 商家小程序该售后单的页面path,不存在则使用订单path */ + private String path; + + /** 用户的openid */ + private String openid; + + /** 售后类型,1:退款,2:退款退货,3:换货 */ + private Integer type; + + /** 发起申请时间,yyyy-MM-dd HH:mm:ss */ + @TableField(value = "create_time") + private String createTime; + + /** 0:未受理,1:用户取消,2:商家受理中,3:商家逾期未处理,4:商家拒绝退款,5:商家拒绝退货退款,6:待买家退货,7:退货退款关闭,8:待商家收货,11:商家退款中,12:商家逾期未退款,13:退款完成,14:退货退款完成 */ + private Integer status; + + /** 0:订单可继续售后, 1:订单无继续售后 */ + @TableField(value = "finish_all_aftersale") + private Integer finishAllAftersale; + + /** 退货相关商品列表 */ + @TableField(value = "product_infos") + private List productInfos; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleUpdateVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleUpdateVo.java new file mode 100644 index 0000000..826e7d1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleUpdateVo.java @@ -0,0 +1,31 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 创建售后Vo对象 + * fw_ + */ +@Data +public class ShopAftersaleUpdateVo { + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 商家自定义售后ID */ + @TableField(value = "out_aftersale_id") + private String outAftersaleId; + + /** 用户的openid */ + private String openid; + + /** 0:未受理,1:用户取消,2:商家受理中,3:商家逾期未处理,4:商家拒绝退款,5:商家拒绝退货退款,6:待买家退货,7:退货退款关闭,8:待商家收货,11:商家退款中,12:商家逾期未退款,13:退款完成,14:退货退款完成 */ + private Integer status; + + /** 0:售后未结束, 1:售后结束且订单状态流转 */ + @TableField(value = "finish_all_aftersale") + private Integer finishAllAftersale; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleVo.java new file mode 100644 index 0000000..eacb083 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAftersaleVo.java @@ -0,0 +1,47 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 创建售后Vo对象 + * fw_ + */ +@Data +public class ShopAftersaleVo { + + /** 发起售后的订单ID */ + @TableField(value = "order_id") + private Integer order_id; + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 商家自定义售后ID,与aftersale_id二选一 */ + @TableField(value = "out_aftersale_id") + private String outAftersaleId; + + /** 商家小程序该售后单的页面path,不存在则使用订单path */ + private String path; + + /** 用户的openid */ + private String openid; + + /** 售后类型,1:退款,2:退款退货,3:换货 */ + private Integer type; + + /** 发起申请时间,yyyy-MM-dd HH:mm:ss */ + @TableField(value = "create_time") + private String createTime; + + /** 0:未受理,1:用户取消,2:商家受理中,3:商家逾期未处理,4:商家拒绝退款,5:商家拒绝退货退款,6:待买家退货,7:退货退款关闭,8:待商家收货,11:商家退款中,12:商家逾期未退款,13:退款完成,14:退货退款完成 */ + private String status; + + /** 退货相关商品列表 */ + @TableField(value = "product_infos") + private List product_infos; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemDataVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemDataVo.java new file mode 100644 index 0000000..8aaf581 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemDataVo.java @@ -0,0 +1,97 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 上传品牌信息 参数 Request itemData + * fw_ + */ +@Data +public class ShopAuditBrandRequestItemDataVo { + /** + * 认证审核类型 RegisterType 枚举值 描述 + * 1 国内品牌申请-R标 + * 2 国内品牌申请-TM标 + * 3 海外品牌申请-R标 + * 4 海外品牌申请-TM标 + */ + @NotNull(message = "认证审核类型不能为空") + @TableField(value = "brand_audit_type") + private Integer brandAuditType; + + /** 商标分类:商标共有45个分类,请按商标实际分类上传 例:“1” */ + @NotBlank(message = "商标实际分类不能为空") + @TableField(value = "trademark_type") + private String trademarkType; + + /** + * 品牌经营类型 + * 枚举值 描述 + * 1 自有品牌 + * 2 代理品牌 + * 3 无品牌 + */ + @NotNull(message = "品牌经营类型不能为空") + @TableField(value = "brand_management_type") + private Integer brandManagementType; + + /** + * 商品产地是否进口 + * 枚举值 描述 + * 1 是 + * 2 否 + */ + @NotNull(message = "商品产地是否进口不能为空") + @TableField(value = "commodity_origin_type") + private Integer commodityOriginType; + + /** 商标/品牌词 */ + @NotBlank(message = "商标/品牌词不能为空") + @TableField(value = "brand_wording") + private String brandWording; + + /** 销售授权书(如商持人为自然人,还需提供有其签名的身份证正反面扫描件),图片url/media_id */ + @TableField(value = "sale_authorization") + private List saleAuthorization; + + /** 商标注册证书,图片url/media_id */ + @TableField(value = "trademark_registration_certificate") + private List trademarkRegistrationCertificate; + + /** 商标变更证明,图片url/media_id */ + @TableField(value = "trademark_change_certificate") + private List trademarkChangeCertificate; + + /** 商标注册人姓名 */ + @TableField(value = "trademark_registrant") + private String trademarkRegistrant; + + /** 商标注册号/申请号 */ + @TableField(value = "trademark_registrant_nu") + private String trademarkRegistrantNu; + + /** 商标有效期,yyyy-MM-dd HH:mm:ss */ + @TableField(value = "trademark_authorization_period") + private String trademarkAuthorizationPeriod; + + /** 商标注册申请受理通知书,图片url/media_id */ + @TableField(value = "trademark_registration_application") + private List trademarkRegistrationApplication; + + /** 商标申请人姓名 */ + @TableField(value = "trademark_applicant") + private String trademarkApplicant; + + /** 商标申请时间, yyyy-MM-dd HH:mm:ss */ + @TableField(value = "trademark_application_time") + private String trademarkApplicationTime; + + /** 中华人民共和国海关进口货物报关单,图片url/media_id */ + @TableField(value = "imported_goods_form") + private List importedGoodsForm; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemVo.java new file mode 100644 index 0000000..307bac2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestItemVo.java @@ -0,0 +1,22 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 上传品牌信息 request item + * fw_ + */ +@Data +public class ShopAuditBrandRequestItemVo { + + /** 营业执照或组织机构代码证,图片url/media_id */ + @NotBlank(message = "营业执照或组织机构代码证不能为空") + private String license; + + /** 品牌信息 */ + @TableField(value = "brand_info") + private ShopAuditBrandRequestItemDataVo brandInfo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestVo.java new file mode 100644 index 0000000..756d72d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandRequestVo.java @@ -0,0 +1,16 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 上传品牌信息 request + * fw_ + */ +@Data +public class ShopAuditBrandRequestVo { + + /** 上传品牌信息参数对象 */ + @TableField(value = "audit_req") + private ShopAuditBrandRequestItemVo auditReq; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandResponseVo.java new file mode 100644 index 0000000..9e035ad --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditBrandResponseVo.java @@ -0,0 +1,17 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ShopAuditBrandResponseVo extends BaseResultResponseVo { + // 审核单id + @TableField(value = "audit_id") + private String auditId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemDataVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemDataVo.java new file mode 100644 index 0000000..fee5ce1 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemDataVo.java @@ -0,0 +1,15 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 上传类目资质 itemData + * fw_ + */ +@Data +public class ShopAuditCategoryRequestItemDataVo { + private Integer level1; // 一级类目 + private Integer level2; // 二级类目 + private Integer level3; // 三级类目 + private String certificate; // 资质材料 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemVo.java new file mode 100644 index 0000000..333cf7c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestItemVo.java @@ -0,0 +1,15 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 上传类目资质Item + * fw_ + */ +@Data +public class ShopAuditCategoryRequestItemVo { + // 营业执照或组织机构代码证,图片url + private String license; + // Response ItemData + private ShopAuditCategoryRequestItemDataVo category_info; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestVo.java new file mode 100644 index 0000000..680ad28 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryRequestVo.java @@ -0,0 +1,12 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 上传类目资质Request + * fw_ + */ +@Data +public class ShopAuditCategoryRequestVo { + private ShopAuditCategoryRequestItemVo audit_req; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryResponseVo.java new file mode 100644 index 0000000..7d02df6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditCategoryResponseVo.java @@ -0,0 +1,14 @@ +package com.yzt.common.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 上传类目资质 response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ShopAuditCategoryResponseVo extends BaseResultResponseVo { + private String audit_id; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItem.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItem.java new file mode 100644 index 0000000..285f016 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItem.java @@ -0,0 +1,11 @@ +package com.yzt.common.vo; + +/** + * 获取小程序提交过的入驻资质信息 Item + * fw_ + */ +public class ShopAuditGetMinCerBrandInfoItem { + private Integer errcode; + private ShopAuditGetMinCerBrandInfoItemDataVo brand_info; + // 这个结果需要已返回数据为准,文档中的有出入 +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItemDataVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItemDataVo.java new file mode 100644 index 0000000..742b111 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditGetMinCerBrandInfoItemDataVo.java @@ -0,0 +1,17 @@ +package com.yzt.common.vo; + +import java.util.List; + +/** + * 获取小程序提交过的入驻资质信息 ItemData + * fw_ + */ +public class ShopAuditGetMinCerBrandInfoItemDataVo { + // 品牌名 + private String brand_wording; + // 商标注册证 + private List sale_authorization; + // 商标授权书 + private List trademark_registration_certificate; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditResultResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditResultResponseVo.java new file mode 100644 index 0000000..09926eb --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopAuditResultResponseVo.java @@ -0,0 +1,22 @@ +package com.yzt.common.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 查询审核结果 Response + * fw_ + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ShopAuditResultResponseVo extends BaseResultResponseVo { + + private ItemData data; + + @Data + class ItemData{ + private Integer status; + private Integer brand_id; + private String reject_reason; + } +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopBrandVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopBrandVo.java new file mode 100644 index 0000000..0cc20f4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopBrandVo.java @@ -0,0 +1,21 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * + * fw_ + */ +@Data +public class ShopBrandVo { + + /** 品牌ID */ + @TableField(value = "brand_id") + private Integer brandId; + + /** 品牌名称 */ + @TableField(value = "brand_wording") + private String brandWording; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatDetailVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatDetailVo.java new file mode 100644 index 0000000..733bdd4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatDetailVo.java @@ -0,0 +1,51 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 商品类型详情Vo对象 + * fw_ + */ +@Data +public class ShopCatDetailVo { + + /** 类目ID */ + @TableField(value = "third_cat_id") + private Integer thirdCatId; + + /** 类目名称 */ + @TableField(value = "third_cat_name") + private String thirdCatName; + + /** 类目资质 */ + private String qualification; + + /** 类目资质类型,0:不需要,1:必填,2:选填 */ + @TableField(value = "qualification_type") + private Integer qualificationType; + + /** 商品资质 */ + @TableField(value = "product_qualification") + private String productQualification; + + /** 商品资质类型,0:不需要,1:必填,2:选填 */ + @TableField(value = "product_qualification_type") + private Integer productQualificationType; + + /** 二级类目ID */ + @TableField(value = "second_cat_id") + private Integer secondCatId; + + /** 二级类目名称 */ + @TableField(value = "second_cat_name") + private String secondCatName; + + /** 一级类目ID */ + @TableField(value = "first_cat_id") + private Integer firstCatId; + + /** 一级类目名称 */ + @TableField(value = "first_cat_name") + private String firstCatName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatVo.java new file mode 100644 index 0000000..02f75e4 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopCatVo.java @@ -0,0 +1,26 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 商品类型Vo对象 + * fw_ + */ +@Data +public class ShopCatVo { + + /** 错误码 */ + @TableField(value = "errcode") + private Integer errCode; + + /** 错误信息 */ + @TableField(value = "errmsg") + private Integer errMsg; + + /** 类目列表 */ + @TableField(value = "third_cat_list") + private List thirdCatList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddResultVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddResultVo.java new file mode 100644 index 0000000..d364556 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddResultVo.java @@ -0,0 +1,31 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderAddResultVo { + + /** 交易组件平台订单ID */ + @TableField(value = "order_id") + private Long orderId; + + /** 交易组件平台订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 拉起收银台的ticket */ + private String ticket; + + /** ticket有效截止时间 */ + @TableField(value = "ticket_expire_time") + private String ticketExpireTime; + + /** 订单最终价格(单位:分) */ + @TableField(value = "final_price") + private Long finalPrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddVo.java new file mode 100644 index 0000000..52be944 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddVo.java @@ -0,0 +1,44 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderAddVo { + + /** 创建时间 */ + @TableField(value = "create_time") + private String createTime; + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 用户的openid */ + private String openid; + + /** 商家小程序该订单的页面path,用于微信侧订单中心跳转 */ + private String path; + + /** 下单时小程序的场景值,可通getLaunchOptionsSync或onLaunch/onShow拿到 */ + private Integer scene; + + /** 订单详情 */ + @TableField(value = "order_detail") + private ShopOrderDetailAddVo orderDetail; + + /** 交付详情 */ + @TableField(value = "delivery_detail") + private ShopOrderDeliveryDetailAddVo deliveryDetail; + + /** 地址详情 */ + @TableField(value = "address_info") + private ShopOrderAddressInfoAddVo addressInfo; + + /** 用户id */ + private Integer outUserId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddressInfoAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddressInfoAddVo.java new file mode 100644 index 0000000..92842aa --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderAddressInfoAddVo.java @@ -0,0 +1,36 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderAddressInfoAddVo { + + /** 收件人姓名 */ + @TableField(value = "receiver_name") + private String receiverName; + + /** 详细收货地址信息 */ + @TableField(value = "detailed_address") + private String detailedAddress; + + /** 收件人手机号码 */ + @TableField(value = "tel_number") + private String telNumber; + + /** 国家 */ + private String country; + + /** 省份 */ + private String province; + + /** 城市 */ + private String city; + + /** 乡镇 */ + private String town; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderCommonVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderCommonVo.java new file mode 100644 index 0000000..c3a5c9d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderCommonVo.java @@ -0,0 +1,23 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 自定义交易组件订单公共Vo + * fw_ + */ +@Data +public class ShopOrderCommonVo { + + /** 微信侧订单id (订单id二选一) */ + @TableField(value = "order_id") + private Integer orderId; + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 用户的openid */ + private String openid; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailAddVo.java new file mode 100644 index 0000000..d5fbbec --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailAddVo.java @@ -0,0 +1,16 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderDeliveryDetailAddVo { + + /** 1: 正常快递, 2: 无需快递, 3: 线下配送, 4: 用户自提 ( 默认1) */ + @TableField(value = "delivery_type") + private Integer deliveryType = 1; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailVo.java new file mode 100644 index 0000000..4f0614b --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryDetailVo.java @@ -0,0 +1,26 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderDeliveryDetailVo { + + /** 1: 正常快递, 2: 无需快递, 3: 线下配送, 4: 用户自提 */ + @TableField(value = "delivery_type") + private Integer delivery_type; + + /** 是否发货完成 */ + @TableField(value = "finish_all_delivery") + private Integer finishAllDelivery; + + /** 交付数组 */ + @TableField(value = "delivery_list") + private List deliveryList; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryInfoVo.java new file mode 100644 index 0000000..48a3338 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDeliveryInfoVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderDeliveryInfoVo { + + /** 快递公司ID,通过获取快递公司列表获取 */ + @TableField(value = "delivery_id") + private Integer deliveryId; + + /** 快递单号 */ + @TableField(value = "waybill_id") + private Integer waybillId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailAddVo.java new file mode 100644 index 0000000..e656ea3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailAddVo.java @@ -0,0 +1,26 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderDetailAddVo { + + /** 商品详情数组 */ + @TableField(value = "product_infos") + private List productInfos; + + /** 支付详情数组 */ + @TableField(value = "pay_info") + private ShopOrderPayInfoAddVo payInfo; + + /** 价格详情数组 */ + @TableField(value = "price_info") + private ShopOrderPriceInfoVo priceInfo; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailVo.java new file mode 100644 index 0000000..3dff289 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderDetailVo.java @@ -0,0 +1,34 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderDetailVo { + + /** 商品详情数组 */ + @TableField(value = "product_infos") + private List productInfos; + + /** 支付详情数组,payorder时action_type!=6时存在 */ + @TableField(value = "pay_info") + private ShopOrderPayInfoVo payInfo; + + /** 多用支付详情数组,payorder时action_type=6时存在 */ + @TableField(value = "multi_pay_info") + private ShopOrderPayInfoVo multiPayInfo; + + /** 价格详情数组 */ + @TableField(value = "price_info") + private ShopOrderPriceInfoVo priceInfo; + + /** 价格详情数组,必须调过发货接口才会存在这个字段 */ + @TableField(value = "delivery_detail") + private ShopOrderDeliveryDetailAddVo deliveryDetail; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoAddVo.java new file mode 100644 index 0000000..1478888 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoAddVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderPayInfoAddVo { + + /** 支付方式(目前只有"微信支付") */ + @TableField(value = "pay_method") + private String payMethod; + + /** 支付方式,0,微信支付,1: 货到付款,99: 其他(默认0) */ + @TableField(value = "pay_method_type") + private Integer payMethodType = 0; + + /** 预支付ID */ + @TableField(value = "prepay_id") + private String prepayId; + + /** 预付款时间(拿到prepay_id的时间) */ + @TableField(value = "prepay_time") + private String prepayTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoVo.java new file mode 100644 index 0000000..94de157 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayInfoVo.java @@ -0,0 +1,32 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderPayInfoVo { + + /** 支付方式(目前只有"微信支付") */ + @TableField(value = "pay_method") + private String payMethod; + + /** 预支付ID */ + @TableField(value = "prepay_id") + private String prepayId; + + /** 预付款时间(拿到prepay_id的时间) */ + @TableField(value = "prepay_time") + private Integer prepayTime; + + /** 支付ID */ + @TableField(value = "transaction_id") + private String transactionId; + + /** 付款时间(拿到transaction_id的时间) */ + @TableField(value = "pay_time") + private Integer payTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayVo.java new file mode 100644 index 0000000..89e13d2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPayVo.java @@ -0,0 +1,39 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 同步订单支付结果Vo对象 + * fw_ + */ +@Data +public class ShopOrderPayVo { + + /** 订单ID */ + @TableField(value = "order_id") + private Integer orderId; + + /** 商家自定义订单ID,与 order_id 二选一 */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 用户的openid */ + private String openid; + + /** 类型,默认1:支付成功,2:支付失败,3:用户取消,4:超时未支付;5:商家取消;10:其他原因取消 */ + @TableField(value = "action_type") + private Integer actionType; + + /** 其他具体原因 */ + @TableField(value = "action_remark") + private String actionRemark; + + /** 支付订单号,action_type=1时必填 */ + @TableField(value = "transaction_id") + private String transactionId; + + /** 支付完成时间,action_type=1时必填 */ + @TableField(value = "pay_time") + private String payTime; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPriceInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPriceInfoVo.java new file mode 100644 index 0000000..a827fcf --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderPriceInfoVo.java @@ -0,0 +1,31 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderPriceInfoVo { + + /** 该订单最终的金额(单位:分) */ + @TableField(value = "order_price") + private Long orderPrice; + + /** 运费(单位:分) */ + private Long freight; + + /** 优惠金额(单位:分) */ + @TableField(value = "discounted_price") + private Long discountedPrice; + + /** 附加金额(单位:分) */ + @TableField(value = "additional_price") + private Long additionalPrice; + + /** 附加金额备注 */ + @TableField(value = "additional_remarks") + private String additional_remarks; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoAddVo.java new file mode 100644 index 0000000..7065d77 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoAddVo.java @@ -0,0 +1,38 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderProductInfoAddVo { + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 商家自定义商品skuID,可填空字符串(如果这个product_id下没有sku) */ + @TableField(value = "out_sku_id") + private String outSkuId; + + /** 购买的数量 */ + @TableField(value = "product_cnt") + private Integer productCnt; + + /** 生成订单时商品的售卖价(单位:分),可以跟上传商品接口的价格不一致 */ + @TableField(value = "sale_price") + private Long salePrice; + + /** 生成订单时商品的头图 */ + @TableField(value = "head_img") + private String headImg; + + /** 生成订单时商品的标题 */ + private String title; + + /** 绑定的小程序商品路径 */ + private String path; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoVo.java new file mode 100644 index 0000000..3d1a881 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderProductInfoVo.java @@ -0,0 +1,36 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderProductInfoVo { + + /** 交易组件平台内部商品ID */ + @TableField(value = "product_id") + private String productId; + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 交易组件平台内部skuID,可填0(如果这个product_id下没有sku) */ + @TableField(value = "sku_id") + private String skuId; + + /** 商家自定义商品skuID,可填空字符串(如果这个product_id下没有sku) */ + @TableField(value = "out_sku_id") + private String outSkuId; + + /** 购买的数量 */ + @TableField(value = "product_cnt") + private Integer productCnt; + + /** 生成订单时商品的售卖价(单位:分),可以跟上传商品接口的价格不一致 */ + @TableField(value = "sale_price") + private Long salePrice; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderVo.java new file mode 100644 index 0000000..ae8455c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopOrderVo.java @@ -0,0 +1,30 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 生成订单Vo对象 + * fw_ + */ +@Data +public class ShopOrderVo { + + /** 交易组件平台订单ID */ + @TableField(value = "order_id") + private Integer orderId; + + /** 商家自定义订单ID */ + @TableField(value = "out_order_id") + private String outOrderId; + + /** 订单状态:10-待付款,11-收银台支付完成(自动流转,对商家来说和10同等对待即可),20-待发货,30-待收货,100-完成,200-全部商品售后之后,订单取消,250-用户主动取消/待付款超时取消/商家取消 */ + private Integer status; + + /** 商家小程序该订单的页面path,用于微信侧订单中心跳转 */ + private String path; + + /** 订单详情 */ + @TableField(value = "order_detail") + private ShopOrderDetailAddVo orderDetail; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddResponseVo.java new file mode 100644 index 0000000..2e8c44c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddResponseVo.java @@ -0,0 +1,33 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品添加响应Vo + * fw_ + */ +@Data +public class ShopSpuAddResponseVo { + + /** 交易组件平台内部商品ID */ + @TableField(value = "product_id") + private Integer productId; + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 创建时间 */ + @TableField(value = "create_time") + private String createTime; + + /** 更新时间 */ + @TableField(value = "update_time") + private String updateTime; + + /** sku数组 */ + private List skus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddSkuResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddSkuResponseVo.java new file mode 100644 index 0000000..3383301 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddSkuResponseVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 自定义交易组件商品添加响应Vo + * fw_ + */ +@Data +public class ShopSpuAddSkuResponseVo { + + /** 交易组件平台自定义skuID */ + @TableField(value = "sku_id") + private String skuId; + + /** 商家自定义skuID */ + @TableField(value = "out_sku_id") + private String outSkuId; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddVo.java new file mode 100644 index 0000000..8971f24 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAddVo.java @@ -0,0 +1,55 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品Vo + * fw_ + */ +@Data +public class ShopSpuAddVo { + + /** 商家自定义商品ID(修改时与product_id二选一) */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 交易组件平台内部商品ID */ + @TableField(value = "product_id") + private Integer productId; + + /** 标题 */ + private String title; + + /** 绑定的小程序商品路径 */ + private String path; + + /** 类主图,多张,列表 */ + @TableField(value = "head_img") + private List headImg; + + /** 商品资质图片 */ + @TableField(value = "qualification_pics") + private List qualificationPics; + + /** 商品详情 */ + @TableField(value = "desc_info") + private ShopSpuInfoVo descInfo; + + /** 第三级类目ID */ + @TableField(value = "third_cat_id") + private Integer thirdCatId; + + /** 品牌id */ + @TableField(value = "brand_id") + private Integer brandId; + + /** 预留字段,用于版本控制 */ + @TableField(value = "info_version") + private String infoVersion; + + /** sku数组 */ + private List skus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAuditVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAuditVo.java new file mode 100644 index 0000000..df1b8de --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuAuditVo.java @@ -0,0 +1,29 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 商品审核信息Vo对象 + * fw_ + */ +@Data +public class ShopSpuAuditVo { + + /** 上一次提交时间, yyyy-MM-dd HH:mm:ss */ + @TableField(value = "submit_time") + private String submitTime; + + /** 上一次审核时间, yyyy-MM-dd HH:mm:ss */ + @TableField(value = "audit_time") + private String auditTime; + + /** 拒绝理由,只有edit_status为3时出现 */ + @TableField(value = "reject_reason") + private String rejectReason; + + /** 审核单id */ + @TableField(value = "audit_id") + private String auditId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuCommonVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuCommonVo.java new file mode 100644 index 0000000..8124fef --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuCommonVo.java @@ -0,0 +1,24 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 自定义交易组件商品公共Vo + * fw_ + */ +@Data +public class ShopSpuCommonVo { + + /** 交易组件平台内部商品ID */ + @TableField(value = "product_id") + private Integer productId; + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 默认0:获取线上数据, 1:获取草稿数据 */ + @TableField(value = "need_edit_spu") + private Integer needEditSpu = 0; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuInfoVo.java new file mode 100644 index 0000000..75ca503 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuInfoVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品详情Vo + * fw_ + */ +@Data +public class ShopSpuInfoVo { + + /** 商品详情图文 */ + private String desc; + + /** 商品详情图片 */ + private List imgs; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListRequestVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListRequestVo.java new file mode 100644 index 0000000..8901f1e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListRequestVo.java @@ -0,0 +1,43 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 自定义交易组件商品列表请求Vo + * fw_ + */ +@Data +public class ShopSpuListRequestVo { + + /** 商品线上状态:0-初始值,5-上架,11-自主下架,13-违规下架/风控系统下架 */ + // 选填,不填时获取所有状态商品 + private Integer status; + + /** 开始创建时间,格式yyyy-MM-dd HH:mm:ss */ + @TableField(value = "start_create_time") + private String startCreateTime; + + /** 结束创建时间,格式yyyy-MM-dd HH:mm:ss */ + @TableField(value = "end_create_time") + private String endCreateTime; + + /** 开始更新时间,格式yyyy-MM-dd HH:mm:ss */ + @TableField(value = "start_update_time") + private String startUpdateTime; + + /** 结束更新时间,格式yyyy-MM-dd HH:mm:ss */ + @TableField(value = "end_update_time") + private String endUpdateTime; + + /** 默认0:获取线上数据, 1:获取草稿数据 */ + @TableField(value = "need_edit_spu") + private Integer needEditSpu = 0; + + /** 页号 */ + private Integer page = 1; + + /** 页面大小 */ + @TableField(value = "page_size") + private Integer pageSize = 10; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListResponseVo.java new file mode 100644 index 0000000..5df5d38 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuListResponseVo.java @@ -0,0 +1,21 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品列表请求Vo + * fw_ + */ +@Data +public class ShopSpuListResponseVo { + + /** 总数 */ + @TableField(value = "total_num") + private Integer totalNum; + + /** spu数组 */ + private List spus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuAttrVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuAttrVo.java new file mode 100644 index 0000000..1989c6d --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuAttrVo.java @@ -0,0 +1,20 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +/** + * 自定义交易组件商品SkuAttrVo + * fw_ + */ +@Data +public class ShopSpuSkuAttrVo { + + /** 销售属性key(自定义) */ + @TableField(value = "attr_key") + private String attrKey; + + /** 销售属性value(自定义) */ + @TableField(value = "attr_value") + private String attrValue; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuVo.java new file mode 100644 index 0000000..c886373 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuSkuVo.java @@ -0,0 +1,49 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品SkuVo + * fw_ + */ +@Data +public class ShopSpuSkuVo { + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 商家自定义skuID */ + @TableField(value = "out_sku_id") + private String outSkuId; + + /** sku小图 */ + @TableField(value = "thumb_img") + private String thumbImg; + + /** 售卖价格,以分为单位 */ + @TableField(value = "sale_price") + private Long salePrice; + + /** 市场价格,以分为单位 */ + @TableField(value = "market_price") + private Long marketPrice; + + /** 库存 */ + @TableField(value = "stock_num") + private Integer stockNum; + + /** 条形码 */ + private String barcode; + + /** 商品编码 */ + @TableField(value = "sku_code") + private String skuCode; + + /** 销售属性(自定义) */ + @TableField(value = "sku_attrs") + private List skuAttrs; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuVo.java new file mode 100644 index 0000000..734d926 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ShopSpuVo.java @@ -0,0 +1,66 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; + +import java.util.List; + +/** + * 自定义交易组件商品Vo + * fw_ + */ +@Data +public class ShopSpuVo { + + /** 商家自定义商品ID */ + @TableField(value = "out_product_id") + private String outProductId; + + /** 标题 */ + private String title; + + /** 绑定的小程序商品路径 */ + private String path; + + /** 类主图,多张,列表 */ + @TableField(value = "head_img") + private List headImg; + + /** 商品详情 */ + @TableField(value = "desc_info") + private ShopSpuInfoVo descInfo; + + /** 商品审核信息 */ + @TableField(value = "audit_info") + private ShopSpuAuditVo auditInfo; + + /** 商品线上状态:0-初始值,5-上架,11-自主下架,13-违规下架/风控系统下架 */ + private Integer status; + + /** 商品草稿状态:1-未审核,2-审核中,3-审核失败,4-审核成功 */ + @TableField(value = "edit_status") + private Integer editStatus; + + /** 第三级类目ID */ + @TableField(value = "third_cat_id") + private Integer thirdCatId; + + /** 品牌id */ + @TableField(value = "brand_id") + private Integer brandId; + + /** 预留字段,用于版本控制 */ + @TableField(value = "info_version") + private String infoVersion; + + /** 创建时间 */ + @TableField(value = "create_time") + private String createTime; + + /** 更新时间 */ + @TableField(value = "update_time") + private String updateTime; + + /** sku数组 */ + private List skus; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoOldVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoOldVo.java new file mode 100644 index 0000000..015a772 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoOldVo.java @@ -0,0 +1,42 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 订单购物详情表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderInfoVo对象", description="订单购物详情表") +public class StoreOrderInfoOldVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "订单id") + private Integer orderId; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "购买东西的详细信息") + private OrderInfoDetailVo info; + + @ApiModelProperty(value = "唯一id") + @TableField(value = "`unique`") + private String unique; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoVo.java new file mode 100644 index 0000000..5a678ee --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/StoreOrderInfoVo.java @@ -0,0 +1,42 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 订单详情VO对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="StoreOrderInfoVo对象", description="订单详情VO对象") +public class StoreOrderInfoVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "id") + private Integer id; + + @ApiModelProperty(value = "订单id") + private Integer orderId; + + @ApiModelProperty(value = "商品ID") + private Integer productId; + + @ApiModelProperty(value = "购买东西的详细信息") + private OrderInfoDetailVo info; + + @ApiModelProperty(value = "唯一id") + @TableField(value = "`unique`") + private String unique; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemCityTreeVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemCityTreeVo.java new file mode 100644 index 0000000..4813925 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemCityTreeVo.java @@ -0,0 +1,61 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 分类表 + * + */ +@Data +public class SystemCityTreeVo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "城市id") + private Integer cityId; + + @ApiModelProperty(value = "省市级别") + private Integer level; + + @ApiModelProperty(value = "父级id") + private Integer parentId; + + @ApiModelProperty(value = "区号") + private String areaCode; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "合并名称") + private String mergerName; + + @ApiModelProperty(value = "经度") + private String lng; + + @ApiModelProperty(value = "纬度") + private String lat; + + @ApiModelProperty(value = "是否展示") + private Boolean isShow; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @JsonInclude(JsonInclude.Include.NON_EMPTY) //属性为 空("")[] 或者为 NULL 都不序列化 + private List child = new ArrayList<>(); +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigRegListVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigRegListVo.java new file mode 100644 index 0000000..7bc5a91 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigRegListVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * SystemConfigFormItemConfigRegListVo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemConfigFormItemConfigRegListVo对象", description="item对象验证规则") +public class SystemConfigFormItemConfigRegListVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "正则表达式") + private String pattern; + + @ApiModelProperty(value = "错误提示语") + private String message; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigVo.java new file mode 100644 index 0000000..747bb2a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemConfigVo.java @@ -0,0 +1,67 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * item对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemConfigFormItemVo对象", description="item对象") +public class SystemConfigFormItemConfigVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "") + private String label; + + @ApiModelProperty(value = "") + private String showLabel; + + @ApiModelProperty(value = "") + private String changeTag; + + @ApiModelProperty(value = "") + private String labelWidth; + + @ApiModelProperty(value = "") + private String tag; + + @ApiModelProperty(value = "") + private String tagIcon; + + @ApiModelProperty(value = "") + private String span; + + @ApiModelProperty(value = "") + private String layout; + + @ApiModelProperty(value = "") + private Boolean required; + + @ApiModelProperty(value = "验证规则") + private List regList; + + @ApiModelProperty(value = "") + private String document; + + @ApiModelProperty(value = "") + private String formId; + + @ApiModelProperty(value = "") + private String renderKey; + + @ApiModelProperty(value = "") + private String defaultValue; + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemVo.java new file mode 100644 index 0000000..59990f9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormItemVo.java @@ -0,0 +1,46 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * item对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemConfigFormItemVo对象", description="item对象") +public class SystemConfigFormItemVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "配置") + private SystemConfigFormItemConfigVo __config__; + + @ApiModelProperty(value = "") + private String placeholder; + + @ApiModelProperty(value = "") + private String step; + + @ApiModelProperty(value = "") + private String stepStrictly; + + @ApiModelProperty(value = "") + private String controlsPosition; + + @ApiModelProperty(value = "") + private String disabled; + + @ApiModelProperty(value = "") + private String __vModel__; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormVo.java new file mode 100644 index 0000000..c5177e3 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemConfigFormVo.java @@ -0,0 +1,59 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * SystemConfigFormVo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemConfigFormVo对象", description="form对象") +public class SystemConfigFormVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "表单名称") + private String formRef; + + @ApiModelProperty(value = "form对象") + private String formModel; + + @ApiModelProperty(value = "大小") + private String size; + + @ApiModelProperty(value = "label位置") + private String labelPosition; + + @ApiModelProperty(value = "label宽度") + private String labelWidth; + + @ApiModelProperty(value = "form规则") + private String formRules; + + @ApiModelProperty(value = "") + private String gutter; + + @ApiModelProperty(value = "是否禁用") + private String disabled; + + @ApiModelProperty(value = "span") + private String span; + + @ApiModelProperty(value = "button") + private String formBtns; + + @ApiModelProperty(value = "字段值列表") + private List fields; + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataRechargeConfigVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataRechargeConfigVo.java new file mode 100644 index 0000000..af444b9 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataRechargeConfigVo.java @@ -0,0 +1,33 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 签到记录 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemGroupDataSignConfigVo对象", description="签到记录") +public class SystemGroupDataRechargeConfigVo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id") + private Integer id; + + @ApiModelProperty(value = "售价") + private BigDecimal price; + + @ApiModelProperty(value = "赠送") + private BigDecimal giveMoney; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataSignConfigVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataSignConfigVo.java new file mode 100644 index 0000000..2a6fe1e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemGroupDataSignConfigVo.java @@ -0,0 +1,43 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 签到记录 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SystemGroupDataSignConfigVo对象", description="签到记录") +public class SystemGroupDataSignConfigVo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id") + private Integer id; + + @ApiModelProperty(value = "显示文字") + private String title; + + @ApiModelProperty(value = "第几天") + private Integer day; + + + @ApiModelProperty(value = "积分") + private Integer integral; + + @ApiModelProperty(value = "经验") + private Integer experience; + + + + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/SystemStoreNearVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/SystemStoreNearVo.java new file mode 100644 index 0000000..4223747 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/SystemStoreNearVo.java @@ -0,0 +1,76 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门店自提 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_system_store") +@ApiModel(value="SystemStoreNearVo对象", description="门店自提") +public class SystemStoreNearVo implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "门店名称") + private String name; + + @ApiModelProperty(value = "简介") + private String introduction; + + @ApiModelProperty(value = "手机号码") + private String phone; + + @ApiModelProperty(value = "省市区") + private String address; + + @ApiModelProperty(value = "详细地址") + private String detailedAddress; + + @ApiModelProperty(value = "门店logo") + private String image; + + @ApiModelProperty(value = "纬度") + private String latitude; + + @ApiModelProperty(value = "经度") + private String longitude; + + @ApiModelProperty(value = "核销有效日期") + private String validTime; + + @ApiModelProperty(value = "每日营业开关时间") + private String dayTime; + + @ApiModelProperty(value = "是否显示") + private Boolean isShow; + + @ApiModelProperty(value = "是否删除") + private Boolean isDel; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "距离,单位米") + private String distance; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/TemplateMessageVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/TemplateMessageVo.java new file mode 100644 index 0000000..2926e01 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/TemplateMessageVo.java @@ -0,0 +1,31 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.HashMap; + +/** + * 微信模板发送类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SendTemplateMessageVo对象", description="微信模板发送类") +public class TemplateMessageVo { + @ApiModelProperty(value = "OPENID", required = true) + private String touser; + + @ApiModelProperty(value = "模板ID", required = true) + private String template_id; + + @ApiModelProperty(value = "模板跳转链接(海外帐号没有跳转能力)") + private String url; + + @ApiModelProperty(value = "发送内容") + private HashMap data; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/TenantVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/TenantVo.java new file mode 100644 index 0000000..e8ef93a --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/TenantVo.java @@ -0,0 +1,91 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +@Data +public class TenantVo { + @ApiModelProperty("租户") + private Long tenantId; + + @ApiModelProperty("租户名称") + private String tenantName; + + @ApiModelProperty("租户简介") + private String introduction; + + @ApiModelProperty("状态 1正常 0停用/废弃") + private Integer status; + + @ApiModelProperty("租户名称(英文)") + private String tenantNameEn; + + @ApiModelProperty("租户编码") + private String code; + + @ApiModelProperty("租户供应商编码") + private String supplierCode; + + @ApiModelProperty("营业执照") + private String creditCode; + + @ApiModelProperty("法人") + private String person; + + @ApiModelProperty("营业执照") + private String licenseUrl; + + @ApiModelProperty("地址") + private String address; + + @ApiModelProperty("地址(英文)") + private String addressEn; + + @ApiModelProperty("用户数量") + private Integer userCount; + + @ApiModelProperty("企业logo") + private String logo; + + @ApiModelProperty("有效期") + private LocalDate expireDate; + + @ApiModelProperty("业务员(后台员工)") + private Long businessStaff; + + @ApiModelProperty("创建时间-开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty("创建时间-结束时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + @ApiModelProperty("创建人员") + private Long createdBy; + + @ApiModelProperty("协助内容") + private String helpContent; + + @ApiModelProperty("收款码") + private String wechatPayQrUrl; + + @ApiModelProperty("公司电话") + private String phone; + + @ApiModelProperty(value = "等级名称") + private String levelName; + + @ApiModelProperty(value = "商户配置") + WechatMerchantConfigVo wechatMerchantConfigVo; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/ThirdCatVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/ThirdCatVo.java new file mode 100644 index 0000000..e7aaec6 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/ThirdCatVo.java @@ -0,0 +1,30 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 第三级类目 + * fw_ + */ +@Data +public class ThirdCatVo { + + /** 类目ID */ + private Integer thirdCatId; + + /** 类目名称 */ + private String thirdCatName; + + /** 类目资质 */ + private String qualification; + + /** 类目资质类型,0:不需要,1:必填,2:选填 */ + private Integer qualificationType; + + /** 商品资质 */ + private String productQualification; + + /** 商品资质类型,0:不需要,1:必填,2:选填 */ + private Integer productQualificationType; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/UploadCommonVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/UploadCommonVo.java new file mode 100644 index 0000000..641146e --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/UploadCommonVo.java @@ -0,0 +1,28 @@ +package com.yzt.common.vo; + +import lombok.Data; + +/** + * 文件公共上传对象 + * + * + */ +@Data +public class UploadCommonVo { + + //服务器存储地址 + private String rootPath; + + //类型 + private String type; + + //模块 + private String modelPath; + + //扩展名 + private String extStr; + + //文件大小上限 + private int size; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/UserFundsMonitor.java b/fightwine-common/src/main/java/com/yzt/common/vo/UserFundsMonitor.java new file mode 100644 index 0000000..0d7f495 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/UserFundsMonitor.java @@ -0,0 +1,51 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 用户充值对象类 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserFundsMonitor对象", description="佣金") +public class UserFundsMonitor implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "充值用户UID") + private Integer uid; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "账户余额") + private BigDecimal nowMoney; + + @ApiModelProperty(value = "账户佣金") + private BigDecimal brokerage; + + @ApiModelProperty(value = "账户总佣金") + private BigDecimal totalBrokerage; + + @ApiModelProperty(value = "提现总金额") + private BigDecimal totalExtract; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "推广员UID") + private Integer spreadUid; + + @ApiModelProperty(value = "推广员昵称") + private String spreadName; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/UserSignMonthVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/UserSignMonthVo.java new file mode 100644 index 0000000..65b389c --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/UserSignMonthVo.java @@ -0,0 +1,37 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 签到记录表 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("fw_user_sign") +@ApiModel(value="UserSign对象", description="签到记录表") +public class UserSignMonthVo implements Serializable { + + private static final long serialVersionUID=1L; + + public UserSignMonthVo() {} + public UserSignMonthVo(String month, List list) { + this.month = month; + this.list = list; + } + + @ApiModelProperty(value = "月") + private String month; + + @ApiModelProperty(value = "签到列表") + private List list; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/UserSignVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/UserSignVo.java new file mode 100644 index 0000000..6745a32 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/UserSignVo.java @@ -0,0 +1,40 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 签到记录对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserSignVo对象", description="签到记录对象") +public class UserSignVo implements Serializable { + + private static final long serialVersionUID=1L; + + public UserSignVo(String title, Integer number, Date createDay) { + this.title = title; + this.number = number; + this.createDay = createDay; + } + + @ApiModelProperty(value = "签到说明") + private String title; + + @ApiModelProperty(value = "获得积分") + private Integer number; + + @ApiModelProperty(value = "签到日期") + @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") + private Date createDay; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/VirtualRemarkVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/VirtualRemarkVo.java new file mode 100644 index 0000000..8e647ff --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/VirtualRemarkVo.java @@ -0,0 +1,54 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author: pengsz + * @Date: 2025/11/21 + * @Description: + */ +/** + * 虚拟商品参会人信息(用于下单请求) + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(description = "虚拟商品参会人信息") +public class VirtualRemarkVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "ID", example = "36", required = true) + private Integer id; + + @ApiModelProperty(value = "属性规格", example = "", required = true) + private String sku; + + @ApiModelProperty(value = "商品productID", example = "36", required = true) + private Long prodId; + + @ApiModelProperty(value = "属性规格ID(attrID)", example = "36", required = true) + private Long skuId; + + @ApiModelProperty(value = "参会人姓名", example = "郑先生", required = true) + private String realName; + + @NotBlank(message = "手机号不能为空") + private String phone; + + @ApiModelProperty(value = "性别:1=男,2=女") + private Integer sex; // 1=男, 2=女 + + @ApiModelProperty(value = "用户等级") + private String type; + + @ApiModelProperty(value = "省市区(格式:省 市 区)") + private String proCity; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAccessTokenVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAccessTokenVo.java new file mode 100644 index 0000000..88a7a30 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAccessTokenVo.java @@ -0,0 +1,48 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 小程序accessTokenVo对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WeChatAccessTokenVo", description="微信accessTokenVo对象") +public class WeChatAccessTokenVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "获取到的凭证") + @TableField(value = "access_token") + private String accessToken; + + @ApiModelProperty(value = "凭证有效时间,单位:秒。目前是7200秒之内的值。") + @TableField(value = "expires_in") + private Integer expiresIn; + + @ApiModelProperty(value = "错误码") + @TableField(value = "errcode") + private Integer errCode; + + @ApiModelProperty(value = "错误信息") + @TableField(value = "errmsg") + private String errMsg; + + /** + * errcode 的合法值 + * -1 系统繁忙,此时请开发者稍候再试 + * 0 请求成功 + * 40001 AppSecret 错误或者 AppSecret 不属于这个小程序,请开发者确认 AppSecret 的正确性 + * 40002 请确保 grant_type 字段值为 client_credential + * 40013 不合法的 AppID,请开发者检查 AppID 的正确性,避免异常字符,注意大小写 + */ +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAuthorizeLoginUserInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAuthorizeLoginUserInfoVo.java new file mode 100644 index 0000000..1827cf2 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatAuthorizeLoginUserInfoVo.java @@ -0,0 +1,54 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 获取微信用户信息 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WeChatAuthorizeLoginUserInfoVo对象", description="获取微信用户信息") +public class WeChatAuthorizeLoginUserInfoVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "用户的唯一标识") + @TableField(value = "openId") + private String openId; + + @ApiModelProperty(value = "用户昵称") + @TableField(value = "nickname") + private String nickName; + + @ApiModelProperty(value = "性别") + private String sex; + + @ApiModelProperty(value = "用户个人资料填写的省份") + private String province; + + @ApiModelProperty(value = "普通用户个人资料填写的城市") + private String city; + + @ApiModelProperty(value = "国家,如中国为CN") + private String country; + + @ApiModelProperty(value = "用户头像") + private String headimgurl; + + @ApiModelProperty(value = "用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)") + private String privilege; + + @ApiModelProperty(value = "只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。") + @TableField(value = "unionid") + private String unionId; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WeChatMiniAuthorizeVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatMiniAuthorizeVo.java new file mode 100644 index 0000000..5194066 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WeChatMiniAuthorizeVo.java @@ -0,0 +1,43 @@ +package com.yzt.common.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 微信小程序用户授权返回数据 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WeChatMiniAuthorizeVo对象", description="微信小程序用户授权返回数据") +public class WeChatMiniAuthorizeVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "会话密钥") + @TableField(value = "session_key") + private String sessionKey; + + @ApiModelProperty(value = "用户唯一标识") + @TableField(value = "openid") + private String openId; + + @ApiModelProperty(value = "用户在开放平台的唯一标识符,若当前小程序已绑定到微信开放平台帐号下会返回") + @TableField(value = "unionid") + private String unionId; + + @ApiModelProperty(value = "错误码") + @TableField(value = "errcode") + private String errCode; + + @ApiModelProperty(value = "错误信息") + @TableField(value = "errmsg") + private String errMsg; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WechatMerchantConfigVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WechatMerchantConfigVo.java new file mode 100644 index 0000000..1e24b25 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WechatMerchantConfigVo.java @@ -0,0 +1,46 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +@Data +@ApiModel("微信商户配置 - 请求与响应VO") +public class WechatMerchantConfigVo { + + @NotBlank(message = "商户号不能为空") + @ApiModelProperty(value = "微信商户号(mch_id)", required = true) + private String mchId; + +// @NotBlank(message = "AppId不能为空") + @ApiModelProperty(value = "AppId", required = true) + private String appid; + + // 前端传入的明文密钥(仅用于保存) + @ApiModelProperty(value = "API密钥(明文,仅用于提交)") + private String apiKey; + + @ApiModelProperty(value = "商户证书文件路径或ID") + private String certFilePath; + + @ApiModelProperty(value = "私钥文件路径或ID") + private String privateKeyFilePath; + + @ApiModelProperty(value = "APIv证书序列号") + private String serialNo; + +// @NotNull(message = "状态不能为空") + @ApiModelProperty(value = "状态:1-启用,0-禁用", example = "1") + private Integer status; + + @ApiModelProperty(value = "备注") + private String remark; +} \ No newline at end of file diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageInfoVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageInfoVo.java new file mode 100644 index 0000000..ada24da --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageInfoVo.java @@ -0,0 +1,17 @@ +package com.yzt.common.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + * fw_ + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class WechatVideoUploadImageInfoVo extends BaseResultResponseVo { + + private String media_id; + private String temp_img_url; + private String pay_media_id; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageResponseVo.java new file mode 100644 index 0000000..1f28e86 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WechatVideoUploadImageResponseVo.java @@ -0,0 +1,15 @@ +package com.yzt.common.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + * fw_ + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class WechatVideoUploadImageResponseVo extends BaseResultResponseVo { + + private WechatVideoUploadImageInfoVo img_info; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WxPayJsResultVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WxPayJsResultVo.java new file mode 100644 index 0000000..76a9af0 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WxPayJsResultVo.java @@ -0,0 +1,41 @@ +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 微信调起支付参数对象 + * fw_ + */ +@Data +@ApiModel(value="WxPayJsResultVo对象", description="微信调起支付参数对象") +public class WxPayJsResultVo { + + @ApiModelProperty(value = "微信分配的小程序ID") + private String appId; + + @ApiModelProperty(value = "随机字符串,不长于32位") + private String nonceStr; + + @ApiModelProperty(value = "统一下单接口返回的 prepay_id 参数值") + private String packages; + + @ApiModelProperty(value = "签名类型,默认为MD5,支持HMAC-SHA256和MD5。") + private String signType; + + @ApiModelProperty(value = "时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间") + private String timeStamp; + + @ApiModelProperty(value = "支付签名") + private String paySign; + + @ApiModelProperty(value = "H5支付跳转链接") + private String mwebUrl; + + @ApiModelProperty(value = "微信商户号") + private String partnerid; + + @ApiModelProperty(value = "拉起收银台的ticket") + private String ticket; +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundResponseVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundResponseVo.java new file mode 100644 index 0000000..dc41c45 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundResponseVo.java @@ -0,0 +1,102 @@ +package com.yzt.common.vo; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 微信退款返回对象 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WxRefundResponseVo", description="微信退款返回对象") +public class WxRefundResponseVo { + @ApiModelProperty(value = "SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查看trade_state来判断") + @JsonProperty(value = "return_code") + private String returnCode; + + @ApiModelProperty(value = "当return_code为FAIL时返回信息为错误原因 ,例如 签名失败 参数格式校验错误") + @JsonProperty(value = "return_msg") + private String returnMsg; + + @ApiModelProperty(value = "SUCCESS/FAIL 业务结果") + @JsonProperty(value = "result_code") + private String resultCode; + + @ApiModelProperty(value = "详细参见错误列表") + @JsonProperty(value = "err_code") + private String errCode; + + @ApiModelProperty(value = "错误返回的信息描述") + @JsonProperty(value = "err_code_des") + private String errCodeDes; + + @ApiModelProperty(value = "调用接口提交的公众账号ID") + @JsonProperty(value = "appid") + private String appId; + + @ApiModelProperty(value = "调用接口提交的商户号") + @JsonProperty(value = "mch_id") + private String mchId; + + @ApiModelProperty(value = "微信返回的随机字符串") + @JsonProperty(value = "nonce_str") + private String nonceStr; + + @ApiModelProperty(value = "微信返回的签名") + private String sign; + + @ApiModelProperty(value = "微信支付订单号") + @JsonProperty(value = "transaction_id") + private String transactionId; + + @ApiModelProperty(value = "商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号", required = true) + @JsonProperty(value = "out_trade_no") + private String outTradeNo; + + @ApiModelProperty(value = "商户退款单号,同一退款单号多次请求只退一笔。") + @JsonProperty(value = "out_refund_no") + private String outRefundNo; + + @ApiModelProperty(value = "微信退款单号") + @JsonProperty(value = "refund_id") + private String refundId; + + @ApiModelProperty(value = "退款总金额,单位为分,可以做部分退款") + @JsonProperty(value = "refund_fee") + private Integer refundFee; + + @ApiModelProperty(value = "应结退款金额") + @JsonProperty(value = "settlement_refund_fee") + private Integer settlementRefundFee; + + @ApiModelProperty(value = "标价金额") + @JsonProperty(value = "total_fee") + private Integer totalFee; + + @ApiModelProperty(value = "应结订单金额") + @JsonProperty(value = "settlement_total_fee") + private Integer settlementTotalFee; + + @ApiModelProperty(value = "标价币种,订单金额货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型") + @JsonProperty(value = "fee_type") + private String feeType; + + @ApiModelProperty(value = "现金支付金额") + @JsonProperty(value = "cash_fee") + private Integer cashFee; + + @ApiModelProperty(value = "现金支付币种,订单金额货币类型,符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型") + @JsonProperty(value = "cash_fee_type") + private String cashFeeType; + + @ApiModelProperty(value = "现金退款金额") + @JsonProperty(value = "cash_refund_fee") + private Integer cashRefundFee; + +} diff --git a/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundVo.java b/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundVo.java new file mode 100644 index 0000000..1120a06 --- /dev/null +++ b/fightwine-common/src/main/java/com/yzt/common/vo/WxRefundVo.java @@ -0,0 +1,57 @@ + +package com.yzt.common.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 调用微信退款所需要的参数 + * + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="WxRefundVo", description="调用微信退款所需要的参数") +public class WxRefundVo { + + @ApiModelProperty(value = "appId,公众号名称,由商户传入", required = true) + private String appid; + + @ApiModelProperty(value = "直连商户的商户号,由微信支付生成并下发", required = true) + private String mch_id; + + @ApiModelProperty(value = "随机字符串,不长于32位", required = true) + private String nonce_str; + + @ApiModelProperty(value = "签名", required = true) + private String sign; + + @ApiModelProperty(value = "签名类型,目前支持HMAC-SHA256和MD5,默认为MD5") + private String sign_type = "MD5"; + + @ApiModelProperty(value = "微信支付订单号:微信生成的订单号,在支付通知中有返回") + private String transaction_id; + + @ApiModelProperty(value = "商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号", required = true) + private String out_trade_no; + + @ApiModelProperty(value = "商户退款单号,同一退款单号多次请求只退一笔。") + private String out_refund_no; + + @ApiModelProperty(value = "订单总金额,单位为分", required = true) + private int total_fee; + + @ApiModelProperty(value = "退款金额,单位为分", required = true) + private int refund_fee; + + @ApiModelProperty(value = "退款货币种类:符合ISO 4217标准的三位字母代码,默认人民币:CNY,其他值列表详见货币类型") + private String refund_fee_type = "CNY"; + + @ApiModelProperty(value = "退款结果通知url") + private String notify_url; + +} + diff --git a/fightwine-front/pom.xml b/fightwine-front/pom.xml new file mode 100644 index 0000000..5975266 --- /dev/null +++ b/fightwine-front/pom.xml @@ -0,0 +1,94 @@ + + + 4.0.0 + + com.yzt.fightwine + yzt-fightwine + 1.0-SNAPSHOT + + + fightwine-front + jar + + + 21 + 21 + UTF-8 + + + + + com.yzt.fightwine + fightwine-service + 1.0-SNAPSHOT + + + + org.projectlombok + lombok + + + + + + fightwine-front + + + org.springframework.boot + spring-boot-maven-plugin + 2.7.13 + + + + repackage + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + true + + woff + woff2 + eot + ttf + svg + xdb + + + + + + + + src/main/resources + true + + + + + src/main/java + + **/*.xml + + + + true + src/main/resources + + **/*.woff + **/*.ttf + **/*.eot + **/*.svg + ip2region/ip2region.xdb + + + + + \ No newline at end of file diff --git a/fightwine-front/src/main/java/com/yzt/front/YztFrontApplication.java b/fightwine-front/src/main/java/com/yzt/front/YztFrontApplication.java new file mode 100644 index 0000000..dd229f8 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/YztFrontApplication.java @@ -0,0 +1,28 @@ +package com.yzt.front; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * 程序主入口 + * + */ +@EnableAsync //开启异步调用 +@EnableSwagger2 +@Configuration +@EnableTransactionManagement +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) //去掉数据源 +@ComponentScan(basePackages = {"com.yzt", "com.yzt.front"}) +@MapperScan(basePackages = {"com.yzt.**.mapper"}) +public class YztFrontApplication { + public static void main(String[] args) { + SpringApplication.run(YztFrontApplication.class, args); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/CloseSecurityConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/CloseSecurityConfig.java new file mode 100644 index 0000000..24b38d1 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/CloseSecurityConfig.java @@ -0,0 +1,23 @@ +package com.yzt.front.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +/** + * 访问接口不在调用security + */ +@Configuration +@EnableWebSecurity +public class CloseSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + //super.configure(http); + http.csrf().disable(); + //配置不需要登陆验证 + http.authorizeRequests().anyRequest().permitAll().and().logout().permitAll(); + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/CorsConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/CorsConfig.java new file mode 100644 index 0000000..853ace9 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/CorsConfig.java @@ -0,0 +1,28 @@ +package com.yzt.front.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** 跨域配置 + * fw_ + */ +@Configuration +public class CorsConfig{ + private CorsConfiguration buildConfig() { + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); //允许任何域名 + corsConfiguration.addAllowedHeader("*"); //允许任何头 + corsConfiguration.addAllowedMethod("*"); //允许任何方法 + return corsConfiguration; + } + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", buildConfig()); //注册 + return new CorsFilter(source); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/DruidConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/DruidConfig.java new file mode 100644 index 0000000..8911cd4 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/DruidConfig.java @@ -0,0 +1,50 @@ +package com.yzt.front.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * Druid配置组件 + * + */ +@Configuration +public class DruidConfig { + + @Bean + public ServletRegistrationBean druidServlet() { // 主要实现WEB监控的配置处理 + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); // 进行druid监控的配置处理操作 +// servletRegistrationBean.addInitParameter("allow", +// "127.0.0.1,192.168.1.159"); // 白名单 +// servletRegistrationBean.addInitParameter("deny", "192.168.1.200"); // 黑名单 + servletRegistrationBean.addInitParameter("loginUsername", "kf"); // 用户名 + servletRegistrationBean.addInitParameter("loginPassword", "654321"); // 密码 + servletRegistrationBean.addInitParameter("resetEnable", "true"); // 是否可以重置数据源 + return servletRegistrationBean; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + + filterRegistrationBean.addUrlPatterns("/*"); // 所有请求进行监控处理 + //不必监控的请求 + filterRegistrationBean.addInitParameter("exclusions", "*.html,*.png,*.ico,*.js,*.gif,*.jpg,*.css,/druid/*"); + return filterRegistrationBean; + } + + @Bean("dataSource") + @ConfigurationProperties(prefix = "spring.datasource") + public DataSource druidDataSource() { + return new DruidDataSource(); + } +} + diff --git a/fightwine-front/src/main/java/com/yzt/front/config/JacksonConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/JacksonConfig.java new file mode 100644 index 0000000..5fe79c3 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/JacksonConfig.java @@ -0,0 +1,28 @@ +package com.yzt.front.config; + +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.math.BigDecimal; + +/** + * Jackjson配置组件 + * + */ +@Configuration +public class JacksonConfig { + + /** + * Jackson全局转化BigDecimal类型为String,解决jackson序列化时BigDecimal类型缺失精度问题 + * + * @return Jackson2ObjectMapperBuilderCustomizer 注入的对象 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.serializerByType(BigDecimal.class, ToStringSerializer.instance); + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/RestTemplateConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/RestTemplateConfig.java new file mode 100644 index 0000000..b6e0125 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/RestTemplateConfig.java @@ -0,0 +1,47 @@ +package com.yzt.front.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * RestTemplate配置组件 + * + */ +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + RestTemplate restTemplate = new RestTemplate(factory); + restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter()); + return restTemplate; + } + + @Bean + public ClientHttpRequestFactory httpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(10000);//ms + factory.setConnectTimeout(15000);//ms + return factory; + } + + //解决微信返回json Content-Type 值却是 text/plain 的问题 + public class WxMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { + public WxMappingJackson2HttpMessageConverter(){ + List mediaTypes = new ArrayList<>(); + mediaTypes.add(MediaType.TEXT_PLAIN); + mediaTypes.add(MediaType.TEXT_HTML); + setSupportedMediaTypes(mediaTypes); + } + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/SwaggerConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/SwaggerConfig.java new file mode 100644 index 0000000..cdfb667 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/SwaggerConfig.java @@ -0,0 +1,122 @@ +package com.yzt.front.config; + +import com.google.common.base.Predicate; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +import static com.google.common.collect.Lists.newArrayList; + +/** + * Swagger配置组件 + * + */ +@Configuration +@EnableSwagger2 +@ConfigurationProperties(prefix = "api.doc") +public class SwaggerConfig{ + + //是否开启swagger,正式环境一般是需要关闭的,可根据springboot的多环境配置进行设置 + Boolean swaggerEnabled = true; + + @Autowired + YztConfig yztConfig; + + @Bean("front") + public Docket create1RestApis() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("front") + .host(yztConfig.getDomain()) + .apiInfo(apiInfo()) + // 是否开启 + .enable(swaggerEnabled) + .select() + // 扫描的路径包 + .apis(RequestHandlerSelectors.basePackage("com.yzt.front")) + // 指定路径处理PathSelectors.any()代表所有的路径 + .paths(frontPathsAnt()) //只监听 + .build() + .securitySchemes(security()) + .securityContexts(securityContexts()) +// .globalOperationParameters(pars) // 针对单个url的验证 如果需要的话 + .pathMapping("/"); + } + + @Bean("public") + public Docket create2RestApis() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("public") + .host(yztConfig.getDomain()) + .apiInfo(apiInfo()) + // 是否开启 + .enable(swaggerEnabled) + .select() + // 扫描的路径包 + .apis(RequestHandlerSelectors.basePackage("com.yzt.front")) + // 指定路径处理PathSelectors.any()代表所有的路径 + .paths(publicPathsAnt()) //只监听 + .build() + .securitySchemes(security()) + .securityContexts(securityContexts()) +// .globalOperationParameters(pars) // 针对单个url的验证 如果需要的话 + .pathMapping("/"); + } + + private Predicate frontPathsAnt() { + return PathSelectors.ant("/api/front/**"); + } + + private Predicate publicPathsAnt() { + return PathSelectors.ant("/api/public/**"); + } + + private List security() { + return newArrayList( + new ApiKey(Constants.HEADER_AUTHORIZATION_KEY, Constants.HEADER_AUTHORIZATION_KEY, "header") + ); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Yzt Java") + .description("Yzt") + .termsOfServiceUrl("http://host:port") + .version("1.0.0").build(); + } + + + private List securityContexts() { + List res = new ArrayList<>(); + res.add(SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("/.*")) + .build()); + return res; + } + + private List defaultAuth() { + List res = new ArrayList<>(); + AuthorizationScope authorizationScope = new AuthorizationScope("global", Constants.HEADER_AUTHORIZATION_KEY); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + res.add(new SecurityReference(Constants.HEADER_AUTHORIZATION_KEY, authorizationScopes)); + return res; + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/TaskExecutorConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/TaskExecutorConfig.java new file mode 100644 index 0000000..eeb855e --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/TaskExecutorConfig.java @@ -0,0 +1,97 @@ +package com.yzt.front.config; + +import lombok.Data; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * Task类的线程配置 + * + */ +@Data +@Configuration +public class TaskExecutorConfig { + + //普通模式 + private final int taskCorePoolSize = 20; //核心线程池数量 + private final int taskMaxPoolSize = 100; //最大线程 + private final int taskQueueCapacity = 200; //缓存队列条数 + private final int taskKeepAliveSecond = 10; //允许的空闲时间 + private final String taskNamePrefix = "task-executor-"; //线程名称前缀 + + //发布订阅模式 +// private final int listenerCorePoolSize = 3; +// private final int listenerMaxPoolSize = 20; +// private final int listenerQueueCapacity = 200; +// private final int listenerKeepAliveSecond = 10; +// private final String listenerNamePrefix = "listener-executor-"; + + //普通模式 + @Bean("taskExecutor") + public ThreadPoolTaskExecutor taskExecutor(){ + return initTaskExecutor( + getTaskCorePoolSize(), + getTaskMaxPoolSize(), + getTaskQueueCapacity(), + getTaskKeepAliveSecond(), + getTaskNamePrefix() + ); + } + +// //针对发布订阅(pub listener) 的线程池 +// @Bean("listenerTaskExecutor") +// public ThreadPoolTaskExecutor listenerTaskExecutor(){ +// return initTaskExecutor(getListenerCorePoolSize(), getListenerMaxPoolSize(), +// getListenerQueueCapacity(), getListenerKeepAliveSecond(), getListenerNamePrefix()); +// } + + /** + * + * 初始化TaskExecutor + * @param corePoolSize int 默认线程数 + * @param maxPoolSize int 最大线程数 + * @param queueCapacity int 缓冲队列长度 + * @param keepAliveSecond int 允许空闲时间 + * @param namePrefix String 名称的前缀 + * + * @return ThreadPoolTaskExecutor + */ + private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, + int queueCapacity, int keepAliveSecond, String namePrefix){ + //callrunspolicy:由调度线程(提交任务的线程)处理该任务CallerRunsPolicy + return initTaskExecutor(corePoolSize, maxPoolSize, queueCapacity, keepAliveSecond, namePrefix, + new ThreadPoolExecutor.CallerRunsPolicy()); + } + + /** + * 初始化TaskExecutor + * @param corePoolSize int 默认线程数 + * @param maxPoolSize int 最大线程数 + * @param queueCapacity int 缓冲队列长度 + * @param keepAliveSecond int 允许空闲时间 + * @param namePrefix String 名称的前缀 + * @param rejectedExecutionHandler 线程池满的时候如何处理 + * @return ThreadPoolTaskExecutor + */ + private ThreadPoolTaskExecutor initTaskExecutor(int corePoolSize, int maxPoolSize, + int queueCapacity, int keepAliveSecond, String namePrefix, + RejectedExecutionHandler rejectedExecutionHandler){ + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize);//核心线程数(默认线程数) + executor.setMaxPoolSize(maxPoolSize);//最大线程数 + executor.setQueueCapacity(queueCapacity);//缓冲队列数 + executor.setKeepAliveSeconds(keepAliveSecond);//允许线程空闲时间(单位默认为秒) + executor.setThreadNamePrefix(namePrefix);//线程名前缀 + + //线程池对拒绝任务的处理策略, + executor.setRejectedExecutionHandler(rejectedExecutionHandler); + + //初始化 + executor.initialize(); + return executor; + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/config/WebConfig.java b/fightwine-front/src/main/java/com/yzt/front/config/WebConfig.java new file mode 100644 index 0000000..22535f4 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/config/WebConfig.java @@ -0,0 +1,127 @@ +package com.yzt.front.config; + +import com.yzt.common.interceptor.SwaggerInterceptor; +import com.yzt.front.filter.ResponseFilter; +import com.yzt.front.interceptor.FrontTokenInterceptor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.handler.MappedInterceptor; + +/** + * token验证拦截器 + * + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + + // 这里使用一个Bean为的是可以在拦截器中自由注入,也可以在拦截器中使用SpringUtil.getBean 获取 + // 但是觉得这样更优雅 + + @Bean + public HandlerInterceptor frontTokenInterceptor(){ + return new FrontTokenInterceptor(); + } + + @Bean + public ResponseFilter responseFilter(){ return new ResponseFilter(); } + + @Value("${swagger.basic.username}") + private String username; + @Value("${swagger.basic.password}") + private String password; + @Value("${swagger.basic.check}") + private Boolean check; + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + //添加token拦截器 + //addPathPatterns添加需要拦截的命名空间; + //excludePathPatterns添加排除拦截命名空间 + + //前端用户登录token + registry.addInterceptor(frontTokenInterceptor()). + addPathPatterns("/api/front/**"). + excludePathPatterns("/api/front/index"). + excludePathPatterns("/api/front/qrcode/**"). + excludePathPatterns("/api/front/login/mobile"). + excludePathPatterns("/api/front/login"). + excludePathPatterns("/api/front/sendCode"). + excludePathPatterns("/api/front/register"). + excludePathPatterns("/api/front/wechat/**"). + excludePathPatterns("/api/front/search/keyword"). + excludePathPatterns("/api/front/share"). + excludePathPatterns("/api/front/article/**"). + excludePathPatterns("/api/front/city/**"). + excludePathPatterns("/api/front/product/hot"). + excludePathPatterns("/api/front/product/good"). + excludePathPatterns("/api/front/products/**"). + excludePathPatterns("/api/front/reply/**"). + excludePathPatterns("/api/front/user/service/**"). + excludePathPatterns("/api/front/logistics"). + excludePathPatterns("/api/front/groom/list/**"). + excludePathPatterns("/api/front/config"). + excludePathPatterns("/api/front/category"). + excludePathPatterns("/api/front/categorybypid/*"). + excludePathPatterns("/api/front/seckill/*"). + excludePathPatterns("/api/front/seckill/list/*"). + excludePathPatterns("/api/front/seckill/detail/*"). + excludePathPatterns("/api/front/seckill/detail"). + excludePathPatterns("/api/front/ios/*"). + excludePathPatterns("/api/front/ios/register/binding/phone"). + excludePathPatterns("/api/front/combination/index"). + excludePathPatterns("/api/front/seckill/index"). + excludePathPatterns("/api/front/bargain/index"). + excludePathPatterns("/api/front/bargain/header"). + excludePathPatterns("/api/front/bargain/detail"). + excludePathPatterns("/api/front/index/product/*"). + excludePathPatterns("/api/front/index/color/config"). + excludePathPatterns("/api/front/image/domain"). + excludePathPatterns("/api/front/product/leaderboard"). + excludePathPatterns("/api/front/product/byids/**"). + excludePathPatterns("/api/front/token/is/exist"). + excludePathPatterns("/api/front/login/config"). + excludePathPatterns("/api/front/copyright/info"). + excludePathPatterns("/api/front/get/bottom/navigation"). + excludePathPatterns("/api/front/agreement/**"). + excludePathPatterns("/api/front/pagediy/**"). + excludePathPatterns("/api/front/menu/user"). + excludePathPatterns("/api/front/combination/header"). + excludePathPatterns("/api/front/combination/detail"). + excludePathPatterns("/api/front/register/reset"). + excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/static/"); + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + @Bean + public FilterRegistrationBean filterRegister() + { + //注册过滤器 + FilterRegistrationBean registration = new FilterRegistrationBean(responseFilter()); + registration.addUrlPatterns("/*"); + return registration; + } + + /* 必须在此处配置拦截器,要不然拦不到swagger的静态资源 */ + @Bean + @ConditionalOnProperty(name = "swagger.basic.enable", havingValue = "true") + public MappedInterceptor getMappedInterceptor() { + return new MappedInterceptor(new String[]{"/doc.html", "/webjars/**"}, new SwaggerInterceptor(username, password, check)); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/ArticleController.java b/fightwine-front/src/main/java/com/yzt/front/controller/ArticleController.java new file mode 100644 index 0000000..e505734 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/ArticleController.java @@ -0,0 +1,82 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.article.Article; +import com.yzt.common.model.category.Category; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ArticleResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ArticleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 文章 + * fw_ + */ +@Slf4j +@RestController("ArticleFrontController") +@RequestMapping("api/front/article") +@Api(tags = "文章") +public class ArticleController { + + @Autowired + private ArticleService articleService; + + /** + * 分页列表 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list/{cid}", method = RequestMethod.GET) + public CommonResult> getList(@PathVariable(name="cid") String cid, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(articleService.getList(cid, pageParamRequest))); + } + + /** + * 热门列表 + */ + @ApiOperation(value = "热门列表") + @RequestMapping(value = "/hot/list", method = RequestMethod.GET) + public CommonResult> getHotList() { + return CommonResult.success(CommonPage.restPage(articleService.getHotList())); + } + + /** + * 轮播列表 + */ + @ApiOperation(value = "轮播列表") + @RequestMapping(value = "/banner/list", method = RequestMethod.GET) + public CommonResult> getList() { + return CommonResult.success(CommonPage.restPage(articleService.getBannerList())); + } + + /** + * 文章分类列表 + */ + @ApiOperation(value = "文章分类列表") + @RequestMapping(value = "/category/list", method = RequestMethod.GET) + public CommonResult> categoryList() { + return CommonResult.success(CommonPage.restPage(articleService.getCategoryList())); + } + + /** + * 查询文章详情 + * @param id Integer + */ + @ApiOperation(value = "详情") + @RequestMapping(value = "/info", method = RequestMethod.GET) + @ApiImplicitParam(name="id", value="文章ID") + public CommonResult info(@RequestParam(value = "id") Integer id) { + return CommonResult.success(articleService.getVoByFront(id)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/BargainController.java b/fightwine-front/src/main/java/com/yzt/front/controller/BargainController.java new file mode 100644 index 0000000..44b8859 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/BargainController.java @@ -0,0 +1,114 @@ +package com.yzt.front.controller; + +import com.github.pagehelper.PageInfo; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreBargainService; +import com.yzt.service.service.StoreBargainUserHelpService; +import com.yzt.service.service.StoreBargainUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * H5 砍价 + * + */ +@Slf4j +@RestController +@RequestMapping("api/front/bargain") +@Api(tags = "砍价商品") +public class BargainController { + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Autowired + private StoreBargainUserHelpService storeBargainUserHelpService; + + /** + * 砍价首页信息 + */ + @ApiOperation(value = "砍价首页信息") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult index(){ + return CommonResult.success(storeBargainService.getIndexInfo()); + } + + /** + * 砍价商品列表header + */ + @ApiOperation(value = "砍价商品列表header") + @RequestMapping(value = "/header", method = RequestMethod.GET) + public CommonResult header(){ + return CommonResult.success(storeBargainService.getHeader()); + } + + /** + * 砍价商品列表 + * @return 砍价商品列表 + */ + @ApiOperation(value = "砍价商品列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> list(@ModelAttribute PageParamRequest pageParamRequest){ + return CommonResult.success(storeBargainService.getH5List(pageParamRequest)); + } + + /** + * 获取用户砍价信息 + */ + @ApiOperation(value = "获取用户砍价信息") + @RequestMapping(value = "/user", method = RequestMethod.GET) + public CommonResult getBargainUserInfo(@ModelAttribute @Validated BargainFrontRequest bargainFrontRequest) { + return CommonResult.success(storeBargainUserService.getBargainUserInfo(bargainFrontRequest)); + } + + /** + * 砍价商品详情 + */ + @ApiOperation(value = "砍价商品详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + public CommonResult detail(@PathVariable(value = "id") Integer id) { + BargainDetailH5Response h5Detail = storeBargainService.getH5Detail(id); + return CommonResult.success(h5Detail); + } + + /** + * 创建砍价活动 + */ + @ApiOperation(value = "创建砍价活动") + @RequestMapping(value = "/start", method = RequestMethod.POST) + public CommonResult> start(@RequestBody @Validated BargainFrontRequest bargainFrontRequest) { + return CommonResult.success(storeBargainService.start(bargainFrontRequest)); + } + + /** + * 砍价 + */ + @ApiOperation(value = "砍价") + @RequestMapping(value = "/help", method = RequestMethod.POST) + public CommonResult> help(@RequestBody @Validated BargainFrontRequest bargainFrontRequest) { + return CommonResult.success(storeBargainUserHelpService.help(bargainFrontRequest)); + } + + /** + * 砍价记录 + */ + @ApiOperation(value = "砍价记录") + @RequestMapping(value = "/record", method = RequestMethod.GET) + public CommonResult> recordList(@ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeBargainUserService.getRecordList(pageParamRequest))); + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/CartController.java b/fightwine-front/src/main/java/com/yzt/front/controller/CartController.java new file mode 100644 index 0000000..8c6751f --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/CartController.java @@ -0,0 +1,159 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.CartNumRequest; +import com.yzt.common.request.CartRequest; +import com.yzt.common.request.CartResetRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CartInfoResponse; +import com.yzt.common.response.IndexProductResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCartService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 购物车 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/front/cart") +@Api(tags = "商品 -- 购物车") //配合swagger使用 +public class CartController { + + @Autowired + private StoreCartService storeCartService; + + /** + * 分页显示购物车表 + */ + @ApiOperation(value = "分页列表") //配合swagger使用 + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="isValid", value="类型,true-有效商品,false-无效商品", required = true), + @ApiImplicitParam(name="page", value="页码", required = true), + @ApiImplicitParam(name="limit", value="每页数量", required = true) + }) + public CommonResult> getList(@RequestParam Boolean isValid, @Validated PageParamRequest pageParamRequest) { + CommonPage restPage = CommonPage.restPage(storeCartService.getList(pageParamRequest, isValid)); + return CommonResult.success(restPage); + } + + /** + * 新增购物车表 + * @param storeCartRequest 新增参数 + */ + @ApiOperation(value = "新增") + @RequestMapping(value = "/save", method = RequestMethod.POST) + public CommonResult> save(@RequestBody @Validated CartRequest storeCartRequest) { + String cartId = storeCartService.saveCate(storeCartRequest); + if (StringUtils.isNotBlank(cartId)) { + HashMap result = new HashMap<>(); + result.put("cartId", cartId); + return CommonResult.success(result); + } else { + return CommonResult.failed(); + } + } + + /** + * 查询购物item数 + */ + @ApiOperation(value = "查询购物车项目数") + @RequestMapping(value = "/getCartItemCount", method = RequestMethod.GET) + public CommonResult> getCartItemCount() { + String cartItemCount = storeCartService.getCartItemCount(); + if (StringUtils.isNotBlank(cartItemCount)) { + HashMap result = new HashMap<>(); + result.put("cartItemCount", cartItemCount); + return CommonResult.success(result); + } else { + return CommonResult.failed(); + } + } + /** + * 删除购物车表 + * @param ids 购物车ids + */ + @ApiOperation(value = "删除") + @RequestMapping(value = "/delete", method = RequestMethod.POST) + public CommonResult delete(@RequestParam(value = "ids") List ids) { + if (storeCartService.deleteCartByIds(ids)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改商品数量 + * @param id integer id + * @param number 修改的产品数量 + */ + @ApiOperation(value = "修改") + @RequestMapping(value = "/num", method = RequestMethod.POST) + public CommonResult update(@RequestParam Integer id, @RequestParam Integer number) { + if (storeCartService.updateCartNum(id, number)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 修改商品数量 + * @param id integer id + * @param status 修改的购物车选中状态 + */ + @ApiOperation(value = "修改") + @RequestMapping(value = "/status", method = RequestMethod.POST) + public CommonResult updateStatus(@RequestParam Long id, @RequestParam Integer status) { + if (storeCartService.updateCartStatus(id, status)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 获取购物车数量 + */ + @ApiOperation(value = "获取购物车数量") + @RequestMapping(value = "/count", method = RequestMethod.GET) + public CommonResult> count(@Validated CartNumRequest request) { + return CommonResult.success(storeCartService.getUserCount(request)); + } + + /** + * 购物车重选提交 + * @param resetRequest 重选参数 + * @return 结果 + */ + @ApiOperation(value = "购物车重选提交") + @RequestMapping(value = "/resetcart", method = RequestMethod.POST) + public CommonResult resetCart(@RequestBody @Validated CartResetRequest resetRequest){ + return CommonResult.success(storeCartService.resetCart(resetRequest)); + } + + @ApiOperation(value = "根据商品id集合查询对应商品") + @RequestMapping(value = "/product", method = RequestMethod.GET) + public CommonResult> getProductByCartIds() { + return CommonResult.success(storeCartService.getProductByCartIds()); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/CityController.java b/fightwine-front/src/main/java/com/yzt/front/controller/CityController.java new file mode 100644 index 0000000..895db83 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/CityController.java @@ -0,0 +1,38 @@ +package com.yzt.front.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemCityService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 城市服务 + * fw_ + */ +@Slf4j +@RestController("CityFrontController") +@RequestMapping("api/front/city") +@Api(tags = "城市服务") +public class CityController { + + @Autowired + private SystemCityService systemCityService; + + /** + * 城市服务树形结构数据 + */ + @ApiOperation(value = "树形结构") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult register(){ + return CommonResult.success(systemCityService.getListTree()); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/CombinationController.java b/fightwine-front/src/main/java/com/yzt/front/controller/CombinationController.java new file mode 100644 index 0000000..ab4c422 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/CombinationController.java @@ -0,0 +1,102 @@ +package com.yzt.front.controller; + +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StorePinkRequest; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCombinationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 拼团商品 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/combination") +@Api(tags = "拼团商品") +public class CombinationController { + + @Autowired + private StoreCombinationService storeCombinationService; + + /** + * 拼团首页 + */ + @ApiOperation(value = "拼团首页数据") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult index() { + return CommonResult.success(storeCombinationService.getIndexInfo()); + } + + /** + * 拼团商品列表header + */ + @ApiOperation(value = "拼团商品列表header") + @RequestMapping(value = "/header", method = RequestMethod.GET) + public CommonResult header() { + return CommonResult.success(storeCombinationService.getHeader()); + } + + /** + * 拼团商品列表 + */ + @ApiOperation(value = "拼团商品列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> list(@ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeCombinationService.getH5List(pageParamRequest))); + } + + /** + * 拼团商品详情 + */ + @ApiOperation(value = "拼团商品详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + public CommonResult detail(@PathVariable(value = "id") Integer id) { + CombinationDetailResponse h5Detail = storeCombinationService.getH5Detail(id); + return CommonResult.success(h5Detail); + } + + /** + * 去拼团 + * @param pinkId 拼团团长单id + */ + @ApiOperation(value = "去拼团") + @RequestMapping(value = "/pink/{pinkId}", method = RequestMethod.GET) + public CommonResult goPink(@PathVariable(value = "pinkId") Integer pinkId) { + GoPinkResponse goPinkResponse = storeCombinationService.goPink(pinkId); + return CommonResult.success(goPinkResponse); + } + + /** + * 更多拼团 + */ + @ApiOperation(value = "更多拼团") + @RequestMapping(value = "/more", method = RequestMethod.GET) + public CommonResult> getMore(@RequestParam Integer comId, @Validated PageParamRequest pageParamRequest) { + PageInfo more = storeCombinationService.getMore(pageParamRequest, comId); + return CommonResult.success(more); + } + + /** + * 取消拼团 + */ + @ApiOperation(value = "取消拼团") + @RequestMapping(value = "/remove", method = RequestMethod.POST) + public CommonResult remove(@RequestBody @Validated StorePinkRequest storePinkRequest) { + if (storeCombinationService.removePink(storePinkRequest)) { + return CommonResult.success("取消成功"); + } else { + return CommonResult.failed("取消失败"); + } + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/CouponController.java b/fightwine-front/src/main/java/com/yzt/front/controller/CouponController.java new file mode 100644 index 0000000..f9f5db3 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/CouponController.java @@ -0,0 +1,67 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.StoreCouponFrontResponse; +import com.yzt.common.response.StoreCouponUserOrder; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCouponService; +import com.yzt.service.service.StoreCouponUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 优惠券表 前端控制器 + * fw_ + */ +@Slf4j +@RestController("CouponFrontController") +@RequestMapping("api/front") +@Api(tags = "优惠券") +public class CouponController { + + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private StoreCouponUserService storeCouponUserService; + + + /** + * 分页显示优惠券表 + * + * @param type 类型,1-通用,2-商品,3-品类 + * @param productId 产品id,搜索产品指定优惠券 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/coupons", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="type", value="类型,1-通用,2-商品,3-品类", required = true), + @ApiImplicitParam(name="productId", value="产品id"), + @ApiImplicitParam(name="page", value="页码", required = true), + @ApiImplicitParam(name="limit", value="每页数量", required = true) + }) + public CommonResult> getList(@RequestParam(value = "type", defaultValue = "0") int type, + @RequestParam(value = "productId", defaultValue = "0") int productId, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeCouponService.getH5List(type, productId, pageParamRequest))); + } + + @ApiOperation(value = "当前订单可用优惠券") + @RequestMapping(value = "coupons/order/{preOrderNo}", method = RequestMethod.GET) + public CommonResult> getCouponsListByPreOrderNo(@PathVariable String preOrderNo) { + return CommonResult.success(storeCouponUserService.getListByPreOrderNo(preOrderNo)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/IndexController.java b/fightwine-front/src/main/java/com/yzt/front/controller/IndexController.java new file mode 100644 index 0000000..7d22605 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/IndexController.java @@ -0,0 +1,119 @@ +package com.yzt.front.controller; + + +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CopyrightConfigInfoResponse; +import com.yzt.common.response.IndexInfoResponse; +import com.yzt.common.response.IndexProductResponse; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.front.service.IndexService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 用户 -- 用户中心 + * fw_ + */ +@Slf4j +@RestController("IndexController") +@RequestMapping("api/front") +@Api(tags = "首页") +public class IndexController { + + @Autowired + private IndexService indexService; + + /** + * 首页数据 + */ + @ApiOperation(value = "首页数据") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult getIndexInfo() { + return CommonResult.success(indexService.getHomePage()); + } + + /** + * 首页商品列表 + */ + @ApiOperation(value = "首页商品列表") + @RequestMapping(value = "/index/product/{type}", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "类型 【1 精品推荐 2 热门榜单 3首发新品 4促销单品】", dataType = "int", required = true) + public CommonResult> getProductList(@PathVariable(value = "type") Integer type, PageParamRequest pageParamRequest) { + + return CommonResult.success(indexService.findIndexProductList(type, pageParamRequest)); + } + + /** + * 热门搜索 + */ + @ApiOperation(value = "热门搜索") + @RequestMapping(value = "/search/keyword", method = RequestMethod.GET) + public CommonResult>> hotKeywords() { + return CommonResult.success(indexService.hotKeywords()); + } + + /** + * 分享配置 + */ + @ApiOperation(value = "分享配置") + @RequestMapping(value = "/share", method = RequestMethod.GET) + public CommonResult> share() { + return CommonResult.success(indexService.getShareConfig()); + } + + /** + * 颜色配置 + */ + @ApiOperation(value = "颜色配置") + @RequestMapping(value = "/index/color/config", method = RequestMethod.GET) + public CommonResult getColorConfig() { + return CommonResult.success(indexService.getColorConfig()); + } + + /** + * 版本信息 + */ + @ApiOperation(value = "获取版本信息") + @RequestMapping(value = "/index/get/version", method = RequestMethod.GET) + public CommonResult> getVersion() { + return CommonResult.success(indexService.getVersion()); + } + + /** + * 全局本地图片域名 + */ + @ApiOperation(value = "全局本地图片域名") + @RequestMapping(value = "/image/domain", method = RequestMethod.GET) + public CommonResult getImageDomain() { + return CommonResult.success(indexService.getImageDomain()); + } + + @ApiOperation(value = "获取版权信息") + @RequestMapping(value = "/copyright/info", method = RequestMethod.GET) + public CommonResult getCopyrightInfo() { + return CommonResult.success(indexService.getCopyrightInfo()); + } + + @ApiOperation(value = "获取底部导航信息") + @RequestMapping(value = "/get/bottom/navigation", method = RequestMethod.GET) + public CommonResult getBottomNavigation() { + return CommonResult.success(indexService.getBottomNavigationInfo()); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/LoginController.java b/fightwine-front/src/main/java/com/yzt/front/controller/LoginController.java new file mode 100644 index 0000000..52e4f99 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/LoginController.java @@ -0,0 +1,124 @@ +package com.yzt.front.controller; + + +import com.yzt.common.request.LoginMobileRequest; +import com.yzt.common.request.LoginRequest; +import com.yzt.common.request.RegisterRequest; +import com.yzt.common.response.LoginConfigResponse; +import com.yzt.common.response.LoginResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.front.service.LoginService; +import com.yzt.service.service.SmsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * 用户登陆 前端控制器 + * + */ +@Slf4j +@RestController("FrontLoginController") +@RequestMapping("api/front") +@Api(tags = "用户 -- 登录注册") +public class LoginController { + + @Autowired + private SmsService smsService; + + @Autowired + private LoginService loginService; + + /** + * 注册 + */ + @ApiOperation(value = "注册") + @RequestMapping(value = "/register", method = RequestMethod.POST) + public CommonResult register(@RequestBody @Validated RegisterRequest request) { + if(loginService.register(request)){ + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 手机号登录接口 + */ + @ApiOperation(value = "手机号登录接口") + @RequestMapping(value = "/login/mobile", method = RequestMethod.POST) + public CommonResult phoneLogin(@RequestBody @Validated LoginMobileRequest loginRequest) { + return CommonResult.success(loginService.phoneLogin(loginRequest)); + } + + /** + * 账号密码登录 + */ + @ApiOperation(value = "账号密码登录") + @RequestMapping(value = "/login", method = RequestMethod.POST) + public CommonResult login(@RequestBody @Validated LoginRequest loginRequest) { + return CommonResult.success(loginService.login(loginRequest)); + } + + + /** + * 退出登录 + */ + @ApiOperation(value = "退出") + @RequestMapping(value = "/logout", method = RequestMethod.GET) + public CommonResult loginOut(HttpServletRequest request) { + loginService.loginOut(request); + return CommonResult.success(); + } + + /** + * 发送短信验证码 + * + * @param phone 手机号码 + * @return 发送是否成功 + */ + @ApiOperation(value = "发送短信验证码") + @RequestMapping(value = "/sendCode", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "phone", value = "手机号码", required = true) + }) + public CommonResult sendCode(@RequestParam String phone) { + if (smsService.sendCommonCode(phone)) { + return CommonResult.success("发送成功"); + } else { + return CommonResult.failed("发送失败"); + } + } + + @ApiOperation(value = "校验token是否有效") + @RequestMapping(value = "/token/is/exist", method = RequestMethod.POST) + public CommonResult tokenIsExist() { + return CommonResult.success(loginService.tokenIsExist()); + } + + @ApiOperation(value = "获取登录配置") + @RequestMapping(value = "/login/config", method = RequestMethod.GET) + public CommonResult getLoginConfig() { + return CommonResult.success(loginService.getLoginConfig()); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param request HttpServletRequest + */ + @ApiOperation(value = "刷新token") + @RequestMapping(value = "/token/refresh", method = RequestMethod.POST) + public void refreshToken(HttpServletRequest request) { + loginService.refreshToken(request); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/OrderInvoiceController.java b/fightwine-front/src/main/java/com/yzt/front/controller/OrderInvoiceController.java new file mode 100644 index 0000000..8e2dfe0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/OrderInvoiceController.java @@ -0,0 +1,33 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreOrderInvoiceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * 订单发票前台控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/front/order/invoice") +@Api(tags = "订单发票管理") +public class OrderInvoiceController { + + @Autowired + private StoreOrderInvoiceService storeOrderInvoiceService; + + /** + * 查询订单发票详情 + */ + @GetMapping("/detail/{orderId}") + @ApiOperation("查询订单发票详情") + public CommonResult getInvoiceDetail(@PathVariable String orderId) { + StoreOrderInvoice invoice = storeOrderInvoiceService.getByOrderId(orderId); + return CommonResult.success(invoice); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/PageDiyController.java b/fightwine-front/src/main/java/com/yzt/front/controller/PageDiyController.java new file mode 100644 index 0000000..310941d --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/PageDiyController.java @@ -0,0 +1,47 @@ +package com.yzt.front.controller; + + +import cn.hutool.core.util.ObjectUtil; +import com.yzt.common.exception.YztException; +import com.yzt.common.response.page.PageDiyResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.PageDiyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + + +/** + * DIY数据表 前端控制器 + */ +@Slf4j +@RestController +@RequestMapping("api/front/pagediy") +@Api(tags = "DIY 控制器") //配合swagger使用 + +public class PageDiyController { + + @Autowired + private PageDiyService pageDiyService; + /** + * 查询DIY数据表信息 + * + * @param id Integer 主键 + * @return CommonResult + */ + @ApiOperation(value = "详情") + @RequestMapping(value = "/info/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable(value = "id") Integer id){ + PageDiyResponse response = pageDiyService.getDiyPageByPageIdForFront(id); + if(ObjectUtil.isNull(response)) throw new YztException("未找到对应模版信息"); + return CommonResult.success(response); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/PayController.java b/fightwine-front/src/main/java/com/yzt/front/controller/PayController.java new file mode 100644 index 0000000..eaa52f8 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/PayController.java @@ -0,0 +1,63 @@ +package com.yzt.front.controller; + +import com.yzt.common.request.OrderPayRequest; +import com.yzt.common.response.OrderPayResultResponse; +import com.yzt.common.response.PayConfigResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.service.OrderPayService; +import com.yzt.service.service.WeChatPayService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * 微信缓存表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/pay") +@Api(tags = "支付管理") +public class PayController { + + @Autowired + private WeChatPayService weChatPayService; + + @Autowired + private OrderPayService orderPayService; + + + + @ApiOperation(value = "获取支付配置") + @RequestMapping(value = "/get/config", method = RequestMethod.GET) + public CommonResult getPayConfig() { + return CommonResult.success(orderPayService.getPayConfig()); + } + + /** + * 订单支付 + */ + @ApiOperation(value = "订单支付") + @RequestMapping(value = "/payment", method = RequestMethod.POST) + public CommonResult payment(@RequestBody @Validated OrderPayRequest orderPayRequest, HttpServletRequest request) { + String ip = YztUtil.getClientIp(request); + return CommonResult.success(orderPayService.payment(orderPayRequest, ip)); + } + + /** + * 查询支付结果 + * + * @param orderNo |订单编号|String|必填 + */ + @ApiOperation(value = "查询支付结果") + @RequestMapping(value = "/queryPayResult", method = RequestMethod.GET) + public CommonResult queryPayResult(@RequestParam String orderNo) { + return CommonResult.success(weChatPayService.queryPayResult(orderNo)); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/ProductController.java b/fightwine-front/src/main/java/com/yzt/front/controller/ProductController.java new file mode 100644 index 0000000..cd0f8ec --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/ProductController.java @@ -0,0 +1,158 @@ +package com.yzt.front.controller; + + +import com.yzt.common.model.category.Category; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ProductListRequest; +import com.yzt.common.request.ProductRequest; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.CategoryTreeVo; +import com.yzt.front.service.ProductService; +import com.yzt.service.service.CategoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 用户 -- 用户中心 + * fw_ + */ +@Slf4j +@RestController("ProductController") +@RequestMapping("api/front") +@Api(tags = "商品") +public class ProductController { + + @Autowired + private ProductService productService; + + @Autowired + private CategoryService categoryService; + + /** + * 热门商品推荐 + */ + @ApiOperation(value = "热门商品推荐") + @RequestMapping(value = "/product/hot", method = RequestMethod.GET) + public CommonResult> getHotProductList(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(productService.getHotProductList(pageParamRequest)); + } + + /** + * 优选商品推荐 + */ + @ApiOperation(value = "优选商品推荐") + @RequestMapping(value = "/product/good", method = RequestMethod.GET) + public CommonResult> getGoodProductList() { + return CommonResult.success(productService.getGoodProductList()); + } + + /** + * 获取分类 + */ + @ApiOperation(value = "获取分类") + @RequestMapping(value = "/category", method = RequestMethod.GET) + public CommonResult> getCategory() { + return CommonResult.success(productService.getCategory()); + } + + @ApiOperation(value = "根据pid获取子分类") + @RequestMapping(value = "/categorybypid/{pid}", method = RequestMethod.GET) + public CommonResult> getCategoryByPid(@PathVariable Integer pid) { + return CommonResult.success(categoryService.getChildVoStatusOnListByPid(pid)); + } + + /** + * 商品列表 + */ + @ApiOperation(value = "商品列表") + @RequestMapping(value = "/products", method = RequestMethod.GET) + public CommonResult> getList(@Validated ProductRequest request, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(productService.getList(request, pageParamRequest)); + } + + /** + * 商品详情 + */ + @ApiOperation(value = "商品详情") + @RequestMapping(value = "/product/detail/{id}", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "normal-正常,video-视频") + public CommonResult getDetail(@PathVariable Integer id, @RequestParam(value = "type", defaultValue = "normal") String type) { + return CommonResult.success(productService.getDetail(id, type)); + } + + /** + * 商品评论列表 + */ + @ApiOperation(value = "商品评论列表") + @RequestMapping(value = "/reply/list/{id}", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "评价等级|0=全部,1=好评,2=中评,3=差评", allowableValues = "range[0,1,2,3]") + public CommonResult> getReplyList(@PathVariable Integer id, + @RequestParam(value = "type") Integer type, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(productService.getReplyList(id, type, pageParamRequest))); + } + + /** + * 商品评论数量 + */ + @ApiOperation(value = "商品评论数量") + @RequestMapping(value = "/reply/config/{id}", method = RequestMethod.GET) + public CommonResult getReplyCount(@PathVariable Integer id) { + return CommonResult.success(productService.getReplyCount(id)); + } + + /** + * 商品详情评论 + */ + @ApiOperation(value = "商品详情评论") + @RequestMapping(value = "/reply/product/{id}", method = RequestMethod.GET) + public CommonResult getProductReply(@PathVariable Integer id) { + return CommonResult.success(productService.getProductReply(id)); + } + + /** + * 商品列表 + */ + @ApiOperation(value = "商品列表(个别分类模型使用)") + @RequestMapping(value = "/product/list", method = RequestMethod.GET) + public CommonResult> getProductList(@Validated ProductListRequest request, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(productService.getCategoryProductList(request, pageParamRequest)); + } + + /** + * 商品规格详情 + */ + @ApiOperation(value = "商品规格详情") + @RequestMapping(value = "/product/sku/detail/{id}", method = RequestMethod.GET) + public CommonResult getSkuDetail(@PathVariable Integer id) { + return CommonResult.success(productService.getSkuDetail(id)); + } + + /** + * 商品排行榜 + */ + @ApiOperation(value = "商品排行榜") + @RequestMapping(value = "/product/leaderboard", method = RequestMethod.GET) + public CommonResult> getLeaderboard() { + return CommonResult.success(productService.getLeaderboard()); + } + + @ApiOperation(value = "根据商品id集合查询对应商品") + @RequestMapping(value = "/product/byids/{ids}", method = RequestMethod.GET) + public CommonResult> getProductByIds(@PathVariable String ids) { + return CommonResult.success(productService.getProductByIds(YztUtil.stringToArray(ids))); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/QrCodeController.java b/fightwine-front/src/main/java/com/yzt/front/controller/QrCodeController.java new file mode 100644 index 0000000..a56d080 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/QrCodeController.java @@ -0,0 +1,68 @@ +package com.yzt.front.controller; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.QrCodeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + + +/** + * 验证码 + * fw_ + */ + +@Slf4j +@RestController +@RequestMapping("api/front/qrcode") +@Api(tags = "二维码服务") +public class QrCodeController { + + @Autowired + private QrCodeService qrCodeService; + /** + * 获取二维码 + * @return CommonResult + */ + @ApiOperation(value="获取二维码") + @RequestMapping(value = "/get", method = RequestMethod.POST) + public CommonResult> get(@RequestBody JSONObject data) { + return CommonResult.success(qrCodeService.get(data)); + } + + /** + * 远程图片转base64 + * @return CommonResult + */ + @ApiOperation(value="远程图片转base64") + @RequestMapping(value = "/base64", method = RequestMethod.POST) + public CommonResult> get(@RequestParam String url) { + return CommonResult.success(qrCodeService.base64(url)); + } + + /** + * 将字符串 转base64 + * @return CommonResult + */ + @ApiOperation(value="将字符串 转base64") + @RequestMapping(value = "/str2base64", method = RequestMethod.POST) + public CommonResult> getQrcodeByString( + @RequestParam String text, + @RequestParam int width, + @RequestParam int height) { + if((width < 50 || height < 50) && (width > 500 || height > 500) && text.length() >= 999){ + throw new YztException(Constants.RESULT_QRCODE_PRAMERROR); + } + return CommonResult.success(qrCodeService.base64String(text, width,height)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/SecKillController.java b/fightwine-front/src/main/java/com/yzt/front/controller/SecKillController.java new file mode 100644 index 0000000..f591f7b --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/SecKillController.java @@ -0,0 +1,69 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.SecKillResponse; +import com.yzt.common.response.SeckillIndexResponse; +import com.yzt.common.response.StoreSecKillH5Response; +import com.yzt.common.response.StoreSeckillDetailResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreSeckillService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * SecKillController + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/seckill") +@Api(tags = "秒杀商品") +public class SecKillController { + + @Autowired + StoreSeckillService storeSeckillService; + + /** + * 秒杀首页数据 + * @return 可秒杀配置 + */ + @ApiOperation(value = "秒杀首页数据") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult index() { + return CommonResult.success(storeSeckillService.getIndexInfo()); + } + + /** + * 秒杀Index + * @return 可秒杀配置 + */ + @ApiOperation(value = "秒杀Header") + @RequestMapping(value = "/header", method = RequestMethod.GET) + public CommonResult> header() { + return CommonResult.success(storeSeckillService.getForH5Index()); + } + + /** + * 根据时间段查询秒杀信息 + * @return 查询时间内的秒杀商品列表 + */ + @ApiOperation(value = "秒杀列表") + @RequestMapping(value = "/list/{timeId}", method = RequestMethod.GET) + public CommonResult> list(@PathVariable("timeId") String timeId, @ModelAttribute PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeSeckillService.getKillListByTimeId(timeId, pageParamRequest))); + } + + + @ApiOperation(value = "详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable(value = "id") Integer id) { + StoreSeckillDetailResponse storeSeckill = storeSeckillService.getDetailH5(id); + return CommonResult.success(storeSeckill); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/StoreController.java b/fightwine-front/src/main/java/com/yzt/front/controller/StoreController.java new file mode 100644 index 0000000..1eaf435 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/StoreController.java @@ -0,0 +1,41 @@ +package com.yzt.front.controller; + + +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreNearRequest; +import com.yzt.common.response.StoreNearResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemStoreService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 提货点 + * fw_ + */ +@Slf4j +@RestController("StoreController") +@RequestMapping("api/front/store") +@Api(tags = "提货点") +public class StoreController { + @Autowired + private SystemStoreService systemStoreService; + + /** + * 附近的提货点 + */ + @ApiOperation(value = "附近的提货点") + @RequestMapping(value = "/list", method = RequestMethod.POST) + public CommonResult register(@Validated StoreNearRequest request, @Validated PageParamRequest pageParamRequest){ + return CommonResult.success(systemStoreService.getNearList(request, pageParamRequest)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/StoreOrderController.java b/fightwine-front/src/main/java/com/yzt/front/controller/StoreOrderController.java new file mode 100644 index 0000000..7bc6d9c --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/StoreOrderController.java @@ -0,0 +1,237 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.user.UserAddress; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.OrderService; +import com.yzt.service.service.UserAddressService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * H5端订单操作 + * fw_ + */ +@Slf4j +@RestController("StoreOrderFrontController") +@RequestMapping("api/front/order") +@Api(tags = "订单") +public class StoreOrderController { + + @Autowired + private OrderService orderService; + + @Autowired + private UserAddressService userAddressService; + + /** + * 客户信息 + */ + @ApiOperation(value = "客户信息列表") + @RequestMapping(value = "/customer", method = RequestMethod.GET) + public CommonResult> getCustomerList(PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userAddressService.getCustomerList(pageParamRequest))); + } + /** + * 预下单 + */ + @ApiOperation(value = "预下单") + @RequestMapping(value = "/pre/order", method = RequestMethod.POST) + public CommonResult> preOrder(@RequestBody @Validated PreOrderRequest request) { + return CommonResult.success(orderService.preOrder(request)); + } + + /** + * 加载预下单 + */ + @ApiOperation(value = "加载预下单") + @RequestMapping(value = "load/pre/{preOrderNo}", method = RequestMethod.GET) + public CommonResult loadPreOrder(@PathVariable String preOrderNo) { + return CommonResult.success(orderService.loadPreOrder(preOrderNo)); + } + + /** + * 根据参数计算订单价格 + */ + @ApiOperation(value = "计算订单价格") + @RequestMapping(value = "/computed/price", method = RequestMethod.POST) + public CommonResult computedPrice(@Validated @RequestBody OrderComputedPriceRequest request) { + return CommonResult.success(orderService.computedOrderPrice(request)); + } + + /** + * 创建订单 + */ + @ApiOperation(value = "创建订单") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public CommonResult> createOrder(@Validated @RequestBody CreateOrderRequest orderRequest) { + return CommonResult.success(orderService.createOrder(orderRequest)); + } + + /** + * 订单列表 + * @param type 类型 + * @param pageRequest 分页 + * @return 订单列表 + */ + @ApiOperation(value = "订单列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParams ({ + @ApiImplicitParam(name = "type", value = "评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成,-3=售后/退款,-4=已取消", required = false) + }) + public CommonResult> orderList( + @RequestParam(name = "keywords", required = false) String keywords, + @RequestParam(name = "type", required = false) Integer type, + @ModelAttribute PageParamRequest pageRequest) { + return CommonResult.success(CommonPage.restPage(orderService.list(keywords, type, pageRequest))); + } + + /** + * 订单详情 + * @param orderId 订单编号 + * @return 订单详情 + */ + @ApiOperation(value = "订单详情") + @RequestMapping(value = "/detail/{orderId}", method = RequestMethod.GET) + public CommonResult orderDetail(@PathVariable String orderId) { + return CommonResult.success(orderService.detailOrder(orderId)); + } + + /** + * 订单头部信息 + * @return 查询集合数量 + */ + @ApiOperation(value = "订单头部数量") + @RequestMapping(value = "/data", method = RequestMethod.GET) + public CommonResult orderData() { + return CommonResult.success(orderService.orderData()); + } + + /** + * 删除已完成订单 + * @param id String 订单号 + * @return 删除结果 + */ + @ApiOperation(value = "删除订单") + @RequestMapping(value = "/del", method = RequestMethod.POST) + public CommonResult delete(@RequestParam Integer id) { + if( orderService.delete(id)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 订单评价 + * @param request StoreProductReplyAddRequest 评论参数 + */ + @ApiOperation(value = "评价订单") + @RequestMapping(value = "/comment", method = RequestMethod.POST) + public CommonResult comment(@RequestBody @Validated StoreProductReplyAddRequest request) { + if(orderService.reply(request)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 订单收货 + * @param id Integer 订单id + */ + @ApiOperation(value = "订单收货") + @RequestMapping(value = "/take", method = RequestMethod.POST) + public CommonResult take(@RequestParam(value = "id") Integer id) { + if(orderService.take(id)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 订单取消 + * @param id Integer 订单id + */ + @ApiOperation(value = "订单取消") + @RequestMapping(value = "/cancel", method = RequestMethod.POST) + public CommonResult cancel(@RequestParam(value = "id") Integer id) { + if(orderService.cancel(id)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 获取申请订单退款信息 + * @param orderId 订单编号 + */ + @ApiOperation(value = "获取申请订单退款信息") + @RequestMapping(value = "/apply/refund/{orderId}", method = RequestMethod.GET) + public CommonResult refundApplyOrder(@PathVariable String orderId) { + return CommonResult.success(orderService.applyRefundOrderInfo(orderId)); + } + + /** + * 订单退款申请 + * @param request OrderRefundApplyRequest 订单id + */ + @ApiOperation(value = "订单退款申请") + @RequestMapping(value = "/refund", method = RequestMethod.POST) + public CommonResult refundApply(@RequestBody @Validated OrderRefundApplyRequest request) { + if(orderService.refundApply(request)) { + return CommonResult.success(); + }else{ + return CommonResult.failed(); + } + } + + /** + * 查询订单退款理由 + * @return 退款理由 + */ + @ApiOperation(value = "订单退款理由(商家提供)") + @RequestMapping(value = "/refund/reason", method = RequestMethod.GET) + public CommonResult> refundReason() { + return CommonResult.success(orderService.getRefundReason()); + } + + /** + * 根据订单号查询物流信息 + * @param orderId 订单号 + * @return 物流信息 + */ + @ApiOperation(value = "物流信息查询") + @RequestMapping(value = "/express/{orderId}", method = RequestMethod.GET) + public CommonResult getExpressInfo(@PathVariable String orderId) { + return CommonResult.success(orderService.expressOrder(orderId)); + } + + @ApiOperation(value = "待评价商品信息查询") + @RequestMapping(value = "/product", method = RequestMethod.POST) + public CommonResult getOrderProductForReply(@Validated @RequestBody GetProductReply request) { + return CommonResult.success(orderService.getReplyProduct(request)); + } + + /** + * 获取支付配置 + */ + @ApiOperation(value = "获取支付配置") + @RequestMapping(value = "get/pay/config", method = RequestMethod.GET) + public CommonResult getPayConfig() { + return CommonResult.success(orderService.getPayConfig()); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/SystemBankController.java b/fightwine-front/src/main/java/com/yzt/front/controller/SystemBankController.java new file mode 100644 index 0000000..73ca613 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/SystemBankController.java @@ -0,0 +1,57 @@ +package com.yzt.front.controller; + +import com.alipay.api.domain.BankInfo; +import com.yzt.common.model.system.SystemBank; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemBankService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +@Slf4j +@RestController("SystemBankController") +@RequestMapping("api/front/banks") +@Api(tags = "银行") +public class SystemBankController { + + @Autowired + private SystemBankService systemBankService; + + @ApiOperation("获取所有银行列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> listBanks() { + List banks = systemBankService.list(); + return CommonResult.success(banks); + } + + @PostMapping + @ApiOperation("新增银行") + public CommonResult addBank(@RequestBody SystemBank bank) { + boolean success = systemBankService.save(bank); + return CommonResult.success(success); + } + + @PutMapping + @ApiOperation("修改银行") + public CommonResult updateBank(@RequestBody SystemBank bank) { + boolean success = systemBankService.updateById(bank); + return CommonResult.success(success); + } + + @DeleteMapping("/{id}") + @ApiOperation("删除银行") + public CommonResult deleteBank(@PathVariable Long id) { + boolean success = systemBankService.removeById(id); + return CommonResult.success(success); + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UploadFrontController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UploadFrontController.java new file mode 100644 index 0000000..1137885 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UploadFrontController.java @@ -0,0 +1,50 @@ +package com.yzt.front.controller; + +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.FileResultVo; +import com.yzt.service.service.UploadService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + + +/** + * 商品表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/user/upload") +@Api(tags = "上传文件") +public class UploadFrontController { + + @Autowired + private UploadService uploadService; + + /** + * 图片上传 + */ + @ApiOperation(value = "图片上传") + @RequestMapping(value = "/image", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "model", value = "模块 用户user,商品product,微信wechat,news文章"), + @ApiImplicitParam(name = "pid", value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 ", allowableValues = "range[0,1,2,3,4,5,6,7,8]") + }) + public CommonResult image(MultipartFile multipart, @RequestParam(value = "model") String model, + @RequestParam(value = "pid") Integer pid) throws IOException { + return CommonResult.success(uploadService.imageUpload(multipart, model, pid)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserAddressController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserAddressController.java new file mode 100644 index 0000000..7e72bf9 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserAddressController.java @@ -0,0 +1,99 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.user.UserAddress; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserAddressDelRequest; +import com.yzt.common.request.UserAddressRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserAddressService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 用户地址 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/address") +@Api(tags = "用户 -- 地址") +public class UserAddressController { + + @Autowired + private UserAddressService userAddressService; + + /** + * 分页显示用户地址 + */ + @ApiOperation(value = "列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userAddressService.getUserList(pageParamRequest))); + } + + /** + * 新增用户地址 + * @param request 新增参数 + */ + @ApiOperation(value = "保存") + @RequestMapping(value = "/edit", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated UserAddressRequest request) { + return CommonResult.success(userAddressService.create(request)); + } + + /** + * 删除用户地址 + * @param request UserAddressDelRequest 参数 + */ + @ApiOperation(value = "删除") + @RequestMapping(value = "/del", method = RequestMethod.POST) + public CommonResult delete(@RequestBody UserAddressDelRequest request) { + if (userAddressService.delete(request.getId())) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 地址详情 + */ + @ApiOperation(value = "地址详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable("id") Integer id) { + return CommonResult.success(userAddressService.getDetail(id)); + } + + /** + * 获取默认地址 + */ + @ApiOperation(value = "获取默认地址") + @RequestMapping(value = "/default", method = RequestMethod.GET) + public CommonResult getDefault() { + return CommonResult.success(userAddressService.getDefault()); + + } + + /** + * 设置默认地址 + * @param request UserAddressDelRequest 参数 + */ + @ApiOperation(value = "设置默认地址") + @RequestMapping(value = "/default/set", method = RequestMethod.POST) + public CommonResult def(@RequestBody UserAddressDelRequest request) { + if (userAddressService.def(request.getId())) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserBankCardController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserBankCardController.java new file mode 100644 index 0000000..0e36d0d --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserBankCardController.java @@ -0,0 +1,97 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.user.UserBankCard; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserBankCardRequest; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.UserBankCardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + * * 用户银行卡 前端控制器 + * * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/bank") +@Api(tags = "用户 -- 银行") +public class UserBankCardController { + + @Autowired + private UserBankCardService userBankCardService; + + /** + * 分页显示用户银行卡 + */ + @ApiOperation(value = "列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userBankCardService.getList(pageParamRequest))); + } + + /** + * 新增用户银行卡 + * @param request 新增参数 + */ + @ApiOperation(value = "保存") + @RequestMapping(value = "/edit", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated UserBankCardRequest request) { + return CommonResult.success(userBankCardService.create(request)); + } + + /** + * 删除用户银行卡 + * @param id Integer 参数 + */ + @ApiOperation(value = "删除") + @RequestMapping(value = "/del", method = RequestMethod.POST) + public CommonResult delete(@RequestBody Integer id) { + if (userBankCardService.delete(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 银行卡详情 + */ + @ApiOperation(value = "银行卡详情") + @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET) + public CommonResult info(@PathVariable("id") Integer id) { + return CommonResult.success(userBankCardService.getDetail(id)); + } + + /** + * 获取默认银行卡 + */ + @ApiOperation(value = "获取默认银行卡") + @RequestMapping(value = "/default", method = RequestMethod.GET) + public CommonResult getDefault() { + return CommonResult.success(userBankCardService.getDefault()); + } + + /** + * 设置默认银行卡 + * @param id 参数 + */ + @ApiOperation(value = "设置默认银行卡") + @RequestMapping(value = "/default/set", method = RequestMethod.POST) + public CommonResult def(@RequestBody Long id) { + if (userBankCardService.def(id)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserCollectController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserCollectController.java new file mode 100644 index 0000000..29adba0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserCollectController.java @@ -0,0 +1,96 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserCollectAllRequest; +import com.yzt.common.request.UserCollectRequest; +import com.yzt.common.response.UserRelationResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreProductRelationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + * 商品点赞和收藏表 前端控制器 + * fw_ + */ +@Slf4j +@RestController +@RequestMapping("api/front/collect") +@Api(tags = "用户 -- 点赞/收藏") +public class UserCollectController { + + @Autowired + private StoreProductRelationService storeProductRelationService; + + /** + * 我的收藏列表 + */ + @ApiOperation(value = "我的收藏列表") + @RequestMapping(value = "/user", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(storeProductRelationService.getUserList(pageParamRequest))); + } + + /** + * 添加收藏产品 + * @param request StoreProductRelationRequest 新增参数 + */ + @ApiOperation(value = "添加收藏产品") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public CommonResult save(@RequestBody @Validated UserCollectRequest request) { + if (storeProductRelationService.add(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 添加收藏产品 + * @param request UserCollectAllRequest 新增参数 + */ + @ApiOperation(value = "批量收藏") + @RequestMapping(value = "/all", method = RequestMethod.POST) + public CommonResult all(@RequestBody @Validated UserCollectAllRequest request) { + if (storeProductRelationService.all(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 取消收藏产品 + */ + @ApiOperation(value = "取消收藏产品") + @RequestMapping(value = "/delete", method = RequestMethod.POST) + public CommonResult delete(@RequestBody String requestJson) { + if (storeProductRelationService.delete(requestJson)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + + /** + * 取消收藏产品(通过商品) + */ + @ApiOperation(value = "取消收藏产品(通过商品)") + @RequestMapping(value = "/cancel/{proId}", method = RequestMethod.POST) + public CommonResult cancel(@PathVariable Integer proId) { + if (storeProductRelationService.deleteByProIdAndUid(proId)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserController.java new file mode 100644 index 0000000..14b00c0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserController.java @@ -0,0 +1,438 @@ +package com.yzt.front.controller; + + +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserExperienceRecord; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.TenantVo; +import com.yzt.front.service.UserCenterService; +import com.yzt.service.service.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 用户 -- 用户中心 + * fw_ + */ +@Slf4j +@RestController("FrontUserController") +@RequestMapping("api/front") +@Api(tags = "用户 -- 用户中心") +public class UserController { + + @Autowired + private UserService userService; + + @Autowired + private com.yzt.service.service.UserIntegralRecordService userIntegralRecordService; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private UserCenterService userCenterService; + + @Autowired + private SmsService smsService; + @Autowired + private StorePinkService storePinkService; + + @Autowired + private UserExtractService userExtractService; + + + + + /** + * 修改密码 + */ + @ApiOperation(value = "手机号修改密码") + @RequestMapping(value = "/register/reset", method = RequestMethod.POST) + public CommonResult password(@RequestBody @Validated PasswordRequest request) { + return CommonResult.success(userService.password(request)); + } + + + /** + * 修改密码 + */ + @ApiOperation(value = "修改密码") + @RequestMapping(value = "/user/reset", method = RequestMethod.POST) + public CommonResult updatePassword(@RequestBody @Validated UserPasswordRequest request) { + return CommonResult.success(userService.updateLoginPassword(request)); + } + + /** + * 修改密码 + */ + @ApiOperation(value = "修改交易密码") + @RequestMapping(value = "/user/updateTradePassword", method = RequestMethod.POST) + public CommonResult updateTradePassword(@RequestBody @Validated UserTradePasswordRequest request) { + return CommonResult.success(userService.updateTradePassword(request)); + } + + /** + * 修改个人资料 + */ + @ApiOperation(value = "修改个人资料") + @RequestMapping(value = "/user/edit", method = RequestMethod.POST) + public CommonResult personInfo(@RequestBody @Validated UserEditRequest request) { + if (userService.editUser(request)) { + return CommonResult.success(); + } + return CommonResult.failed(); + } + + /** + * 修改上级经销 + */ + @ApiOperation(value = "修改上级经销") + @RequestMapping(value = "/user/updateSpreadUser", method = RequestMethod.POST) + public CommonResult updateSpreadUser(@RequestBody @Validated UpdateSpreadUserRequest request) { + if (userService.updateSpreadUid(request)) { + return CommonResult.success("您已成功修改上级经销!"); + } + return CommonResult.failed(); + } + + /** + * 个人中心-用户信息 + */ + @ApiOperation(value = "个人中心-用户信息") + @RequestMapping(value = "/user", method = RequestMethod.GET) + public CommonResult getUserCenter() { + return CommonResult.success(userService.getUserCenter()); + } + + + /** + * 个人中心-我的拼团 + */ + @ApiOperation(value = "个人中心-我的拼团") + @RequestMapping(value = "/user/pink", method = RequestMethod.GET) + public CommonResult> getUserCenter(PinkQueryRequest request) { + storePinkService.getListByUid(request.getUid(),request.getQueueType()); + return CommonResult.success(userService.getUserPink(request)); + } + + /** + * 分页显示用户提现表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "积分提现-查看兑换记录") + @RequestMapping(value = "/apply/list", method = RequestMethod.GET) + public CommonResult> getList(UserExtractSearchRequest request,PageParamRequest pageParamRequest){ + CommonPage userExtractCommonPage = CommonPage.restPage(userExtractService.getList(request, pageParamRequest)); + return CommonResult.success(userExtractCommonPage); + } + + + /** + * 换绑手机号校验 + */ + @ApiOperation(value = "换绑手机号校验") + @RequestMapping(value = "update/binding/verify", method = RequestMethod.POST) + public CommonResult updatePhoneVerify(@RequestBody @Validated UserBindingPhoneUpdateRequest request) { + return CommonResult.success(userService.updatePhoneVerify(request)); + } + + /** + * 绑定手机号 + */ + @ApiOperation(value = "换绑手机号") + @RequestMapping(value = "update/binding", method = RequestMethod.POST) + public CommonResult updatePhone(@RequestBody @Validated UserBindingPhoneUpdateRequest request) { + return CommonResult.success(userService.updatePhone(request)); + } + + /** + * 用户中心菜单 + */ + @ApiOperation(value = "获取个人中心菜单") + @RequestMapping(value = "/menu/user", method = RequestMethod.GET) + public CommonResult> getMenuUser() { + return CommonResult.success(systemGroupDataService.getMenuUser()); + } + + /** + * 推广数据接口(昨天的佣金 累计提现金额 当前佣金) + */ + @ApiOperation(value = "推广数据接口(昨天的佣金 累计提现金额 当前佣金)") + @RequestMapping(value = "/commission", method = RequestMethod.GET) + public CommonResult getCommission() { + return CommonResult.success(userCenterService.getCommission()); + } + + /** + * 推广数据接口(总收益 今日收益 待结算) + */ + @ApiOperation(value = "收益统计 总收益 今日收益 待结算)") + @RequestMapping(value = "/user/commission", method = RequestMethod.GET) + public CommonResult getuserCommission() { + return CommonResult.success(userCenterService.getUserCommission()); + } + + + + @ApiOperation("获取租户详情") + @GetMapping("/user/tenant") + public CommonResult getTenant() { + return CommonResult.success(userCenterService.getTenantByUid()); + } + + /** + * 推广佣金明细 + */ + @ApiOperation(value = "推广佣金明细-收益记录") + @RequestMapping(value = "/spread/commission/detail", method = RequestMethod.GET) + public CommonResult> getSpreadCommissionDetail(@Validated PageParamRequest pageParamRequest) { + PageInfo commissionDetail = userCenterService.getSpreadCommissionDetail(pageParamRequest); + return CommonResult.success(CommonPage.restPage(commissionDetail)); + } + + /** + * 推广佣金/提现总和 + */ + @ApiOperation(value = "推广佣金/提现总和") + @RequestMapping(value = "/spread/count/{type}", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "类型 佣金类型3=佣金,4=提现", allowableValues = "range[3,4]", dataType = "int") + public CommonResult> getSpreadCountByType(@PathVariable Integer type) { + Map map = new HashMap<>(); + map.put("count", userCenterService.getSpreadCountByType(type)); + return CommonResult.success(map); + } + + /** + * 提现申请 + */ + @ApiOperation(value = "提现申请") + @RequestMapping(value = "/extract/cash", method = RequestMethod.POST) + public CommonResult extractCash(@RequestBody @Validated UserExtractRequest request) { + return CommonResult.success(userCenterService.extractCash(request)); + } + + /** + * 提现记录 + */ + @ApiOperation(value = "提现记录") + @RequestMapping(value = "/extract/record", method = RequestMethod.GET) + public CommonResult> getExtractRecord(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userCenterService.getExtractRecord(pageParamRequest))); + } + + /** + * 提现用户信息 + */ + @ApiOperation(value = "提现用户信息") + @RequestMapping(value = "/extract/user", method = RequestMethod.GET) + public CommonResult getExtractUser() { + return CommonResult.success(userCenterService.getExtractUser()); + } + + /** + * 提现银行 + */ + @ApiOperation(value = "提现银行/提现最低金额") + @RequestMapping(value = "/extract/bank", method = RequestMethod.GET) + public CommonResult> getExtractBank() { + return CommonResult.success(userCenterService.getExtractBank()); + } + + /** + * 会员等级列表 + */ + @ApiOperation(value = "会员等级列表") + @RequestMapping(value = "/user/level/grade", method = RequestMethod.GET) + public CommonResult> getUserLevelList() { + return CommonResult.success(userCenterService.getUserLevelList()); + } + + /** + * 个人中心-用户信息 + */ + @ApiOperation(value = "个人中心-上级经销商信息") + @RequestMapping(value = "/user/referInfo", method = RequestMethod.GET) + public CommonResult getReferInfo() { + return CommonResult.success(userService.getReferInfo()); + } + + /** + * 推广人统计 + */ + @ApiOperation(value = "推广人统计") + @RequestMapping(value = "/spread/people/count", method = RequestMethod.GET) + public CommonResult getSpreadPeopleCount() { + return CommonResult.success(userCenterService.getSpreadPeopleCount()); + } + + /** + * 推广人列表 + */ + @ApiOperation(value = "推广人列表") + @RequestMapping(value = "/spread/people", method = RequestMethod.GET) + public CommonResult> getSpreadPeopleList(@Validated UserSpreadPeopleRequest request, @Validated PageParamRequest pageParamRequest) { + List spreadPeopleList = userCenterService.getSpreadPeopleList(request, pageParamRequest); + CommonPage commonPage = CommonPage.restPage(spreadPeopleList); + return CommonResult.success(commonPage); + } + + /** + * 推广人二级列表 + */ + @ApiOperation(value = "推广人二级列表") + @RequestMapping(value = "/spread/second-people", method = RequestMethod.GET) + public CommonResult> getSecondSpreadPeopleList(@Validated UserSpreadPeopleRequest request, @Validated PageParamRequest pageParamRequest) { + List spreadPeopleList = userCenterService.getSecondSpreadPeopleList(request, pageParamRequest); + CommonPage commonPage = CommonPage.restPage(spreadPeopleList); + return CommonResult.success(commonPage); + } + + + /** + * 用户积分信息 + */ + @ApiOperation(value = "用户积分信息") + @RequestMapping(value = "/integral/user", method = RequestMethod.GET) + public CommonResult getIntegralUser() { + return CommonResult.success(userCenterService.getIntegralUser()); + } + + /** + * 根据手机号查询收款用户(转账回显) + */ + @ApiOperation(value = "根据手机号查询收款用户(转账回显)") + @RequestMapping(value = "/integral/transfer/check", method = RequestMethod.GET) + public CommonResult getTransferUser(@RequestParam String phone) { + com.yzt.common.model.user.User user = userService.getByPhone(phone); + if (cn.hutool.core.util.ObjectUtil.isNull(user)) { + return CommonResult.failed("用户不存在"); + } + java.util.HashMap map = new java.util.HashMap<>(); + map.put("uid", user.getUid()); + map.put("nickname", user.getNickname()); + map.put("phone", user.getPhone()); + map.put("avatar", user.getAvatar()); + map.put("integral", user.getIntegral()); + return CommonResult.success(map); + } + + /** + * 积分转让 + */ + @ApiOperation(value = "积分转让") + @RequestMapping(value = "/integral/transfer", method = RequestMethod.POST) + public CommonResult transferIntegral(@RequestBody @Validated com.yzt.common.request.UserIntegralTransferRequest request) { + return CommonResult.success(userIntegralRecordService.transferIntegral(request.getPhone(), request.getIntegral(), request.getTradePassword(), request.getTransferType())); + } + + /** + * 积分记录 + */ + @ApiOperation(value = "积分记录") + @RequestMapping(value = "/integral/list", method = RequestMethod.GET) + public CommonResult> getIntegralList(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userCenterService.getUserIntegralRecordList(pageParamRequest))); + } + + /** + * 经验记录 + */ + @ApiOperation(value = "经验记录") + @RequestMapping(value = "/user/expList", method = RequestMethod.GET) + public CommonResult> getExperienceList(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(CommonPage.restPage(userCenterService.getUserExperienceList(pageParamRequest))); + } + + /** + * 用户资金统计 + */ + @ApiOperation(value = "用户资金统计") + @RequestMapping(value = "/user/balance", method = RequestMethod.GET) + public CommonResult getUserBalance() { + return CommonResult.success(userCenterService.getUserBalance()); + } + + /** + * 推广订单 + */ + @ApiOperation(value = "推广订单") + @RequestMapping(value = "/spread/order", method = RequestMethod.GET) + public CommonResult getSpreadOrder(@Validated PageParamRequest pageParamRequest) { + return CommonResult.success(userCenterService.getSpreadOrder(pageParamRequest)); + } + + /** + * 推广人排行 + * @return List + */ + @ApiOperation(value = "推广人排行") + @RequestMapping(value = "/rank", method = RequestMethod.GET) + public CommonResult> getTopSpreadPeopleListByDate(@RequestParam(required = false) String type, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(userCenterService.getTopSpreadPeopleListByDate(type, pageParamRequest)); + } + + /** + * 佣金排行 + * @return 优惠券集合 + */ + @ApiOperation(value = "佣金排行") + @RequestMapping(value = "/brokerage_rank", method = RequestMethod.GET) + public CommonResult> getTopBrokerageListByDate(@RequestParam String type, @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(userCenterService.getTopBrokerageListByDate(type, pageParamRequest)); + } + + /** + * 当前用户在佣金排行第几名 + */ + @ApiOperation(value = "当前用户在佣金排行第几名") + @RequestMapping(value = "/user/brokerageRankNumber", method = RequestMethod.GET) + public CommonResult getNumberByTop(@RequestParam String type) { + return CommonResult.success(userCenterService.getNumberByTop(type)); + } + + /** + * 海报背景图 + */ + @ApiOperation(value = "推广海报图") + @RequestMapping(value = "/user/spread/banner", method = RequestMethod.GET) + public CommonResult> getSpreadBannerList() { + return CommonResult.success(userCenterService.getSpreadBannerList()); + } + + /** + * 绑定推广关系(登录状态) + * @param spreadPid 推广id + * @return 绑定结果 + */ + @ApiOperation(value = "绑定推广关系(登录状态)") + @RequestMapping(value = "/user/bindSpread", method = RequestMethod.GET) + public CommonResult bindsSpread(Integer spreadPid) { + userService.bindSpread(spreadPid); + return CommonResult.success(); + } + +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserCouponController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserCouponController.java new file mode 100644 index 0000000..3b2ad63 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserCouponController.java @@ -0,0 +1,63 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserCouponReceiveRequest; +import com.yzt.common.response.StoreCouponUserResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.StoreCouponUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 优惠卷控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/front/coupon") +@Api(tags = "营销 -- 优惠券") +public class UserCouponController { + + @Autowired + private StoreCouponUserService storeCouponUserService; + + /** + * 我的优惠券 + */ + @ApiOperation(value = "我的优惠券") + @RequestMapping(value = "/list", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="type", value="类型,usable-可用,unusable-不可用", required = true), + @ApiImplicitParam(name="page", value="页码", required = true), + @ApiImplicitParam(name="limit", value="每页数量", required = true) + }) + public CommonResult> getList(@RequestParam(value = "type") String type, + @Validated PageParamRequest pageParamRequest) { + return CommonResult.success(storeCouponUserService.getMyCouponList(type, pageParamRequest)); + } + + /** + * 领券 + * @param request UserCouponReceiveRequest 新增参数 + */ + @ApiOperation(value = "领券") + @RequestMapping(value = "/receive", method = RequestMethod.POST) + public CommonResult receive(@RequestBody @Validated UserCouponReceiveRequest request) { + if (storeCouponUserService.receiveCoupon(request)) { + return CommonResult.success(); + } else { + return CommonResult.failed(); + } + } + +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserRechargeController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserRechargeController.java new file mode 100644 index 0000000..4c89ad0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserRechargeController.java @@ -0,0 +1,124 @@ +package com.yzt.front.controller; + +import com.yzt.common.constants.Constants; +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeApplicationRequest; +import com.yzt.common.request.UserRechargeRequest; +import com.yzt.common.response.OrderPayResultResponse; +import com.yzt.common.response.UserRechargeBillRecordResponse; +import com.yzt.common.response.UserRechargeFrontResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.YztUtil; +import com.yzt.front.service.UserCenterService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +/** + * 用户 -- 充值 + * fw_ + */ +@Slf4j +@RestController("UserRechargeController") +@RequestMapping("api/front/recharge") +@Api(tags = "用户 -- 充值") +public class UserRechargeController { + @Autowired + private UserCenterService userCenterService; + + @ApiOperation("提交充值申请") + @RequestMapping(value = "/userRechargeApply", method = RequestMethod.POST) + public CommonResult userRechargeApply(@Valid @RequestBody UserRechargeApplicationRequest request) { + return CommonResult.success(userCenterService.userRechargeApply(request)); + } + + /** + * 个人中心-兑换记录 + */ + @ApiOperation(value = "个人中心-所属会馆-兑换记录") + @RequestMapping(value = "/user/userPage", method = RequestMethod.GET) + public CommonResult> getUserApplications(@Validated PageParamRequest pageParamRequest,Integer status){ + CommonPage responseCommonPage = CommonPage.restPage(userCenterService.getUserApplications(pageParamRequest,status)); + return CommonResult.success(responseCommonPage); + } + + + /** + * 充值额度选择 + */ + @ApiOperation(value = "充值额度选择") + @RequestMapping(value = "/index", method = RequestMethod.GET) + public CommonResult getRechargeConfig() { + return CommonResult.success(userCenterService.getRechargeConfig()); + } + + /** + * 小程序充值 + */ + @ApiOperation(value = "小程序充值") + @RequestMapping(value = "/routine", method = RequestMethod.POST) + public CommonResult> routineRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request) { + request.setFromType(Constants.PAY_TYPE_WE_CHAT_FROM_PROGRAM); + request.setClientIp(YztUtil.getClientIp(httpServletRequest)); + OrderPayResultResponse recharge = userCenterService.recharge(request); + Map map = new HashMap<>(); + map.put("data", recharge); + map.put("type", request.getFromType()); + return CommonResult.success(map); + } + + /** + * 公众号充值 + */ + @ApiOperation(value = "公众号充值") + @RequestMapping(value = "/wechat", method = RequestMethod.POST) + public CommonResult weChatRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request) { + request.setClientIp(YztUtil.getClientIp(httpServletRequest)); + return CommonResult.success(userCenterService.recharge(request)); + } + + /** + * App充值 + */ + @ApiOperation(value = "App充值") + @RequestMapping(value = "/wechat/app", method = RequestMethod.POST) + public CommonResult weChatAppRecharge(HttpServletRequest httpServletRequest, @RequestBody @Validated UserRechargeRequest request) { + request.setClientIp(YztUtil.getClientIp(httpServletRequest)); + return CommonResult.success(userCenterService.recharge(request)); + } + + /** + * 佣金转入余额 + */ + @ApiOperation(value = "佣金转入余额") + @RequestMapping(value = "/transferIn", method = RequestMethod.POST) + public CommonResult transferIn(@RequestParam(name = "price") BigDecimal price) { + return CommonResult.success(userCenterService.transferIn(price)); + } + + /** + * 用户账单记录 + */ + @ApiOperation(value = "用户账单记录") + @RequestMapping(value = "/bill/record", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "记录类型:all-全部,expenditure-支出,income-收入", required = true) + public CommonResult> billRecord(@RequestParam(name = "type") String type, @ModelAttribute PageParamRequest pageRequest) { + return CommonResult.success(userCenterService.nowMoneyBillRecord(type, pageRequest)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserSignController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserSignController.java new file mode 100644 index 0000000..e2e963e --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserSignController.java @@ -0,0 +1,97 @@ +package com.yzt.front.controller; + +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserSignInfoResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.SystemGroupDataSignConfigVo; +import com.yzt.common.vo.UserSignMonthVo; +import com.yzt.common.vo.UserSignVo; +import com.yzt.service.service.UserSignService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.List; + + +/** + * 签到记录表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/front/user/sign") +@Api(tags = "用户 -- 签到") +public class UserSignController { + + @Autowired + private UserSignService userSignService; + + /** + * 签到列表 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/list", method = RequestMethod.GET) + public CommonResult> getList(@Validated PageParamRequest pageParamRequest) { + CommonPage userSignCommonPage = CommonPage.restPage(userSignService.getList(pageParamRequest)); + return CommonResult.success(userSignCommonPage); + } + + /** + * 签到列表,年月纬度 + * @param pageParamRequest 分页参数 + */ + @ApiOperation(value = "分页列表") + @RequestMapping(value = "/month", method = RequestMethod.GET) + public CommonResult> getListGroupMonth(@Validated PageParamRequest pageParamRequest) { + CommonPage userSignCommonPage = CommonPage.restPage(userSignService.getListGroupMonth(pageParamRequest)); + return CommonResult.success(userSignCommonPage); + } + + /** + * 配置 + */ + @ApiOperation(value = "配置") + @RequestMapping(value = "/config", method = RequestMethod.GET) + public CommonResult> config() { + return CommonResult.success(userSignService.getSignConfig()); + } + + /** + * 签到 + */ + @ApiOperation(value = "签到") + @RequestMapping(value = "/integral", method = RequestMethod.GET) + public CommonResult info() { + return CommonResult.success(userSignService.sign()); + } + + /** + * 今日记录详情 + */ + @ApiOperation(value = "今日记录详情") + @RequestMapping(value = "/get", method = RequestMethod.GET) + public CommonResult> get() { + return CommonResult.success(userSignService.get()); + } + + /** + * 签到用户信息 + */ + @ApiOperation(value = "签到用户信息") + @RequestMapping(value = "/user", method = RequestMethod.POST) + public CommonResult getUserInfo() { + return CommonResult.success(userSignService.getUserSignInfo()); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/UserUploadController.java b/fightwine-front/src/main/java/com/yzt/front/controller/UserUploadController.java new file mode 100644 index 0000000..5e00328 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/UserUploadController.java @@ -0,0 +1,69 @@ +package com.yzt.front.controller; + + +import com.yzt.common.result.CommonResult; +import com.yzt.common.vo.FileResultVo; +import com.yzt.service.service.UploadService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + + +/** + * 上传文件 前端控制器 -- 用户端 + * + */ +@Slf4j +@RestController +@RequestMapping("api/front/upload") +@Api(tags = "用户上传文件") +public class UserUploadController { + + @Autowired + private UploadService uploadService; + + /** + * 图片上传 + */ + @ApiOperation(value = "图片上传") + @RequestMapping(value = "/image", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "model", value = "模块 用户user,商品product,微信wechat,news文章"), + @ApiImplicitParam(name = "pid", value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 ", allowableValues = "range[0,1,2,3,4,5,6,7,8]") + }) + public CommonResult image(MultipartFile multipart, + @RequestParam(value = "model") String model, + @RequestParam(value = "pid") Integer pid) throws IOException { + + return CommonResult.success(uploadService.imageUpload(multipart, model, pid)); + } + + /** + * 文件上传 + */ + @ApiOperation(value = "文件上传") + @RequestMapping(value = "/file", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name = "model", value = "模块 用户user,商品product,微信wechat,news文章"), + @ApiImplicitParam(name = "pid", value = "分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 ", allowableValues = "range[0,1,2,3,4,5,6,7,8]") + }) + public CommonResult file(MultipartFile multipart, + @RequestParam(value = "model") String model, + @RequestParam(value = "pid") Integer pid) throws IOException { + return CommonResult.success(uploadService.fileUpload(multipart, model, pid)); + } + +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/controller/WeChatController.java b/fightwine-front/src/main/java/com/yzt/front/controller/WeChatController.java new file mode 100644 index 0000000..d47cc2e --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/controller/WeChatController.java @@ -0,0 +1,120 @@ +package com.yzt.front.controller; + +import com.yzt.common.model.wechat.TemplateMessage; +import com.yzt.common.request.RegisterAppWxRequest; +import com.yzt.common.request.RegisterThirdUserRequest; +import com.yzt.common.request.WxBindingPhoneRequest; +import com.yzt.common.response.LoginResponse; +import com.yzt.common.response.WeChatJsSdkConfigResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.front.service.UserCenterService; +import com.yzt.service.service.SystemNotificationService; +import com.yzt.service.service.WechatNewService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * 微信缓存表 前端控制器 + * fw_ + */ +@Slf4j +@RestController("WeChatFrontController") +@RequestMapping("api/front/wechat") +@Api(tags = "微信 -- 开放平台") +public class WeChatController { + + @Autowired + private UserCenterService userCenterService; + + @Autowired + private WechatNewService wechatNewService; + + @Autowired + private SystemNotificationService systemNotificationService; + + /** + * 通过微信code登录 + */ + @ApiOperation(value = "微信登录公众号授权登录") + @RequestMapping(value = "/authorize/login", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name = "spread_spid", value = "推荐人id", dataType = "Integer"), + @ApiImplicitParam(name = "code", value = "code码", dataType = "String", required = true) + }) + public CommonResult login(@RequestParam(value = "spread_spid", defaultValue = "0", required = false) Integer spreadUid, + @RequestParam(value = "code") String code){ + return CommonResult.success(userCenterService.weChatAuthorizeLogin(code, spreadUid)); + } + + /** + * 微信登录小程序授权登录 + */ + @ApiOperation(value = "微信登录小程序授权登录") + @RequestMapping(value = "/authorize/program/login", method = RequestMethod.POST) + public CommonResult programLogin(@RequestParam String code, @RequestBody @Validated RegisterThirdUserRequest request){ + return CommonResult.success(userCenterService.weChatAuthorizeProgramLogin(code, request)); + } + + /** + * 微信登录App授权登录 + */ + @ApiOperation(value = "微信登录App授权登录") + @RequestMapping(value = "/authorize/app/login", method = RequestMethod.POST) + public CommonResult appLogin(@RequestBody @Validated RegisterAppWxRequest request){ + return CommonResult.success(userCenterService.appLogin(request)); + } + + /** + * 微信注册绑定手机号 + */ + @ApiOperation(value = "微信注册绑定手机号") + @RequestMapping(value = "/register/binding/phone", method = RequestMethod.POST) + public CommonResult registerBindingPhone(@RequestBody @Validated WxBindingPhoneRequest request){ + return CommonResult.success(userCenterService.registerBindingPhone(request)); + } + + /** + * 获取微信公众号js配置 + */ + @ApiOperation(value = "获取微信公众号js配置") + @RequestMapping(value = "/config", method = RequestMethod.GET) + @ApiImplicitParam(name = "url", value = "页面地址url") + public CommonResult configJs(@RequestParam(value = "url") String url){ + return CommonResult.success(wechatNewService.getJsSdkConfig(url)); + } + + /** + * 小程序获取授权logo + */ + @ApiOperation(value = "小程序获取授权logo") + @RequestMapping(value = "/getLogo", method = RequestMethod.GET) + public CommonResult> getLogo(){ + Map map = new HashMap<>(); + map.put("logoUrl", userCenterService.getLogo()); + return CommonResult.success(map); + } + + /** + * 订阅消息模板列表 + */ + @ApiOperation(value = "订阅消息模板列表") + @RequestMapping(value = "/program/my/temp/list", method = RequestMethod.GET) + @ApiImplicitParam(name = "type", value = "支付之前:beforePay|支付成功:afterPay|申请退款:refundApply|充值之前:beforeRecharge|创建砍价:createBargain|参与拼团:pink|取消拼团:cancelPink") + public CommonResult> programMyTempList(@RequestParam(name = "type") String type){ + return CommonResult.success(systemNotificationService.getMiniTempList(type)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/filter/ResponseFilter.java b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseFilter.java new file mode 100644 index 0000000..7932273 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseFilter.java @@ -0,0 +1,53 @@ +package com.yzt.front.filter; + + +import com.yzt.common.config.YztConfig; +import com.yzt.common.utils.RequestUtil; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + + +/** + * + * 返回值输出过滤器,用于处理响应体中的路径,根据配置过滤不需要处理的路径 + */ +//@Component +public class ResponseFilter implements Filter { + + @Autowired + YztConfig yztConfig; + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + ResponseWrapper wrapperResponse = new ResponseWrapper((HttpServletResponse) response);//转换成代理类 + // 这里只拦截返回,直接让请求过去,如果在请求前有处理,可以在这里处理 + filterChain.doFilter(request, wrapperResponse); + byte[] content = wrapperResponse.getContent();//获取返回值 + //判断是否有值 + if (content.length > 0) { + String str = new String(content, StandardCharsets.UTF_8); + + try { + HttpServletRequest req = (HttpServletRequest) request; + str = new ResponseRouter().filter(str, RequestUtil.getUri(req), yztConfig); + } catch (Exception e) { + e.printStackTrace(); + } + //把返回值输出到客户端 + ServletOutputStream outputStream = response.getOutputStream(); + if (str.length() > 0) { + outputStream.write(str.getBytes()); + outputStream.flush(); + outputStream.close(); + //最后添加这一句,输出到客户端 + response.flushBuffer(); + } + } + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/filter/ResponseRouter.java b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseRouter.java new file mode 100644 index 0000000..0b15f94 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseRouter.java @@ -0,0 +1,53 @@ +package com.yzt.front.filter; + +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.utils.SpringUtil; +import com.yzt.service.service.SystemAttachmentService; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +/** + * response路径处理类,用于处理响应体中的路径,根据配置过滤不需要处理的路径 + * + */ +public class ResponseRouter { + + public String filter(String data, String path, YztConfig yztConfig) { + boolean result = un().contains(path); + if (result) { + return data; + } + + //系统不用过滤的URL,针对数据而非token + PathMatcher pathMatcher = new AntPathMatcher(); + for (String configUrl : yztConfig.getIgnored()) { + if(pathMatcher.match(path, configUrl)){ + return data; + } + } + + if (!path.contains("api/admin/") && !path.contains("api/front/")) { + return data; + } + + //根据需要处理返回值 + if ((data.contains(UploadConstants.UPLOAD_FILE_KEYWORD+"/") && !data.contains("data:image/png;base64")) + || data.contains(UploadConstants.DOWNLOAD_FILE_KEYWORD) || data.contains(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD)) { + if (data.contains(UploadConstants.DOWNLOAD_FILE_KEYWORD+"/"+Constants.UPLOAD_MODEL_PATH_EXCEL)) { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixFile(data); + } else if(data.contains(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD+"/")) { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixUploadf(data); + } else { + data = SpringUtil.getBean(SystemAttachmentService.class).prefixImage(data); + } + } + + return data; + } + + public static String un() { + return ""; + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/filter/ResponseWrapper.java b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseWrapper.java new file mode 100644 index 0000000..65c8d35 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/filter/ResponseWrapper.java @@ -0,0 +1,69 @@ +package com.yzt.front.filter; + + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * Response包装类,用于包装HttpServletResponse,实现对响应体的拦截和处理 + * + */ +public class ResponseWrapper extends HttpServletResponseWrapper { + + private ByteArrayOutputStream buffer; + + private ServletOutputStream out; + + public ResponseWrapper(HttpServletResponse httpServletResponse) { + super(httpServletResponse); + buffer = new ByteArrayOutputStream(); + out = new WrapperOutputStream(buffer); + } + + @Override + public ServletOutputStream getOutputStream() { + return out; + } + + @Override + public void flushBuffer() + throws IOException { + if (out != null) { + out.flush(); + } + } + + public byte[] getContent() + throws IOException { + flushBuffer(); + return buffer.toByteArray(); + } + + static class WrapperOutputStream extends ServletOutputStream { + private ByteArrayOutputStream bos; + + public WrapperOutputStream(ByteArrayOutputStream bos) { + this.bos = bos; + } + + @Override + public void write(int b) { + bos.write(b); + } + + @Override + public boolean isReady() { + return false; + + } + + @Override + public void setWriteListener(WriteListener arg0) { + + } + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/interceptor/FrontTokenInterceptor.java b/fightwine-front/src/main/java/com/yzt/front/interceptor/FrontTokenInterceptor.java new file mode 100644 index 0000000..43820e0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/interceptor/FrontTokenInterceptor.java @@ -0,0 +1,53 @@ +package com.yzt.front.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.token.FrontTokenComponent; +import com.yzt.common.utils.RequestUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 移动端管理端 token验证拦截器 使用前注意需要一个@Bean手动注解,否则注入无效 + * fw_ + */ +public class FrontTokenInterceptor implements HandlerInterceptor { + + @Autowired + private FrontTokenComponent frontTokenComponent; + + //程序处理之前需要处理的业务 + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + response.setCharacterEncoding("UTF-8"); + String token = frontTokenComponent.getToken(request); + if(token == null || token.isEmpty()){ + //判断路由,部分路由不管用户是否登录都可以访问 + boolean result = frontTokenComponent.checkRouter(RequestUtil.getUri(request)); + if(result){ + return true; + } + response.getWriter().write(JSONObject.toJSONString(CommonResult.failed(CommonResultCode.UNAUTHORIZED))); + return false; + } + + Boolean result = frontTokenComponent.check(token, request); + if(!result){ + response.getWriter().write(JSONObject.toJSONString(CommonResult.failed(CommonResultCode.PERMISSION_EXPIRATION))); + return false; + } + return true; + } + + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { + } + + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/pub/GetJSConfig.java b/fightwine-front/src/main/java/com/yzt/front/pub/GetJSConfig.java new file mode 100644 index 0000000..3755e55 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/pub/GetJSConfig.java @@ -0,0 +1,32 @@ +package com.yzt.front.pub; + +import com.yzt.common.constants.Constants; +import com.yzt.service.service.SystemConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 公共JS配置类,用于提供公共的JS配置 + **/ +@Slf4j +@RestController +@RequestMapping("api/public/jsconfig") +@Api(tags = "公共JS配置") +public class GetJSConfig { + + @Autowired + private SystemConfigService systemConfigService; + + @PreAuthorize("hasAuthority('public:jsconfig:getcrmebchatconfig')") + @ApiOperation(value = "YZT-chat客服统计") + @RequestMapping(value = "/getcrmebchatconfig", method = RequestMethod.GET) + public String set(){ + return systemConfigService.getValueByKey(Constants.JS_CONFIG_YZT_CHAT_TONGJI); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/pub/PubliclyConfigController.java b/fightwine-front/src/main/java/com/yzt/front/pub/PubliclyConfigController.java new file mode 100644 index 0000000..46935b8 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/pub/PubliclyConfigController.java @@ -0,0 +1,52 @@ +package com.yzt.front.pub; + +import com.yzt.common.constants.CopyrightConstants; +import com.yzt.common.response.CopyRightResponse; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SystemConfigService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +/** + * 公开设置控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/config") +@Api(tags = "公开设置控制器") +public class PubliclyConfigController { + + @Autowired + private SystemConfigService systemConfigService; + + @ApiOperation(value = "获取版权") + @RequestMapping(value = "/get/copyright", method = RequestMethod.GET) + public CommonResult getCopyright() { + CopyRightResponse copyRightResponse = new CopyRightResponse(); + copyRightResponse.setCopyrightIcpNumber(systemConfigService.getValueByKey(CopyrightConstants.COPYRIGHT_ICP_NUMBER)); + copyRightResponse.setCopyrightIcpNumberUrl(systemConfigService.getValueByKey(CopyrightConstants.COPYRIGHT_ICP_NUMBER_URL)); + copyRightResponse.setCopyrightInternetRecord(systemConfigService.getValueByKey(CopyrightConstants.COPYRIGHT_INTERNET_RECORD)); + copyRightResponse.setCopyrightInternetRecordUrl(systemConfigService.getValueByKey(CopyrightConstants.COPYRIGHT_INTERNET_RECORD_URL)); + return CommonResult.success(copyRightResponse); + } + + @ApiOperation(value = "获取移动端域名") + @RequestMapping(value = "/get/front/domain", method = RequestMethod.GET) + public CommonResult getFrontDomain() { + return CommonResult.success(systemConfigService.getFrontDomain()); + } + + @ApiOperation(value = "获取平台当前的素材地址") + @RequestMapping(value = "/get/admin/mediadomain", method = RequestMethod.GET) + public CommonResult getMediaDomain() { + return CommonResult.success(systemConfigService.getMediaDomain()); + } + + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/pub/SafetyController.java b/fightwine-front/src/main/java/com/yzt/front/pub/SafetyController.java new file mode 100644 index 0000000..e334795 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/pub/SafetyController.java @@ -0,0 +1,47 @@ +package com.yzt.front.pub; + +import com.anji.captcha.model.common.ResponseModel; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.SafetyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * 安全验证控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/safety") +@Api(tags = "安全验证控制器") +public class SafetyController { + + @Autowired + private SafetyService safetyService; + + @ApiOperation(value = "获取行为验证码") + @RequestMapping(value = "/get", method = RequestMethod.POST) + public CommonResult getSafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.getSafetyCode(data, request)); + } + + @ApiOperation(value = "验证行为验证码") + @RequestMapping(value = "/check", method = RequestMethod.POST) + public CommonResult checkSafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.checkSafetyCode(data, request)); + } + + @ApiOperation(value = "行为验证码二次校验") + @RequestMapping(value = "/verify", method = RequestMethod.POST) + public CommonResult verifySafetyCode(@RequestBody com.anji.captcha.model.vo.CaptchaVO data, HttpServletRequest request) { + return CommonResult.success(safetyService.verifySafetyCode(data)); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/pub/WeChatPushController.java b/fightwine-front/src/main/java/com/yzt/front/pub/WeChatPushController.java new file mode 100644 index 0000000..219dd16 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/pub/WeChatPushController.java @@ -0,0 +1,145 @@ +package com.yzt.front.pub; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.result.CommonResult; +import com.yzt.common.utils.RestTemplateUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + + +/** + * 后台管理员表 前端控制器 + * + */ +@Slf4j +@RestController +@RequestMapping("api/public/wechat") +@Api(tags = "企业微信消息推送") +public class WeChatPushController { + + private static String url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="; + + @Resource + private RestTemplateUtil restTemplateUtil; + + + /** + * 新增后台管理员表 + * @param message string message + * @author Mr.Zhang + * @since 2020-04-13 + */ + @ApiOperation(value = "gitlab钩子") + @RequestMapping(value = "/gitlab", method = RequestMethod.POST) + @ApiImplicitParams({ + @ApiImplicitParam(name="message", value="推送消息内容"), + @ApiImplicitParam(name="token", value="企业微信群token"), + }) + public CommonResult gitlab(@RequestBody String message, + @RequestParam(name = "token", required = true) String token){ + + Map map = new HashMap<>(); + map.put("msgtype", "text"); + + Map text = new HashMap<>(); + + //需要@的人 + ArrayList people = new ArrayList<>(); + people.add("@all"); + text.put("mentioned_list", people); + + //gitlab 动作标签 + JSONObject jsonObject = JSONObject.parseObject(message); + String action = jsonObject.getString("object_kind"); + String content; + switch(action){ + case "push": + content = jsonObject.getJSONArray("commits").getJSONObject(0).getJSONObject("author").getString("name") + " " + + action + " " + + jsonObject.getString("ref").replace("refs/heads/", "") + + "\n 备注:\n" + + jsonObject.getJSONArray("commits").getJSONObject(0).getString("message"); + break; + case "tag_push": + content = jsonObject.getString("user_name") + " " + + action + " " + + jsonObject.getString("ref").replace("refs/heads/", "") + + "\n 备注:\n" + + jsonObject.getJSONArray("commits").getJSONObject(0).getString("message"); + break; + case "note": + String author = "未知用户"; + if(jsonObject.containsKey("commit")){ + author = jsonObject.getJSONObject("commit").getJSONObject("author").getString("name"); + } + + if(jsonObject.containsKey("last_commit")){ + author = jsonObject.getJSONObject("last_commit").getJSONObject("author").getString("name"); + } + + content = author + + " 提交代码到 " + + jsonObject.getJSONObject("project").getString("default_branch") + + "\n 备注:\n" + + jsonObject.getJSONObject("object_attributes").getString("note"); + break; + case "merge_request": + content = jsonObject.getJSONObject("object_attributes").getJSONObject("assignee").getString("name") + " " + + "合并代码, 从 " + + jsonObject.getJSONObject("object_attributes").getString("source_branch") + " ---> " + + jsonObject.getJSONObject("object_attributes").getString("target_branch") + + "\n 备注:\n" + + jsonObject.getJSONObject("object_attributes").getJSONObject("last_commit").getString("message"); + break; + default: + content = "gitlab 项目有更新"; + } + + text.put("content", content); + map.put("text", text); + String result = restTemplateUtil.postMapData(url + token, map); + return CommonResult.success(JSONObject.parseObject(result)); + } + + /** + * 新增后台管理员表 + * @param message string message + * @author Mr.Zhang + * @since 2020-04-13 + */ + @ApiOperation(value = "消息推送") + @RequestMapping(value = "/push", method = RequestMethod.GET) + @ApiImplicitParams({ + @ApiImplicitParam(name="message", value="推送消息内容"), + @ApiImplicitParam(name="token", value="企业微信群token"), + }) + public CommonResult push(@RequestParam(name = "message") String message, + @RequestParam(name = "token") String token){ + + Map map = new HashMap<>(); + map.put("msgtype", "text"); + + Map text = new HashMap<>(); + + //需要@的人 + ArrayList people = new ArrayList<>(); + people.add("@all"); + text.put("mentioned_list", people); + text.put("content", message); + map.put("text", text); + String result = restTemplateUtil.postMapData(url + token, map); + return CommonResult.success(JSONObject.parseObject(result)); + } +} + + + diff --git a/fightwine-front/src/main/java/com/yzt/front/service/IndexService.java b/fightwine-front/src/main/java/com/yzt/front/service/IndexService.java new file mode 100644 index 0000000..ace9e6d --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/IndexService.java @@ -0,0 +1,79 @@ +package com.yzt.front.service; + +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CopyrightConfigInfoResponse; +import com.yzt.common.response.IndexInfoResponse; +import com.yzt.common.response.IndexProductResponse; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; +import com.yzt.common.vo.MyRecord; + +import java.util.HashMap; +import java.util.List; + +/** +* IndexService 接口 +* fw_ +*/ +public interface IndexService{ + + /** + * 首页信息 + * @return IndexInfoResponse + */ + IndexInfoResponse getIndexInfo(); + + /** + * 首页信息 25.11.14 + * @return IndexInfoResponse + */ + IndexInfoResponse getHomePage(); + + /** + * 热门搜索 + * @return List + */ + List> hotKeywords(); + + /** + * 分享配置信息 + */ + HashMap getShareConfig(); + + /** + * 获取首页商品列表 + * @param type 类型 【1 精品推荐 2 热门榜单 3首发新品 4促销单品】 + * @param pageParamRequest 分页参数 + * @return List + */ + CommonPage findIndexProductList(Integer type, PageParamRequest pageParamRequest); + + /** + * 获取颜色配置 + * @return SystemConfig + */ + SystemConfig getColorConfig(); + + /** + * 获取版本信息 + * @return MyRecord + */ + MyRecord getVersion(); + + /** + * 获取全局本地图片域名 + * @return String + */ + String getImageDomain(); + + /** + * 获取公司版权图片 + */ + CopyrightConfigInfoResponse getCopyrightInfo(); + + /** + * 获取底部导航信息 + */ + PageLayoutBottomNavigationResponse getBottomNavigationInfo(); +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/LoginService.java b/fightwine-front/src/main/java/com/yzt/front/service/LoginService.java new file mode 100644 index 0000000..6f6c8d3 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/LoginService.java @@ -0,0 +1,61 @@ +package com.yzt.front.service; + +import com.yzt.common.model.user.User; +import com.yzt.common.request.LoginMobileRequest; +import com.yzt.common.request.LoginRequest; +import com.yzt.common.request.RegisterRequest; +import com.yzt.common.response.LoginConfigResponse; +import com.yzt.common.response.LoginResponse; + +import javax.servlet.http.HttpServletRequest; + +/** + * 移动端登录服务类 + * + */ +public interface LoginService { + + /** + * 账号密码登录 + * + * @return LoginResponse + */ + LoginResponse login(LoginRequest loginRequest); + + /** + * 手机号验证码登录 + */ + LoginResponse phoneLogin(LoginMobileRequest loginRequest); + + /** + * 老绑定分销关系 + * + * @param user User 用户user类 + * @param spreadUid Integer 推广人id + * @return Boolean + */ + Boolean bindSpread(User user, Integer spreadUid); + + /** + * 推出登录 + * + * @param request HttpServletRequest + */ + void loginOut(HttpServletRequest request); + + /** + * 校验token是否有效 + * + * @return true 有效, false 无效 + */ + Boolean tokenIsExist(); + + /** + * 获取登录配置 + */ + LoginConfigResponse getLoginConfig(); + + Boolean register(RegisterRequest request); + + void refreshToken(HttpServletRequest request); +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/ProductService.java b/fightwine-front/src/main/java/com/yzt/front/service/ProductService.java new file mode 100644 index 0000000..4e4a5a0 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/ProductService.java @@ -0,0 +1,111 @@ +package com.yzt.front.service; + +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ProductListRequest; +import com.yzt.common.request.ProductRequest; +import com.yzt.common.response.*; +import com.yzt.common.vo.CategoryTreeVo; + +import java.util.List; + +/** +* IndexService 接口 +* fw_ +*/ +public interface ProductService { + + /** + * 商品分类 + * @return List + */ + List getCategory(); + + /** + * 商品列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + CommonPage getList(ProductRequest request, PageParamRequest pageParamRequest); + + /** + * 获取商品详情列表 + * @return 商品详情信息 + */ + CommonPage getDetailList(ProductRequest request, PageParamRequest pageParamRequest); + + /** + * 获取商品详情 + * @param id 商品编号 + * @param type normal-正常,void-视频 + * @return 商品详情信息 + */ + ProductDetailResponse getDetail(Integer id, String type); + + /** + * 获取商品SKU详情 + * @param id 商品编号 + * @return 商品详情信息 + */ + ProductDetailResponse getSkuDetail(Integer id); + + /** + * 商品评论列表 + * @param proId 商品编号 + * @param type 评价等级|0=全部,1=好评,2=中评,3=差评 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getReplyList(Integer proId, Integer type, PageParamRequest pageParamRequest); + + /** + * 商品评论数量 + * @param id 商品id + * @return StoreProductReplayCountResponse + */ + StoreProductReplayCountResponse getReplyCount(Integer id); + + /** + * 获取热门推荐商品列表 + * @param pageRequest 分页参数 + * @return CommonPage + */ + CommonPage getHotProductList(PageParamRequest pageRequest); + + /** + * 商品详情评论 + * @param id 商品id + * @return ProductDetailReplyResponse + */ + ProductDetailReplyResponse getProductReply(Integer id); + + /** + * 优选商品推荐 + * @return CommonPage + */ + CommonPage getGoodProductList(); + + /** + * 商品列表(个别分类模型使用) + * @param request 列表请求参数 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + CommonPage getCategoryProductList(ProductListRequest request, PageParamRequest pageParamRequest); + + /** + * 获取商品排行榜 + * @return List + */ + List getLeaderboard(); + + /** + * 根据商品id集合 加载对应商品 + * @param proIdList id集合 + * @return id集合对应的商品列表 + */ + List getProductByIds(List proIdList); +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/UserCenterService.java b/fightwine-front/src/main/java/com/yzt/front/service/UserCenterService.java new file mode 100644 index 0000000..4455e86 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/UserCenterService.java @@ -0,0 +1,233 @@ +package com.yzt.front.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserExperienceRecord; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.TenantVo; + +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.List; + +/** + * 用户中心 服务类 + * fw_ + */ +public interface UserCenterService extends IService { + + /** + * 推广数据接口(昨天的佣金 累计提现金额 当前佣金) + * @return UserCommissionResponse + */ + UserCommissionResponse getCommission(); + + /** + * 推广佣金/提现总和 + * @param type 类型 佣金类型3=佣金,4=提现 + * @return BigDecimal + */ + BigDecimal getSpreadCountByType(Integer type); + + /** + * 提现申请 + * @param request 申请参数 + * @return Boolean + */ + Boolean extractCash(UserExtractRequest request); + + /** + * 获取提现银行列表 + * @return List + */ + List getExtractBank(); + + /** + * 会员等级列表 + */ + List getUserLevelList(); + + /** + * 获取推广人列表 + * @param request 查询参数 + * @param pageParamRequest 分页 + * @return List + */ + List getSpreadPeopleList(UserSpreadPeopleRequest request, PageParamRequest pageParamRequest); + + /** + * 获取推广人二级列表 + * @param request 查询参数 + * @param pageParamRequest 分页 + * @return List + */ + List getSecondSpreadPeopleList(UserSpreadPeopleRequest request, PageParamRequest pageParamRequest); + + /** + * 充值额度选择 + * @return UserRechargeResponse + */ + UserRechargeFrontResponse getRechargeConfig(); + + /** + * 用户资金统计 + * @return UserBalanceResponse + */ + UserBalanceResponse getUserBalance(); + + /** + * 推广订单 + * @param pageParamRequest 分页参数 + * @return UserSpreadOrderResponse + */ + UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest); + + /** + * 充值 + * @return UserSpreadOrderResponse; + */ + OrderPayResultResponse recharge(UserRechargeRequest request); + + /** + * 通过微信code登录 + */ + LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid); + + /** + * 小程序获取授权logo + * @return String + */ + String getLogo(); + + /** + * 微信登录小程序授权登录 + * @param code code + * @param request 用户参数 + * @return LoginResponse + */ + LoginResponse weChatAuthorizeProgramLogin(String code, RegisterThirdUserRequest request); + + /** + * 推广人排行榜 + * @param type String 时间范围(week-周,month-月) + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + List getTopSpreadPeopleListByDate(String type, PageParamRequest pageParamRequest); + + /** + * 佣金排行榜 + * @param type String 时间范围 + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + List getTopBrokerageListByDate(String type, PageParamRequest pageParamRequest); + + /** + * 海报背景图 + * @return List + */ + List getSpreadBannerList(); + + /** + * 当前用户在佣金排行第几名 + * @param type String 时间范围 + * @return 排名 + */ + Integer getNumberByTop(String type); + + /** + * 佣金转入余额 + * @param price 金额 + * @return Boolean + */ + Boolean transferIn(BigDecimal price); + + /** + * 提现记录 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getExtractRecord(PageParamRequest pageParamRequest); + + /** + * 推广佣金明细 + * @param pageParamRequest 分页参数 + */ + PageInfo getSpreadCommissionDetail(PageParamRequest pageParamRequest); + + /** + * 用户账单记录(现金) + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return CommonPage + */ + CommonPage nowMoneyBillRecord(String type, PageParamRequest pageRequest); + + /** + * 微信注册绑定手机号 + * @param request 请求参数 + * @return 登录信息 + */ + LoginResponse registerBindingPhone(WxBindingPhoneRequest request); + + /** + * 用户积分记录列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getUserIntegralRecordList(PageParamRequest pageParamRequest); + + /** + * 微信app登录 + * @param request 请求参数 + * @return 登录响应体 + */ + LoginResponse appLogin(RegisterAppWxRequest request); + + /** + * 获取用户积分信息 + * @return IntegralUserResponse + */ + IntegralUserResponse getIntegralUser(); + + /** + * 获取用户经验记录 + * @param pageParamRequest 分页参数 + * @return List + */ + List getUserExperienceList(PageParamRequest pageParamRequest); + + /** + * 提现用户信息 + * @return UserExtractCashResponse + */ + UserExtractCashResponse getExtractUser(); + + /** + * 推广人列表统计 + * @return UserSpreadPeopleResponse + */ + UserSpreadPeopleResponse getSpreadPeopleCount(); + + Boolean userRechargeApply( UserRechargeApplicationRequest request); + + /** + * 充值记录查询 + * @param status 申请状态 + */ + PageInfo getUserApplications(PageParamRequest pageParamRequest, Integer status); + + UserCommissionResponse getUserCommission(); + + TenantVo getTenantByUid(); + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/impl/CaptchaCacheServiceRedisImpl.java b/fightwine-front/src/main/java/com/yzt/front/service/impl/CaptchaCacheServiceRedisImpl.java new file mode 100644 index 0000000..d4bc9ae --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/impl/CaptchaCacheServiceRedisImpl.java @@ -0,0 +1,52 @@ +package com.yzt.front.service.impl; + +import com.anji.captcha.service.CaptchaCacheService; +import com.yzt.common.utils.RedisUtil; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis,参考service/spring-boot代码示例。 + * 如果应用是单点的,也没有使用redis,那默认使用内存。 + * 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。 + * + * ☆☆☆ SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。 + */ +public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService { + + @Resource + private RedisUtil redisUtil; + + + @Override + public String type() { + return "redis"; + } + + + @Override + public void set(String key, String value, long expiresInSeconds) { + redisUtil.getRedisTemplate().opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS); + } + + @Override + public boolean exists(String key) { + return Boolean.TRUE.equals(redisUtil.getRedisTemplate().hasKey(key)); + } + + @Override + public void delete(String key) { + redisUtil.getRedisTemplate().delete(key); + } + + @Override + public String get(String key) { + return (String) redisUtil.getRedisTemplate().opsForValue().get(key); + } + + @Override + public Long increment(String key, long val) { + return redisUtil.getRedisTemplate().opsForValue().increment(key,val); + } +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/impl/IndexServiceImpl.java b/fightwine-front/src/main/java/com/yzt/front/service/impl/IndexServiceImpl.java new file mode 100644 index 0000000..9679ac1 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/impl/IndexServiceImpl.java @@ -0,0 +1,278 @@ +package com.yzt.front.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.constants.SysGroupDataConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CopyrightConfigInfoResponse; +import com.yzt.common.response.IndexInfoResponse; +import com.yzt.common.response.IndexProductResponse; +import com.yzt.common.response.ProductActivityItemResponse; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.front.service.IndexService; +import com.yzt.service.delete.ProductUtils; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** +* IndexServiceImpl 接口实现 +* fw_ +*/ +@Service +public class IndexServiceImpl implements IndexService { + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private ProductUtils productUtils; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + @Autowired + private ActivityStyleService activityStyleService; + + /** + * 首页数据 + * banner、金刚区、广告位 + */ + @Override + public IndexInfoResponse getIndexInfo() { + IndexInfoResponse indexInfoResponse = new IndexInfoResponse(); + indexInfoResponse.setBanner(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_BANNER)); //首页banner滚动图 + indexInfoResponse.setMenus(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_MENU)); //导航模块 + indexInfoResponse.setRoll(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER)); //首页滚动新闻 + + indexInfoResponse.setLogoUrl(systemConfigService.getValueByKey(Constants.CONFIG_KEY_SITE_LOGO));// 企业logo地址 + indexInfoResponse.setYzfUrl(systemConfigService.getValueByKey(Constants.CONFIG_KEY_YZF_H5_URL));// 云智服H5 url + indexInfoResponse.setConsumerHotline(systemConfigService.getValueByKey(Constants.CONFIG_KEY_CONSUMER_HOTLINE));// 客服电话 + indexInfoResponse.setTelephoneServiceSwitch(systemConfigService.getValueByKey(Constants.CONFIG_KEY_TELEPHONE_SERVICE_SWITCH));// 客服电话服务 + indexInfoResponse.setWxChatIndependent(systemConfigService.getValueByKey(Constants.CONFIG_KEY_WX_CHAT_INDEPENDENT)); + indexInfoResponse.setCategoryPageConfig(systemConfigService.getValueByKey(Constants.CONFIG_CATEGORY_CONFIG));// 商品分类页配置 + indexInfoResponse.setIsShowCategory(systemConfigService.getValueByKey(Constants.CONFIG_IS_SHOW_CATEGORY));// 是否隐藏一级分类 + indexInfoResponse.setExplosiveMoney(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_EX_BANNER));//首页超值爆款 + indexInfoResponse.setHomePageSaleListStyle(systemConfigService.getValueByKey(Constants.CONFIG_IS_PRODUCT_LIST_STYLE));// 首页商品列表模板配置 + indexInfoResponse.setSubscribe(false); + User user = userService.getInfo(); + if(ObjectUtil.isNotNull(user) && user.getSubscribe()) { + indexInfoResponse.setSubscribe(user.getSubscribe()); + } + + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(1); + userVisitRecordService.save(visitRecord); + return indexInfoResponse; + } + + /** + * 首页数据 + * banner + */ + public IndexInfoResponse getHomePage() { + IndexInfoResponse indexInfoResponse = new IndexInfoResponse(); + indexInfoResponse.setBanner(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_BANNER)); //首页banner滚动图 + indexInfoResponse.setRoll(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER)); //首页滚动新闻 + indexInfoResponse.setMenus(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_MENU)); //导航模块 +// indexInfoResponse.setIsShowCategory(systemConfigService.getValueByKey(Constants.CONFIG_IS_SHOW_CATEGORY));// 是否隐藏一级分类 +// indexInfoResponse.setExplosiveMoney(systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_INDEX_EX_BANNER));//首页超值爆款 + indexInfoResponse.setHomePageSaleListStyle(systemConfigService.getValueByKey(Constants.CONFIG_IS_PRODUCT_LIST_STYLE));// 首页商品列表模板配置 + indexInfoResponse.setSubscribe(false); + + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(1); + userVisitRecordService.save(visitRecord); + return indexInfoResponse; + } + + /** + * 热门搜索 + * @return List> + */ + @Override + public List> hotKeywords() { + return systemGroupDataService.getListMapByGid(SysGroupDataConstants.GROUP_DATA_ID_INDEX_KEYWORDS); + } + + /** + * 微信分享配置 + * @return Object + */ + @Override + public HashMap getShareConfig() { + HashMap map = new HashMap<>(); + HashMap info = systemConfigService.info(Constants.CONFIG_FORM_ID_PUBLIC); + if(info == null) { + throw new YztException("请配置公众号分享信息!"); + } + map.put("img", info.get(SysConfigConstants.CONFIG_KEY_ADMIN_WECHAT_SHARE_IMAGE)); + map.put("title", info.get(SysConfigConstants.CONFIG_KEY_ADMIN_WECHAT_SHARE_TITLE)); + map.put("synopsis", info.get(SysConfigConstants.CONFIG_KEY_ADMIN_WECHAT_SHARE_SYNOSIS)); + return map; + } + + /** + * 获取首页商品列表 + * @param type 类型 【1 精品推荐 2 热门榜单 3首发新品 4促销单品】 + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public CommonPage findIndexProductList(Integer type, PageParamRequest pageParamRequest) { + if (type < Constants.INDEX_RECOMMEND_BANNER || type > Constants.INDEX_BENEFIT_BANNER) { + return CommonPage.restPage(new ArrayList<>()); + } + List storeProductList = storeProductService.getIndexProduct(type, pageParamRequest); + if(CollUtil.isEmpty(storeProductList)) { + return CommonPage.restPage(new ArrayList<>()); + } + + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + storeProductList = activityStyleService.makeActivityBorderStyle(storeProductList); + + CommonPage storeProductCommonPage = CommonPage.restPage(storeProductList); + + List productResponseArrayList = new ArrayList<>(); + for (StoreProduct storeProduct : storeProductList) { + IndexProductResponse productResponse = new IndexProductResponse(); + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + // 活动类型默认:直接跳过 + if (activityList.get(0).equals(Constants.PRODUCT_TYPE_NORMAL)) { + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + continue; + } + // 根据参与活动添加对应商品活动标示 + HashMap activityByProduct = + productUtils.getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (CollUtil.isNotEmpty(activityByProduct)) { + for (Integer activity : activityList) { + if (activity.equals(Constants.PRODUCT_TYPE_NORMAL)) { + break; + } + if (activity.equals(Constants.PRODUCT_TYPE_SECKILL)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_BARGAIN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_PINGTUAN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + } + } + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + } + + CommonPage productResponseCommonPage = CommonPage.restPage(productResponseArrayList); + BeanUtils.copyProperties(storeProductCommonPage, productResponseCommonPage, "list"); + return productResponseCommonPage; + } + + /** + * 获取颜色配置 + * @return SystemConfig + */ + @Override + public SystemConfig getColorConfig() { + return systemConfigService.getChangeColor(); + } + + /** + * 获取版本信息 + * @return MyRecord + */ + @Override + public MyRecord getVersion() { + MyRecord record = new MyRecord(); + // app版本号 + record.set("appVersion", systemConfigService.getValueByKey(Constants.CONFIG_APP_VERSION)); + record.set("androidAddress", systemConfigService.getValueByKey(Constants.CONFIG_APP_ANDROID_ADDRESS)); + record.set("iosAddress", systemConfigService.getValueByKey(Constants.CONFIG_APP_IOS_ADDRESS)); + record.set("openUpgrade", systemConfigService.getValueByKey(Constants.CONFIG_APP_OPEN_UPGRADE)); + return record; + } + + /** + * 获取全局本地图片域名 + * @return String + */ + @Override + public String getImageDomain() { + String localUploadUrl = systemConfigService.getValueByKey("localUploadUrl"); + return StrUtil.isBlank(localUploadUrl) ? "" : localUploadUrl; + } + + /** + * 获取公司版权图片 + */ + @Override + public CopyrightConfigInfoResponse getCopyrightInfo() { + String copyrightCompanyImage = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_COPYRIGHT_COMPANY_IMAGE); + String copyrightCompanyName = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_COPYRIGHT_COMPANY_INFO); + CopyrightConfigInfoResponse response = new CopyrightConfigInfoResponse(); + response.setCompanyName(copyrightCompanyName); + response.setCompanyImage(copyrightCompanyImage); + return response; + } + + /** + * 获取底部导航信息 + */ + @Override + public PageLayoutBottomNavigationResponse getBottomNavigationInfo() { + String isCustom = systemConfigService.getValueByKey(Constants.CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM); + List> bnList = systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION); + PageLayoutBottomNavigationResponse response = new PageLayoutBottomNavigationResponse(); + response.setIsCustom(isCustom); + response.setBottomNavigationList(bnList); + return response; + } +} + diff --git a/fightwine-front/src/main/java/com/yzt/front/service/impl/LoginServiceImpl.java b/fightwine-front/src/main/java/com/yzt/front/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..4bf15f8 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/impl/LoginServiceImpl.java @@ -0,0 +1,308 @@ +package com.yzt.front.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SmsConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.request.LoginMobileRequest; +import com.yzt.common.request.LoginRequest; +import com.yzt.common.request.RegisterRequest; +import com.yzt.common.response.LoginConfigResponse; +import com.yzt.common.response.LoginResponse; +import com.yzt.common.token.FrontTokenComponent; +import com.yzt.common.utils.SCRMUtils; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.front.service.LoginService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.TenantService; +import com.yzt.service.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.Objects; +import java.util.Optional; + +/** + * 移动端登录服务类 + * + */ +@Service +public class LoginServiceImpl implements LoginService { + + private static final Logger logger = LoggerFactory.getLogger(LoginServiceImpl.class); + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private FrontTokenComponent tokenComponent; + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private TenantService tenantService; + + @Autowired + private SCRMUtils scrmUtils; + /** + * 账号密码登录 + * + * @return LoginResponse + */ + @Override + public LoginResponse login(LoginRequest loginRequest) { + User user = userService.getByPhone(loginRequest.getPhone()); + if (ObjectUtil.isNull(user)) { + throw new YztException("此账号未注册"); + } + if (!user.getStatus()) { + throw new YztException("此账号被禁用"); + } + + // 校验密码 + String password = YztUtil.encryptPassword(loginRequest.getPassword(), loginRequest.getPhone()); + if (!user.getPwd().equals(password)) { + throw new YztException("密码错误"); + } + + LoginResponse loginResponse = new LoginResponse(); + String token = tokenComponent.createToken(user); + loginResponse.setToken(token); + + //绑定推广关系 +// if (loginRequest.getSpreadPid() > 0) { +// bindSpread(user, loginRequest.getSpreadPid()); +// } + + // 记录最后一次登录时间 + user.setLastLoginTime(YztDateUtil.nowDateTime()); + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + + loginResponse.setUid(user.getUid()); + loginResponse.setNikeName(user.getNickname()); + loginResponse.setPhone(user.getPhone()); + loginResponse.setTenantId(user.getTenantId()); + loginResponse.setTenantName(tenantService.getInfo(user.getTenantId()).getTenantName()); + return loginResponse; + } + + /** + * 刷新token + * + * @return LoginResponse + */ + @Override + public void refreshToken(HttpServletRequest request) { + tokenComponent.verifyToken(tokenComponent.getLoginUser(request)); + } + + /** + * 手机号验证码登录 + * + * @param loginRequest 登录请求信息 + * @return LoginResponse + */ + @Override + public LoginResponse phoneLogin(LoginMobileRequest loginRequest) { + //检测验证码 + checkValidateCode(loginRequest.getPhone(), loginRequest.getCaptcha()); + Integer spreadPid = Optional.ofNullable(loginRequest.getSpreadPid()).orElse(0); + //查询手机号信息 + User user = userService.getByPhone(loginRequest.getPhone()); + if (ObjectUtil.isNull(user)) {// 此用户不存在,走新用户注册流程 + user = userService.registerPhone(loginRequest.getPhone(), spreadPid); + } else { + if (!user.getStatus()) { + throw new YztException("当前账户已禁用,请联系管理员!"); + } + if (user.getSpreadUid().equals(0) && spreadPid > 0) { + // 绑定推广关系 + bindSpread(user, spreadPid); + } + // 记录最后一次登录时间 + user.setLastLoginTime(YztDateUtil.nowDateTime()); + user.setUpdateTime(DateUtil.date()); + boolean b = userService.updateById(user); + if (!b) { + logger.error("用户登录时,记录最后一次登录时间出错,uid = " + user.getUid()); + } + } + + //生成token + LoginResponse loginResponse = new LoginResponse(); + String token = tokenComponent.createToken(user); + loginResponse.setToken(token); + loginResponse.setUid(user.getUid()); + loginResponse.setNikeName(user.getNickname()); + loginResponse.setPhone(user.getPhone()); + return loginResponse; + } + + /** + * 检测手机验证码 + * + * @param phone 手机号 + * @param code 验证码 + */ + private void checkValidateCode(String phone, String code) { + Object validateCode = redisUtil.get(SmsConstants.SMS_VALIDATE_PHONE + phone); + if (ObjectUtil.isNull(validateCode)) { + throw new YztException("验证码已过期"); + } + if (!validateCode.toString().equals(code)) { + throw new YztException("验证码错误"); + } + //删除验证码 + redisUtil.delete(SmsConstants.SMS_VALIDATE_PHONE + phone); + } + + /** + * 绑定分销关系 + * + * @param user User 用户user类 + * @param spreadUid Integer 推广人id + * @return Boolean + * 1.判断分销功能是否启用 + * 2.判断分销模式 + * 3.根据不同的分销模式校验 + * 4.指定分销,只有分销员才可以分销,需要spreadUid是推广员才可以绑定 + * 5.满额分销,同上 + * 6.人人分销,可以直接绑定 + */ + @Override + public Boolean bindSpread(User user, Integer spreadUid) { + Boolean checkBingSpread = userService.checkBingSpread(user, spreadUid, "old"); + if (!checkBingSpread) return false; + + user.setSpreadUid(spreadUid); + user.setSpreadTime(YztDateUtil.nowDateTime()); + user.setUpdateTime(DateUtil.date()); + + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + userService.updateSpreadCountByUid(spreadUid, "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("绑定推广人时出错,userUid = {}, spreadUid = {}", user.getUid(), spreadUid)); + } + return execute; + } + + /** + * 推出登录 + * + * @param request HttpServletRequest + */ + @Override + public void loginOut(HttpServletRequest request) { + tokenComponent.logout(request); + } + + /** + * 校验token是否有效 + * + * @return true 有效, false 无效 + */ + @Override + public Boolean tokenIsExist() { + Integer userId = userService.getUserId(); + return userId > 0; + } + + /** + * 获取登录配置 + */ + @Override + public LoginConfigResponse getLoginConfig() { + String routinePhoneVerification = systemConfigService.getValueByKey(Constants.WECHAT_ROUTINE_PHONE_VERIFICATION); + String publicLoginType = systemConfigService.getValueByKey(Constants.WECHAT_PUBLIC_LOGIN_TYPE); + String mobileLoginLogo = systemConfigService.getValueByKey(Constants.CONFIG_KEY_MOBILE_LOGIN_LOGO); + String siteName = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SITE_NAME); + LoginConfigResponse response = new LoginConfigResponse(); + response.setPublicLoginType(publicLoginType); + response.setRoutinePhoneVerification(routinePhoneVerification); + response.setMobileLoginLogo(mobileLoginLogo); + response.setSiteName(siteName); + return response; + } + + /** + * 注册 + * @param request + */ + @Override + public Boolean register(RegisterRequest request) { + // 1. 校验短信验证码 + checkValidateCode(request.getPhone(),request.getValidateCode()); + // 2. 检查用户名/手机号是否已存在 + if (null != userService.getByPhone(request.getPhone())) { + throw new YztException("此手机号码已被注册"); + } + // 3. 创建用户 + User user = new User(); + user.setNickname(request.getName()); // 姓名 + user.setRealName(request.getName()); + + user.setPhone(request.getPhone()); + user.setAccount(request.getPhone()); + user.setPwd(YztUtil.encryptPassword(request.getPassword(), request.getPhone())); // 登录密码 + user.setTradePassword(YztUtil.encryptPassword(request.getTradePassword(), request.getPhone())); // 交易密码 + user.setSpreadUid(request.getSpreadUid()); // 推广人ID +// user.setTenantId(request.getTenantId()); // 公司ID + user.setTenantId(userService.getInfoByUid(user.getSpreadUid()).getTenantId()); // 公司ID + Date nowDate = YztDateUtil.nowDateTime(); + user.setCreateTime(nowDate); + user.setLastLoginTime(nowDate); + user.setUserType(Constants.USER_LOGIN_TYPE_H5); + user.setAvatar(systemConfigService.getValueByKey(Constants.USER_DEFAULT_AVATAR_CONFIG_KEY)); + user.setOrgName(request.getOrgName()); + user.setLevel(1); + + + // 推广人 + if(ObjectUtil.isNull(request.getSpreadUid())){ + throw new YztException("推广人不能为空!"); + } + Boolean check = userService.checkBingSpread(user, request.getSpreadUid(), "new"); + if (check) { + user.setSpreadUid(request.getSpreadUid()); + user.setSpreadTime(nowDate); + } +// save(user); + Boolean execute = transactionTemplate.execute(e -> { + userService.save(user); + // 推广人处理 + if (check) { + userService.updateSpreadCountByUid(request.getSpreadUid(), "add"); + } + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("创建用户失败!"); + } + + // 4. 删除已使用的验证码 + redisUtil.delete(SmsConstants.SMS_VALIDATE_PHONE_NUM + request.getPhone()); + + return true; + } + +} diff --git a/fightwine-front/src/main/java/com/yzt/front/service/impl/ProductServiceImpl.java b/fightwine-front/src/main/java/com/yzt/front/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..8ec8240 --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/impl/ProductServiceImpl.java @@ -0,0 +1,618 @@ +package com.yzt.front.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.*; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ProductListRequest; +import com.yzt.common.request.ProductRequest; +import com.yzt.common.response.*; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.CategoryTreeVo; +import com.yzt.common.vo.MyRecord; +import com.yzt.front.service.ProductService; +import com.yzt.service.delete.ProductUtils; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** +* IndexServiceImpl 接口实现 +* fw_ +*/ +@Service +public class ProductServiceImpl implements ProductService { + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private StoreProductReplyService storeProductReplyService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductRelationService storeProductRelationService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private ProductUtils productUtils; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private StoreProductAttrService attrService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Autowired + private StoreCartService cartService; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + @Autowired + private ActivityStyleService activityStyleService; + + /** + * 获取分类 + * @return List + */ + @Override + public List getCategory() { + List listTree = categoryService.getListTree(CategoryConstants.CATEGORY_TYPE_PRODUCT, 1, ""); + for (int i = 0; i < listTree.size();) { + CategoryTreeVo categoryTreeVo = listTree.get(i); + if (!categoryTreeVo.getPid().equals(0)) { + listTree.remove(i); + continue; + } + i++; + } + return listTree; + } + + /** + * 商品列表 + * @return CommonPage + */ + @Override + public CommonPage getList(ProductRequest request, PageParamRequest pageRequest) { + List storeProductList = storeProductService.findH5List(request, pageRequest); + if (CollUtil.isEmpty(storeProductList)) { + return CommonPage.restPage(new ArrayList<>()); + } + CommonPage storeProductCommonPage = CommonPage.restPage(storeProductList); + + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + storeProductList = activityStyleService.makeActivityBorderStyle(storeProductList); + + List productResponseArrayList = new ArrayList<>(); + for (StoreProduct storeProduct : storeProductList) { + IndexProductResponse productResponse = new IndexProductResponse(); + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + // 活动类型默认:直接跳过 + if (activityList.get(0).equals(Constants.PRODUCT_TYPE_NORMAL)) { + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + continue; + } + // 根据参与活动添加对应商品活动标示 + HashMap activityByProduct = + productUtils.getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (CollUtil.isNotEmpty(activityByProduct)) { + for (Integer activity : activityList) { + if (activity.equals(Constants.PRODUCT_TYPE_NORMAL)) { + break; + } + if (activity.equals(Constants.PRODUCT_TYPE_SECKILL)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_BARGAIN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_PINGTUAN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + } + } + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + } + CommonPage productResponseCommonPage = CommonPage.restPage(productResponseArrayList); + BeanUtils.copyProperties(storeProductCommonPage, productResponseCommonPage, "list"); + return productResponseCommonPage; + } + + @Override + public CommonPage getDetailList(ProductRequest request, PageParamRequest pageParamRequest) { + List storeProductList = storeProductService.findH5List(request, pageParamRequest); + List productIds = storeProductList.stream().map(StoreProduct::getId).collect(Collectors.toList()); + List productDetailResponseArrayList = productIds.stream() + .map(id -> getDetail(id, "normal")) + .filter(Objects::nonNull) // 可选:过滤掉可能返回 null 的详情 + .collect(Collectors.toList()); + return CommonPage.restPage(productDetailResponseArrayList); + } + + /** + * 获取商品详情 + * @param id 商品编号 + * @param type normal-正常,video-视频 + * @return 商品详情信息 + */ + @Override + public ProductDetailResponse getDetail(Integer id, String type) { + // 获取用户 + User user = userService.getInfo(); + SystemUserLevel userLevel = null; + if (ObjectUtil.isNotNull(user) && user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + + ProductDetailResponse productDetailResponse = new ProductDetailResponse(); + // 查询商品 + StoreProduct storeProduct = storeProductService.getH5Detail(id); + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + storeProduct.setActivityStyle(activityStyleService.makeActivityBackgroundStyle(storeProduct)); + + if (ObjectUtil.isNotNull(userLevel)) { + BigDecimal vipPrice = storeProduct.getPrice().multiply(new BigDecimal(userLevel.getDiscount())).divide(new BigDecimal(100), 2 ,BigDecimal.ROUND_HALF_UP); + storeProduct.setVipPrice(vipPrice); + } + productDetailResponse.setProductInfo(storeProduct); + + // 获取商品规格 + List attrList = attrService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + // 根据制式设置attr属性 + productDetailResponse.setProductAttr(attrList); + + // 根据制式设置sku属性 + HashMap skuMap = CollUtil.newHashMap(); + List storeProductAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + for (StoreProductAttrValue storeProductAttrValue : storeProductAttrValues) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + BeanUtils.copyProperties(storeProductAttrValue, atr); + // 设置会员价 + if (ObjectUtil.isNotNull(userLevel)) { + BigDecimal vipPrice = atr.getPrice().multiply(new BigDecimal(userLevel.getDiscount())).divide(new BigDecimal(100), 2 ,BigDecimal.ROUND_HALF_UP); + atr.setVipPrice(vipPrice); + } + skuMap.put(atr.getSuk(), atr); + } + productDetailResponse.setProductValue(skuMap); + + List skuList = CollUtil.newArrayList(skuMap.values()); + productDetailResponse.setProductValueList(skuList); + + // 用户收藏、分销返佣 + if (ObjectUtil.isNotNull(user)) { + // 查询用户是否收藏收藏 + user = userService.getInfo(); + productDetailResponse.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(), id,false).size() > 0); + // 判断是否开启分销 + String brokerageFuncStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_BROKERAGE_FUNC_STATUS); + if (brokerageFuncStatus.equals(Constants.COMMON_SWITCH_OPEN)) {// 分销开启 + // 判断是否开启气泡 + String isBubble = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_BROKERAGE_IS_BUBBLE); + if (isBubble.equals(Constants.COMMON_SWITCH_OPEN)) { + productDetailResponse.setPriceName(getPacketPriceRange(storeProduct.getIsSub(), storeProductAttrValues, user.getIsPromoter())); + } + } + } else { + productDetailResponse.setUserCollect(false); + } + // 商品活动 + List activityAllH5 = productUtils.getProductAllActivity(storeProduct); + productDetailResponse.setActivityAllH5(activityAllH5); + + // 商品浏览量+1 + StoreProduct updateProduct = new StoreProduct(); + updateProduct.setId(id); + updateProduct.setBrowse(storeProduct.getBrowse() + 1); + storeProductService.updateById(updateProduct); + + // 商品浏览量统计(每日/商城) + String yesterdayStr = DateUtil.date().toString(Constants.DATE_FORMAT_DATE); + redisUtil.incrAndCreate(RedisConstants.PRO_PAGE_VIEW_KEY + yesterdayStr); + // 商品浏览量统计(每日/个体) + redisUtil.incrAndCreate(StrUtil.format(RedisConstants.PRO_PRO_PAGE_VIEW_KEY, yesterdayStr, id)); + // 保存用户访问记录 + if (userService.getUserId() > 0) { + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(2); + userVisitRecordService.save(visitRecord); + } + + return productDetailResponse; + } + + /** + * 获取商品SKU详情 + * @param id 商品编号 + * @return 商品详情信息 + */ + @Override + public ProductDetailResponse getSkuDetail(Integer id) { + // 获取用户 + User user = userService.getInfo(); + SystemUserLevel userLevel = null; + if (ObjectUtil.isNotNull(user) && user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + + ProductDetailResponse productDetailResponse = new ProductDetailResponse(); + // 查询商品 + StoreProduct storeProduct = storeProductService.getH5Detail(id); + + // 获取商品规格 + List attrList = attrService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + // 根据制式设置attr属性 + productDetailResponse.setProductAttr(attrList); + + // 根据制式设置sku属性 + HashMap skuMap = CollUtil.newHashMap(); + List storeProductAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + for (StoreProductAttrValue storeProductAttrValue : storeProductAttrValues) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + BeanUtils.copyProperties(storeProductAttrValue, atr); + // 设置会员价 + if (ObjectUtil.isNotNull(userLevel)) { + BigDecimal vipPrice = atr.getPrice().multiply(new BigDecimal(userLevel.getDiscount())).divide(new BigDecimal(100), 2 ,BigDecimal.ROUND_HALF_UP); + atr.setVipPrice(vipPrice); + } + skuMap.put(atr.getSuk(), atr); + } + productDetailResponse.setProductValue(skuMap); + + return productDetailResponse; + } + + /** + * 商品评论列表 + * @param proId 商品编号 + * @param type 评价等级|0=全部,1=好评,2=中评,3=差评 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getReplyList(Integer proId, Integer type, PageParamRequest pageParamRequest) { + return storeProductReplyService.getH5List(proId, type, pageParamRequest); + } + + /** + * 产品评价数量和好评度 + * @return StoreProductReplayCountResponse + */ + @Override + public StoreProductReplayCountResponse getReplyCount(Integer id) { + MyRecord myRecord = storeProductReplyService.getH5Count(id); + Long sumCount = myRecord.getLong("sumCount"); + Long goodCount = myRecord.getLong("goodCount"); + Long inCount = myRecord.getLong("mediumCount"); + Long poorCount = myRecord.getLong("poorCount"); + String replyChance = myRecord.getStr("replyChance"); + Integer replyStar = myRecord.getInt("replyStar"); + return new StoreProductReplayCountResponse(sumCount, goodCount, inCount, poorCount, replyChance, replyStar); + } + + /** + * 获取商品佣金区间 + * @param isSub 是否单独计算分佣 + * @param attrValueList 商品属性列表 + * @param isPromoter 是否推荐人 + * @return String 金额区间 + */ + private String getPacketPriceRange(Boolean isSub, List attrValueList, Boolean isPromoter) { + String priceName = "0"; + if (!isPromoter) return priceName; + // 获取一级返佣比例 + String brokerageRatioString = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_BROKERAGE_RATIO); + BigDecimal BrokerRatio = new BigDecimal(brokerageRatioString).divide(new BigDecimal("100"), 2, RoundingMode.DOWN); + BigDecimal maxPrice; + BigDecimal minPrice; + // 获取佣金比例区间 + if (isSub) { // 是否单独分拥 + maxPrice = attrValueList.stream().map(StoreProductAttrValue::getBrokerage).reduce(BigDecimal.ZERO,BigDecimal::max); + minPrice = attrValueList.stream().map(StoreProductAttrValue::getBrokerage).reduce(BigDecimal.ZERO,BigDecimal::min); + } else { + BigDecimal _maxPrice = attrValueList.stream().map(StoreProductAttrValue::getPrice).reduce(BigDecimal.ZERO,BigDecimal::max); + BigDecimal _minPrice = attrValueList.stream().map(StoreProductAttrValue::getPrice).reduce(BigDecimal.ZERO,BigDecimal::min); + maxPrice = BrokerRatio.multiply(_maxPrice).setScale(2, RoundingMode.HALF_UP); + minPrice = BrokerRatio.multiply(_minPrice).setScale(2, RoundingMode.HALF_UP); + } + if (minPrice.compareTo(BigDecimal.ZERO) == 0 && maxPrice.compareTo(BigDecimal.ZERO) == 0) { + priceName = "0"; + } else if (minPrice.compareTo(BigDecimal.ZERO) == 0 && maxPrice.compareTo(BigDecimal.ZERO) > 0) { + priceName = maxPrice.toString(); + } else if (minPrice.compareTo(BigDecimal.ZERO) > 0 && maxPrice.compareTo(BigDecimal.ZERO) > 0) { + priceName = minPrice.toString(); + } else if (minPrice.compareTo(maxPrice) == 0) { + priceName = minPrice.toString(); + } else { + priceName = minPrice.toString() + "~" + maxPrice.toString(); + } + return priceName; + } + + /** + * 获取热门推荐商品列表 + * @param pageRequest 分页参数 + * @return CommonPage + */ + @Override + public CommonPage getHotProductList(PageParamRequest pageRequest) { + List storeProductList = storeProductService.getIndexProduct(Constants.INDEX_HOT_BANNER, pageRequest); + if (CollUtil.isEmpty(storeProductList)) { + return CommonPage.restPage(new ArrayList<>()); + } + + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + storeProductList = activityStyleService.makeActivityBorderStyle(storeProductList); + + CommonPage storeProductCommonPage = CommonPage.restPage(storeProductList); + + List productResponseArrayList = new ArrayList<>(); + for (StoreProduct storeProduct : storeProductList) { + IndexProductResponse productResponse = new IndexProductResponse(); + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + // 活动类型默认:直接跳过 + if (activityList.get(0).equals(Constants.PRODUCT_TYPE_NORMAL)) { + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + continue; + } + // 根据参与活动添加对应商品活动标示 + HashMap activityByProduct = + productUtils.getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (CollUtil.isNotEmpty(activityByProduct)) { + for (Integer activity : activityList) { + if (activity.equals(Constants.PRODUCT_TYPE_NORMAL)) { + break; + } + if (activity.equals(Constants.PRODUCT_TYPE_SECKILL)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_BARGAIN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_PINGTUAN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + } + } + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + } + CommonPage productResponseCommonPage = CommonPage.restPage(productResponseArrayList); + BeanUtils.copyProperties(storeProductCommonPage, productResponseCommonPage, "list"); + return productResponseCommonPage; + } + + /** + * 商品详情评论 + * @param id 商品id + * @return ProductDetailReplyResponse + * 评论只有一条,图文 + * 评价总数 + * 好评率 + */ + @Override + public ProductDetailReplyResponse getProductReply(Integer id) { + return storeProductReplyService.getH5ProductReply(id); + } + + /** + * 优选商品推荐 + * @return CommonPage + */ + @Override + public CommonPage getGoodProductList() { + PageParamRequest pageRequest = new PageParamRequest(); + pageRequest.setLimit(9); + List storeProductList = storeProductService.getIndexProduct(Constants.INDEX_RECOMMEND_BANNER, pageRequest); + if (CollUtil.isEmpty(storeProductList)) { + return CommonPage.restPage(new ArrayList<>()); + } + CommonPage storeProductCommonPage = CommonPage.restPage(storeProductList); + + List productResponseArrayList = new ArrayList<>(); + for (StoreProduct storeProduct : storeProductList) { + IndexProductResponse productResponse = new IndexProductResponse(); + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + // 活动类型默认:直接跳过 + if (activityList.get(0).equals(Constants.PRODUCT_TYPE_NORMAL)) { + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + continue; + } + // 根据参与活动添加对应商品活动标示 + HashMap activityByProduct = + productUtils.getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (CollUtil.isNotEmpty(activityByProduct)) { + for (Integer activity : activityList) { + if (activity.equals(Constants.PRODUCT_TYPE_NORMAL)) { + break; + } + if (activity.equals(Constants.PRODUCT_TYPE_SECKILL)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_BARGAIN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + if (activity.equals(Constants.PRODUCT_TYPE_PINGTUAN)) { + ProductActivityItemResponse itemResponse = activityByProduct.get(Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNotNull(itemResponse)) { + productResponse.setActivityH5(itemResponse); + break; + } + } + } + } + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + } + CommonPage productResponseCommonPage = CommonPage.restPage(productResponseArrayList); + BeanUtils.copyProperties(storeProductCommonPage, productResponseCommonPage, "list"); + return productResponseCommonPage; + } + + /** + * 商品列表(个别分类模型使用) + * @param request 列表请求参数 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + @Override + public CommonPage getCategoryProductList(ProductListRequest request, PageParamRequest pageParamRequest) { + ProductRequest searchRequest = new ProductRequest(); + BeanUtils.copyProperties(request ,searchRequest); + searchRequest.setCid(request.getCid() == null ? null : String.valueOf(request.getCid())); + List storeProductList = storeProductService.findH5List(searchRequest, pageParamRequest); + if (CollUtil.isEmpty(storeProductList)) { + return CommonPage.restPage(new ArrayList<>()); + } + CommonPage storeProductCommonPage = CommonPage.restPage(storeProductList); + + User user = userService.getInfo(); + List productResponseArrayList = new ArrayList<>(); + for (StoreProduct storeProduct : storeProductList) { + IndexProductResponse productResponse = new IndexProductResponse(); + // 获取商品购物车数量 + if (ObjectUtil.isNotNull(user)) { + productResponse.setCartNum(cartService.getProductNumByUidAndProductId(user.getUid(), storeProduct.getId())); + } + BeanUtils.copyProperties(storeProduct, productResponse); + productResponseArrayList.add(productResponse); + } + CommonPage productResponseCommonPage = CommonPage.restPage(productResponseArrayList); + BeanUtils.copyProperties(storeProductCommonPage, productResponseCommonPage, "list"); + return productResponseCommonPage; + } + + /** + * 获取商品排行榜 + * @return List + */ + @Override + public List getLeaderboard() { + return storeProductService.getLeaderboard(); + } + + + /** + * 根据商品id集合 加载对应商品 + * + * @param proIdList id集合 + * @return id集合对应的商品列表 + */ + @Override + public List getProductByIds(List proIdList) { + List byIdsAndLabel = storeProductService.findByIds(proIdList, "front"); + List productFrontResponses = byIdsAndLabel.stream().map(productItem -> { + IndexProductResponse response = new IndexProductResponse(); + BeanUtils.copyProperties(productItem, response); + return response; + }).collect(Collectors.toList()); + productFrontResponses.forEach(e -> { + // 评论总数 + Integer sumCount = storeProductReplyService.getCountByScore(e.getId(), ProductConstants.PRODUCT_REPLY_TYPE_ALL); + // 好评总数 + Integer goodCount = storeProductReplyService.getCountByScore(e.getId(), ProductConstants.PRODUCT_REPLY_TYPE_GOOD); + + + String replyChance = "0"; + if (sumCount > 0 && goodCount > 0) { + replyChance = String.format("%.2f", ((goodCount.doubleValue() / sumCount.doubleValue()))); + } + e.setReplyNum(sumCount); + e.setPositiveRatio(replyChance); + e.setSales(e.getSales() + e.getFicti()); + }); + + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + List products = new ArrayList<>(); + productFrontResponses.forEach(response -> { + StoreProduct product = new StoreProduct(); + BeanUtils.copyProperties(response, product); + products.add(product); + }); + List makeProductList = activityStyleService.makeActivityBorderStyle(products); + + makeProductList.forEach(p -> { + productFrontResponses.stream().map(resProduct -> { + if (p.getId().equals(resProduct.getId())) { + resProduct.setActivityStyle(p.getActivityStyle()); + } + return resProduct; + }).collect(Collectors.toList()); + }); + return productFrontResponses; + } +} + diff --git a/fightwine-front/src/main/java/com/yzt/front/service/impl/UserCenterServiceImpl.java b/fightwine-front/src/main/java/com/yzt/front/service/impl/UserCenterServiceImpl.java new file mode 100644 index 0000000..57bcc6f --- /dev/null +++ b/fightwine-front/src/main/java/com/yzt/front/service/impl/UserCenterServiceImpl.java @@ -0,0 +1,1234 @@ +package com.yzt.front.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.*; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.token.FrontTokenComponent; +import com.yzt.common.token.WeChatOauthToken; +import com.yzt.common.utils.*; +import com.yzt.common.vo.*; +import com.yzt.front.service.LoginService; +import com.yzt.front.service.UserCenterService; +import com.yzt.service.mapper.UserMapper; +import com.yzt.service.service.*; +import io.swagger.models.auth.In; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 用户中心 服务实现类 + * + */ +@Service +public class UserCenterServiceImpl extends ServiceImpl implements UserCenterService { + + private final Logger logger = LoggerFactory.getLogger(UserCenterServiceImpl.class); + + @Autowired + private UserService userService; + + @Autowired + private UserBillService userBillService; + + @Autowired + private UserExtractService userExtractService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private WeChatPayService weChatPayService; + + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private StoreCouponUserService storeCouponUserService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private LoginService loginService; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private WechatNewService wechatNewService; + + @Autowired + private UserExperienceRecordService experienceRecordService; + + @Autowired + private FrontTokenComponent tokenComponent; + + @Autowired + private UserRechargeApplicationService userRechargeApplicationService; + + @Autowired + private SCRMUtils scrmUtils; + + + @Autowired + private TenantService tenantService; + + /** + * 推广数据接口(昨天的佣金 累计提现金额 当前佣金) + */ + @Override + public UserCommissionResponse getCommission() { + User user = userService.getInfoException(); + // 昨天得佣金 + BigDecimal yesterdayIncomes = userBrokerageRecordService.getYesterdayIncomes(user.getUid()); + //累计已提取佣金 + BigDecimal totalMoney = userExtractService.getExtractTotalMoney(user.getUid()); + + UserCommissionResponse userCommissionResponse = new UserCommissionResponse(); + userCommissionResponse.setLastDayCount(yesterdayIncomes); + userCommissionResponse.setExtractCount(totalMoney); + userCommissionResponse.setCommissionCount(user.getBrokeragePrice()); + return userCommissionResponse; + } + + /** + * 总收益 + */ + @Override + public UserCommissionResponse getUserCommission() { + User user = userService.getInfoException(); + //总收益 + BigDecimal totalIncomes = userBrokerageRecordService.getCurrentUserTotalSpreadPrice(user.getUid()); + // 今天得佣金 + BigDecimal todayIncomes = userBrokerageRecordService.getTodayIncomes(user.getUid()); + // 待结算 + BigDecimal pendingIncomes = userBrokerageRecordService.getPendingIncomes(user.getUid()); + UserCommissionResponse userCommissionResponse = new UserCommissionResponse(); + userCommissionResponse.setTotalIncomes(totalIncomes); + userCommissionResponse.setTodayIncomes(todayIncomes); + userCommissionResponse.setPendingIncomes(pendingIncomes); + return userCommissionResponse; + } + + + public TenantVo getTenantByUid() { + User user = userService.getInfoException(); + return tenantService.getInfo(user.getTenantId()); + } + + /** + * 推广佣金/提现总和 + * + * @return BigDecimal + */ + @Override + public BigDecimal getSpreadCountByType(Integer type) { + //推广佣金/提现总和 + Integer userId = userService.getUserIdException(); + if (type == 3) { + BigDecimal count = userBillService.getSumBigDecimal(null, userId, Constants.USER_BILL_CATEGORY_MONEY, null, Constants.USER_BILL_TYPE_BROKERAGE); + BigDecimal withdraw = userBillService.getSumBigDecimal(1, userId, Constants.USER_BILL_CATEGORY_MONEY, null, Constants.USER_BILL_TYPE_BROKERAGE); //提现 + return count.subtract(withdraw); + } + + //累计提现 + if (type == 4) { + return userExtractService.getWithdrawn(null, null); + } + + return BigDecimal.ZERO; + } + + /** + * 提现申请 + * + * @return Boolean + */ + @Override + public Boolean extractCash(UserExtractRequest request) { + switch (request.getExtractType()) { + case "weixin": + if (StrUtil.isBlank(request.getWechat())) { + throw new YztException("请填写微信号!"); + } + request.setAlipayCode(null); + request.setBankCode(null); + request.setBankName(null); + break; + case "alipay": + if (StrUtil.isBlank(request.getAlipayCode())) { + throw new YztException("请填写支付宝账号!"); + } + request.setWechat(null); + request.setBankCode(null); + request.setBankName(null); + break; + case "bank": + if (StrUtil.isBlank(request.getBankName())) { + throw new YztException("请填写银行名称!"); + } + if (StrUtil.isBlank(request.getBankCode())) { + throw new YztException("请填写银行卡号!"); + } + request.setWechat(null); + request.setAlipayCode(null); + break; + default: + throw new YztException("请选择支付方式"); + } + return userExtractService.extractApply(request); + } + + /** + * 提现银行/提现最低金额 + * + * @return UserExtractCashResponse + */ + @Override + public List getExtractBank() { + // 获取提现银行 + String bank = systemConfigService.getValueByKeyException(Constants.CONFIG_BANK_LIST).replace("\r\n", "\n"); + List bankArr = new ArrayList<>(); + if (bank.indexOf("\n") > 0) { + bankArr.addAll(Arrays.asList(bank.split("\n"))); + } else { + bankArr.add(bank); + } + return bankArr; + } + + /** + * 会员等级列表 + * + * @return List + */ + @Override + public List getUserLevelList() { + return systemUserLevelService.getH5LevelList(); + } + + /** + * 推广用户, 我自己推广了哪些用户 + * + * @return List + */ + @Override + public List getSpreadPeopleList(UserSpreadPeopleRequest request, PageParamRequest pageParamRequest) { + //查询当前用户名下的一级推广员 + Integer userId = userService.getUserIdException(); + List userIdList = new ArrayList<>(); + userIdList.add(userId); + userIdList = userService.getSpreadPeopleIdList(userIdList); //我推广的一级用户id集合 + + if (CollUtil.isEmpty(userIdList)) {//如果没有一级推广人,直接返回 + return new ArrayList<>(); + } + if (request.getGrade().equals(1)) {// 二级推广人 + //查询二级推广人 + List secondSpreadIdList = userService.getSpreadPeopleIdList(userIdList); + if (CollUtil.isEmpty(secondSpreadIdList)) { + return new ArrayList<>(); + } + //二级推广人 + userIdList.clear(); + userIdList.addAll(secondSpreadIdList); + } + List spreadPeopleList = userService.getSpreadPeopleList(userIdList, request.getKeyword(), request.getSortKey(), request.getIsAsc(), pageParamRequest); + return spreadPeopleList; + } + + public List getSecondSpreadPeopleList(UserSpreadPeopleRequest request, PageParamRequest pageParamRequest) { + List userIdList = new ArrayList<>(); + userIdList.add(request.getUid()); + userIdList = userService.getSpreadPeopleIdList(userIdList); + if (CollUtil.isEmpty(userIdList)) {//如果没有一级推广人,直接返回 + return new ArrayList<>(); + } + return userService.getSpreadPeopleList(userIdList, request.getKeyword(), request.getSortKey(), request.getIsAsc(), pageParamRequest); + } + + + /** + * 充值额度选择 + * + * @return UserRechargeResponse + */ + @Override + public UserRechargeFrontResponse getRechargeConfig() { + UserRechargeFrontResponse userRechargeResponse = new UserRechargeFrontResponse(); + userRechargeResponse.setRechargeQuota(systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_RECHARGE_LIST, UserRechargeItemResponse.class)); + String rechargeAttention = systemConfigService.getValueByKey(Constants.CONFIG_RECHARGE_ATTENTION); + List rechargeAttentionList = new ArrayList<>(); + if (StrUtil.isNotBlank(rechargeAttention)) { + rechargeAttentionList = YztUtil.stringToArrayStrRegex(rechargeAttention, "\n"); + } + userRechargeResponse.setRechargeAttention(rechargeAttentionList); + return userRechargeResponse; + } + + /** + * 用户资金统计 + * + * @return UserBalanceResponse + */ + @Override + public UserBalanceResponse getUserBalance() { + User info = userService.getInfo(); + BigDecimal recharge = userBillService.getSumBigDecimal(1, info.getUid(), Constants.USER_BILL_CATEGORY_MONEY, null, null); + BigDecimal orderStatusSum = userBillService.getSumBigDecimal(0, info.getUid(), Constants.USER_BILL_CATEGORY_MONEY, null, null); + return new UserBalanceResponse(info.getNowMoney(), recharge, orderStatusSum); + } + + /** + * 推广订单 + * + * @return UserSpreadOrderResponse; + */ + @Override + public UserSpreadOrderResponse getSpreadOrder(PageParamRequest pageParamRequest) { + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户数据异常"); + } + UserSpreadOrderResponse spreadOrderResponse = new UserSpreadOrderResponse(); + // 获取累计推广条数 + Integer spreadCount = userBrokerageRecordService.getSpreadCountByUid(user.getUid()); + spreadOrderResponse.setCount(spreadCount.longValue()); + if (spreadCount.equals(0)) { + return spreadOrderResponse; + } + + // 获取推广订单记录,分页 + List recordList = userBrokerageRecordService.findSpreadListByUid(user.getUid(), pageParamRequest); + // 获取对应的订单信息 + List orderNoList = recordList.stream().map(UserBrokerageRecord::getLinkId).collect(Collectors.toList()); + Map orderMap = storeOrderService.getMapInOrderNo(orderNoList); + // 获取对应的用户信息 + List storeOrderList = new ArrayList<>(orderMap.values()); + List uidList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList()); + HashMap userMap = userService.getMapListInUid(uidList); + + List userSpreadOrderItemResponseList = new ArrayList<>(); + List monthList = CollUtil.newArrayList(); + recordList.forEach(record -> { + UserSpreadOrderItemChildResponse userSpreadOrderItemChildResponse = new UserSpreadOrderItemChildResponse(); + userSpreadOrderItemChildResponse.setOrderId(record.getLinkId()); + userSpreadOrderItemChildResponse.setTime(record.getUpdateTime()); + userSpreadOrderItemChildResponse.setNumber(record.getPrice()); + Integer orderUid = orderMap.get(record.getLinkId()).getUid(); + userSpreadOrderItemChildResponse.setAvatar(userMap.get(orderUid).getAvatar()); + userSpreadOrderItemChildResponse.setNickname(userMap.get(orderUid).getNickname()); + userSpreadOrderItemChildResponse.setType("返佣"); + + String month = YztDateUtil.dateToStr(record.getUpdateTime(), Constants.DATE_FORMAT_MONTH); + if (monthList.contains(month)) { + //如果在已有的数据中找到当前月份数据则追加 + for (UserSpreadOrderItemResponse userSpreadOrderItemResponse : userSpreadOrderItemResponseList) { + if (userSpreadOrderItemResponse.getTime().equals(month)) { + userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); + break; + } + } + } else {// 不包含此月份 + //创建一个 + UserSpreadOrderItemResponse userSpreadOrderItemResponse = new UserSpreadOrderItemResponse(); + userSpreadOrderItemResponse.setTime(month); + userSpreadOrderItemResponse.getChild().add(userSpreadOrderItemChildResponse); + userSpreadOrderItemResponseList.add(userSpreadOrderItemResponse); + monthList.add(month); + } + }); + + // 获取月份总订单数 + Map countMap = userBrokerageRecordService.getSpreadCountByUidAndMonth(user.getUid(), monthList); + for (UserSpreadOrderItemResponse userSpreadOrderItemResponse : userSpreadOrderItemResponseList) { + userSpreadOrderItemResponse.setCount(countMap.get(userSpreadOrderItemResponse.getTime())); + } + + spreadOrderResponse.setList(userSpreadOrderItemResponseList); + return spreadOrderResponse; + } + + /** + * 充值 + * + * @return UserSpreadOrderResponse; + */ + @Override + @Transactional(rollbackFor = {RuntimeException.class, Error.class, YztException.class}) + public OrderPayResultResponse recharge(UserRechargeRequest request) { + request.setPayType(Constants.PAY_TYPE_WE_CHAT); + + //验证金额是否为最低金额 + String rechargeMinAmountStr = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_RECHARGE_MIN_AMOUNT); + BigDecimal rechargeMinAmount = new BigDecimal(rechargeMinAmountStr); + int compareResult = rechargeMinAmount.compareTo(request.getPrice()); + if (compareResult > 0) { + throw new YztException("充值金额不能低于" + rechargeMinAmountStr); + } + + request.setGivePrice(BigDecimal.ZERO); + + if (request.getGroupDataId() > 0) { + SystemGroupDataRechargeConfigVo systemGroupData = systemGroupDataService.getNormalInfo(request.getGroupDataId(), SystemGroupDataRechargeConfigVo.class); + if (ObjectUtil.isNull(systemGroupData)) { + throw new YztException("您选择的充值方式已下架"); + } + //售价和赠送 + request.setPrice(systemGroupData.getPrice()); + request.setGivePrice(systemGroupData.getGiveMoney()); + } + User currentUser = userService.getInfoException(); + //生成系统订单 + UserRecharge userRecharge = new UserRecharge(); + userRecharge.setUid(currentUser.getUid()); + userRecharge.setOrderId(YztUtil.getOrderNo("recharge")); + userRecharge.setPrice(request.getPrice()); + userRecharge.setGivePrice(request.getGivePrice()); + userRecharge.setRechargeType(request.getFromType()); + + OrderPayResultResponse response = new OrderPayResultResponse(); + MyRecord record = new MyRecord(); + Map unifiedorder = weChatPayService.unifiedRecharge(userRecharge, request.getClientIp()); + record.set("status", true); + response.setStatus(true); + WxPayJsResultVo vo = new WxPayJsResultVo(); + vo.setAppId(unifiedorder.get("appId")); + vo.setNonceStr(unifiedorder.get("nonceStr")); + vo.setPackages(unifiedorder.get("package")); + vo.setSignType(unifiedorder.get("signType")); + vo.setTimeStamp(unifiedorder.get("timeStamp")); + vo.setPaySign(unifiedorder.get("paySign")); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) { + vo.setMwebUrl(unifiedorder.get("mweb_url")); + response.setPayType(PayConstants.PAY_CHANNEL_WE_CHAT_H5); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_IOS) || userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_ANDROID)) {// + vo.setPartnerid(unifiedorder.get("partnerid")); + } + response.setJsConfig(vo); + response.setOrderNo(userRecharge.getOrderId()); + + userRecharge.setOutTradeNo(unifiedorder.get("outTradeNo")); + boolean save = userRechargeService.save(userRecharge); + if (!save) { + throw new YztException("生成充值订单失败!"); + } + return response; + } + + /** + * 微信登录 + * + * @return LoginResponse; + */ + @Override + public LoginResponse weChatAuthorizeLogin(String code, Integer spreadUid) { + // 通过code获取获取公众号授权信息 + WeChatOauthToken oauthToken = wechatNewService.getOauth2AccessToken(code); + //检测是否存在 + UserToken userToken = userTokenService.getByOpenidAndType(oauthToken.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC); + LoginResponse loginResponse = new LoginResponse(); + if (ObjectUtil.isNotNull(userToken)) {// 已存在,正常登录 + User user = userService.getById(userToken.getUid()); + if (!user.getStatus()) { + throw new YztException("当前账户已禁用,请联系管理员!"); + } + + // 记录最后一次登录时间 + user.setLastLoginTime(YztDateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + // 分销绑定 + if (userService.checkBingSpread(user, spreadUid, "old")) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(YztDateUtil.nowDateTime()); + // 处理新旧推广人数据 + userService.updateSpreadCountByUid(spreadUid, "add"); + } + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("公众号登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), spreadUid)); + } + try { + String token = tokenComponent.createToken(user); + loginResponse.setToken(token); + } catch (Exception e) { + logger.error(StrUtil.format("公众号登录生成token失败,uid={}", user.getUid())); + e.printStackTrace(); + } + loginResponse.setType("login"); + loginResponse.setUid(user.getUid()); + loginResponse.setNikeName(user.getNickname()); + loginResponse.setPhone(user.getPhone()); + return loginResponse; + } + // 没有用户,走创建用户流程 + // 从微信获取用户信息,存入Redis中,将key返回给前端,前端在下一步绑定手机号的时候下发 + WeChatAuthorizeLoginUserInfoVo userInfo = wechatNewService.getSnsUserInfo(oauthToken.getAccessToken(), oauthToken.getOpenId()); + RegisterThirdUserRequest registerThirdUserRequest = new RegisterThirdUserRequest(); + BeanUtils.copyProperties(userInfo, registerThirdUserRequest); + registerThirdUserRequest.setSpreadPid(spreadUid); + registerThirdUserRequest.setType(Constants.USER_LOGIN_TYPE_PUBLIC); + registerThirdUserRequest.setOpenId(oauthToken.getOpenId()); + String key = SecureUtil.md5(oauthToken.getOpenId()); + redisUtil.set(key, JSONObject.toJSONString(registerThirdUserRequest), (long) (60 * 2), TimeUnit.MINUTES); + + loginResponse.setType("register"); + loginResponse.setKey(key); + return loginResponse; + } + + /** + * 获取微信授权logo + * + * @return String; + */ + @Override + public String getLogo() { + return systemConfigService.getValueByKey(Constants.CONFIG_KEY_MOBILE_LOGIN_LOGO); + } + + /** + * 小程序登录 + * + * @param code String 前端临时授权code + * @param request RegisterThirdUserRequest 用户信息 + * @return LoginResponse + */ + @Override + public LoginResponse weChatAuthorizeProgramLogin(String code, RegisterThirdUserRequest request) { + WeChatMiniAuthorizeVo response = wechatNewService.miniAuthCode(code); + System.out.println("小程序登陆成功 = " + JSON.toJSONString(response)); + + //检测是否存在 + UserToken userToken = userTokenService.getByOpenidAndType(response.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM); + LoginResponse loginResponse = new LoginResponse(); + if (ObjectUtil.isNotNull(userToken)) {// 已存在,正常登录 + User user = userService.getById(userToken.getUid()); + if (!user.getStatus()) { + throw new YztException("当前账户已禁用,请联系管理员!"); + } + // 记录最后一次登录时间 + user.setLastLoginTime(YztDateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + // 分销绑定 + if (userService.checkBingSpread(user, request.getSpreadPid(), "old")) { + user.setSpreadUid(request.getSpreadPid()); + user.setSpreadTime(YztDateUtil.nowDateTime()); + // 处理新旧推广人数据 + userService.updateSpreadCountByUid(request.getSpreadPid(), "add"); + } + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("小程序登录绑定分销关系失败,uid={},spreadUid={}", user.getUid(), request.getSpreadPid())); + } + + try { + String token = tokenComponent.createToken(user); + loginResponse.setToken(token); + } catch (Exception e) { + logger.error(StrUtil.format("小程序登录生成token失败,uid={}", user.getUid())); + e.printStackTrace(); + } + loginResponse.setType("login"); + loginResponse.setUid(user.getUid()); + loginResponse.setNikeName(user.getNickname()); + loginResponse.setPhone(user.getPhone()); + return loginResponse; + } + + if (StrUtil.isBlank(request.getNickName()) && StrUtil.isBlank(request.getAvatar()) && StrUtil.isBlank(request.getHeadimgurl())) { + // 返回后,前端去走注册起始页 + loginResponse.setType("start"); + return loginResponse; + } + if (StrUtil.isBlank(request.getNickName())) { + request.setNickName(""); + } + request.setType(Constants.USER_LOGIN_TYPE_PROGRAM); + request.setOpenId(response.getOpenId()); + String key = SecureUtil.md5(response.getOpenId()); + redisUtil.set(key, JSONObject.toJSONString(request), (long) (60 * 2), TimeUnit.MINUTES); + loginResponse.setType("register"); + loginResponse.setKey(key); + return loginResponse; + } + + /** + * 推广人排行榜 + * + * @param type String 时间范围(week-周,month-月) + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + @Override + public List getTopSpreadPeopleListByDate(String type, PageParamRequest pageParamRequest) { + return userService.getTopSpreadPeopleListByDate(type, pageParamRequest); + } + + /** + * 佣金排行榜 + * + * @param type String 时间范围 + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + @Override + public List getTopBrokerageListByDate(String type, PageParamRequest pageParamRequest) { + // 获取佣金排行榜(周、月) + List recordList = userBrokerageRecordService.getBrokerageTopByDate(type); + if (CollUtil.isEmpty(recordList)) { + return null; + } + // 解决0元排行问题 + for (int i = 0; i < recordList.size(); ) { + UserBrokerageRecord userBrokerageRecord = recordList.get(i); + if (userBrokerageRecord.getPrice().compareTo(BigDecimal.ZERO) < 1) { + recordList.remove(i); + continue; + } + i++; + } + if (CollUtil.isEmpty(recordList)) { + return null; + } + + List uidList = recordList.stream().map(UserBrokerageRecord::getUid).collect(Collectors.toList()); + //查询用户 + HashMap userVoList = userService.getMapListInUid(uidList); + + //解决排序问题 + List userList = CollUtil.newArrayList(); + for (UserBrokerageRecord record : recordList) { + User user = new User(); + User userVo = userVoList.get(record.getUid()); + + user.setUid(record.getUid()); + user.setAvatar(userVo.getAvatar()); + user.setBrokeragePrice(record.getPrice()); + if (StrUtil.isBlank(userVo.getNickname())) { + user.setNickname(userVo.getPhone().substring(0, 2) + "****" + userVo.getPhone().substring(7)); + } else { + user.setNickname(userVo.getNickname()); + } + userList.add(user); + } + return userList; + } + + /** + * 推广海报图 + * + * @return List + */ + @Override + public List getSpreadBannerList() { + return systemGroupDataService.getListByGid(Constants.GROUP_DATA_ID_SPREAD_BANNER_LIST, UserSpreadBannerResponse.class); + } + + /** + * 当前用户在佣金排行第几名 + * + * @param type String 时间范围 + * @return 优惠券集合 + */ + @Override + public Integer getNumberByTop(String type) { + int number = 0; + Integer userId = userService.getUserIdException(); + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setLimit(100); + + List recordList = userBrokerageRecordService.getBrokerageTopByDate(type); + if (CollUtil.isEmpty(recordList)) { + return number; + } + + for (int i = 0; i < recordList.size(); i++) { + if (recordList.get(i).getUid().equals(userId)) { + number = i + 1; + break; + } + } + return number; + } + + /** + * 佣金转入余额 + * + * @return Boolean + */ + @Override + public Boolean transferIn(BigDecimal price) { + if (price.compareTo(BigDecimal.ZERO) <= 0) { + throw new YztException("转入金额不能为0"); + } + //当前可提现佣金 + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户数据异常"); + } + BigDecimal subtract = user.getBrokeragePrice(); + if (subtract.compareTo(price) < 0) { + throw new YztException("您当前可充值余额为 " + subtract + "元"); + } + // userBill现金增加记录 + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setPm(1); + userBill.setTitle("佣金转余额"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_TRANSFER_IN); + userBill.setNumber(price); + userBill.setBalance(user.getNowMoney().add(price)); + userBill.setMark(StrUtil.format("佣金转余额,增加{}", price)); + userBill.setStatus(1); + userBill.setCreateTime(YztDateUtil.nowDateTime()); + + // userBrokerage转出记录 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(user.getUid()); + brokerageRecord.setLinkId("0"); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_YUE); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_BROKERAGE_YUE); + brokerageRecord.setPrice(price); + brokerageRecord.setBalance(user.getNowMoney().add(price)); + brokerageRecord.setMark(StrUtil.format("佣金转余额,减少{}", price)); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + brokerageRecord.setCreateTime(YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 扣佣金 + userService.operationBrokerage(user.getUid(), price, user.getBrokeragePrice(), "sub"); + // 加余额 + userService.operationNowMoney(user.getUid(), price, user.getNowMoney(), "add"); + userBillService.save(userBill); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 提现记录 + */ + @Override + public PageInfo getExtractRecord(PageParamRequest pageParamRequest) { + Integer userId = userService.getUserIdException(); + return userExtractService.getExtractRecord(userId, pageParamRequest); + } + + /** + * 推广佣金明细 + * + * @param pageParamRequest 分页参数 + */ + @Override + public PageInfo getSpreadCommissionDetail(PageParamRequest pageParamRequest) { + User user = userService.getInfoException(); + // SQL层面按link_id和link_type分组并统计,直接返回结果 + return userBrokerageRecordService.findDetailListByUid(user.getUid(), pageParamRequest); + } + + /** + * 用户账单记录(现金) + * + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return CommonPage + */ + @Override + public CommonPage nowMoneyBillRecord(String type, PageParamRequest pageRequest) { + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户数据异常"); + } + PageInfo billPageInfo = userBillService.nowMoneyBillRecord(user.getUid(), type, pageRequest); + return CommonPage.restPage(billPageInfo); + } + + /** + * 微信注册绑定手机号 + * + * @param request 请求参数 + * @return 登录信息 + */ + @Override + public LoginResponse registerBindingPhone(WxBindingPhoneRequest request) { + checkBindingPhone(request); + + // 进入创建用户绑定手机号流程 + Object o = redisUtil.get(request.getKey()); + if (ObjectUtil.isNull(o)) { + throw new YztException("用户缓存已过期,请清除缓存重新登录"); + } + RegisterThirdUserRequest registerThirdUserRequest = JSONObject.parseObject(o.toString(), RegisterThirdUserRequest.class); + + boolean isNew = true; + + User user = userService.getByPhone(request.getPhone()); + if (ObjectUtil.isNull(user)) { + user = userService.registerByThird(registerThirdUserRequest); + user.setPhone(request.getPhone()); + user.setAccount(request.getPhone()); + user.setSpreadUid(0); + user.setPwd(CommonUtil.createPwd(request.getPhone())); + } else {// 已有账户,关联到之前得账户即可 + // 查询是否用对应得token + int type = 0; + switch (request.getType()) { + case "public": + type = Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC; + break; + case "routine": + type = Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM; + break; + case "iosWx": + type = Constants.THIRD_LOGIN_TOKEN_TYPE_IOS_WX; + break; + case "androidWx": + type = Constants.THIRD_LOGIN_TOKEN_TYPE_ANDROID_WX; + break; + } + + UserToken userToken = userTokenService.getTokenByUserId(user.getUid(), type); + if (ObjectUtil.isNotNull(userToken)) { + throw new YztException("该手机号已被注册"); + } + isNew = false; + } + + User finalUser = user; + boolean finalIsNew = isNew; + Boolean execute = transactionTemplate.execute(e -> { + if (finalIsNew) {// 新用户 + // 分销绑定 + if (userService.checkBingSpread(finalUser, registerThirdUserRequest.getSpreadPid(), "new")) { + finalUser.setSpreadUid(registerThirdUserRequest.getSpreadPid()); + finalUser.setSpreadTime(YztDateUtil.nowDateTime()); + userService.updateSpreadCountByUid(registerThirdUserRequest.getSpreadPid(), "add"); + } + userService.save(finalUser); + // 赠送新人券 + giveNewPeopleCoupon(finalUser.getUid()); + } + switch (request.getType()) { + case "public": + userTokenService.bind(registerThirdUserRequest.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_PUBLIC, finalUser.getUid()); + break; + case "routine": + userTokenService.bind(registerThirdUserRequest.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM, finalUser.getUid()); + break; + case "iosWx": + userTokenService.bind(registerThirdUserRequest.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_IOS_WX, finalUser.getUid()); + break; + default: + userTokenService.bind(registerThirdUserRequest.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_ANDROID_WX, finalUser.getUid()); + break; + } + return Boolean.TRUE; + }); + if (!execute) { + logger.error("微信用户注册生成失败,nickName = " + registerThirdUserRequest.getNickName()); + } else if (!isNew) {// 老用户绑定推广人 + if (ObjectUtil.isNotNull(registerThirdUserRequest.getSpreadPid()) && registerThirdUserRequest.getSpreadPid() > 0) { + loginService.bindSpread(finalUser, registerThirdUserRequest.getSpreadPid()); + } + } + LoginResponse loginResponse = new LoginResponse(); + try { + String token = tokenComponent.createToken(finalUser); + loginResponse.setToken(token); + } catch (Exception e) { + logger.error(StrUtil.format("绑定手机号,自动登录生成token失败,uid={}", finalUser.getUid())); + e.printStackTrace(); + } + loginResponse.setType("login"); + loginResponse.setUid(user.getUid()); + loginResponse.setNikeName(user.getNickname()); + loginResponse.setPhone(user.getPhone()); + return loginResponse; + } + + /** + * 用户积分记录列表 + * + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getUserIntegralRecordList(PageParamRequest pageParamRequest) { + Integer uid = userService.getUserIdException(); + return userIntegralRecordService.findUserIntegralRecordList(uid, pageParamRequest); + } + + /** + * 微信app登录 + * + * @param request 请求参数 + * @return 登录响应体 + */ + @Override + public LoginResponse appLogin(RegisterAppWxRequest request) { + //检测是否存在 + UserToken userToken = null; + if (request.getType().equals(Constants.USER_LOGIN_TYPE_IOS_WX)) { + userToken = userTokenService.getByOpenidAndType(request.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_IOS_WX); + } + if (request.getType().equals(Constants.USER_LOGIN_TYPE_ANDROID_WX)) { + userToken = userTokenService.getByOpenidAndType(request.getOpenId(), Constants.THIRD_LOGIN_TOKEN_TYPE_ANDROID_WX); + } + LoginResponse loginResponse = new LoginResponse(); + if (ObjectUtil.isNotNull(userToken)) {// 已存在,正常登录 + User user = userService.getById(userToken.getUid()); + if (!user.getStatus()) { + throw new YztException("当前账户已禁用,请联系管理员!"); + } + + // 记录最后一次登录时间 + user.setLastLoginTime(YztDateUtil.nowDateTime()); + user.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(e -> { + userService.updateById(user); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("APP微信登录记录最后一次登录时间失败,uid={}", user.getUid())); + } + try { + String token = tokenComponent.createToken(user); + loginResponse.setToken(token); + } catch (Exception e) { + logger.error(StrUtil.format("APP微信登录生成token失败,uid={}", user.getUid())); + e.printStackTrace(); + } + loginResponse.setType("login"); + loginResponse.setUid(user.getUid()); + return loginResponse; + } + // 没有用户,走创建用户流程 + // 从微信获取用户信息,存入Redis中,将key返回给前端,前端在下一步绑定手机号的时候下发 + RegisterThirdUserRequest registerThirdUserRequest = new RegisterThirdUserRequest(); + registerThirdUserRequest.setSpreadPid(0); + registerThirdUserRequest.setType(request.getType()); + registerThirdUserRequest.setOpenId(request.getOpenId()); + registerThirdUserRequest.setNickName(request.getNickName()); + registerThirdUserRequest.setSex(request.getGender()); + registerThirdUserRequest.setProvince(request.getProvince()); + registerThirdUserRequest.setCity(request.getCity()); + registerThirdUserRequest.setCountry(request.getCountry()); + registerThirdUserRequest.setAvatar(request.getAvatarUrl()); + String key = SecureUtil.md5(request.getOpenId()); + redisUtil.set(key, JSONObject.toJSONString(registerThirdUserRequest), (long) (60 * 2), TimeUnit.MINUTES); + + loginResponse.setType("register"); + loginResponse.setKey(key); + return loginResponse; + } + + /** + * 获取用户积分信息 + * + * @return IntegralUserResponse + */ + @Override + public IntegralUserResponse getIntegralUser() { + User user = userService.getInfoException(); + IntegralUserResponse userSignInfoResponse = new IntegralUserResponse(); + + //签到 + Integer sumIntegral = userIntegralRecordService.getSumIntegral(user.getUid(), IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD, "", null); + ArrayList linkTypeList = new ArrayList<>(); + linkTypeList.add(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ORDER); + linkTypeList.add(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_SYSTEM); + Integer deductionIntegral = userIntegralRecordService.getSumIntegral(user.getUid(), IntegralRecordConstants.INTEGRAL_RECORD_TYPE_SUB, "", linkTypeList); + // 转为 BigDecimal(service 返回 Integer) + userSignInfoResponse.setSumIntegral(sumIntegral == null ? BigDecimal.ZERO : BigDecimal.valueOf(sumIntegral.longValue())); + userSignInfoResponse.setDeductionIntegral(deductionIntegral == null ? BigDecimal.ZERO : BigDecimal.valueOf(deductionIntegral.longValue())); + // 冻结积分 + Integer frozenIntegral = userIntegralRecordService.getFrozenIntegralByUid(user.getUid()); + userSignInfoResponse.setFrozenIntegral(frozenIntegral == null ? BigDecimal.ZERO : BigDecimal.valueOf(frozenIntegral.longValue())); + userSignInfoResponse.setIntegral(user.getIntegral()); + return userSignInfoResponse; + } + + /** + * 获取用户经验记录 + * + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getUserExperienceList(PageParamRequest pageParamRequest) { + Integer userId = userService.getUserIdException(); + return experienceRecordService.getH5List(userId, pageParamRequest); + } + + /** + * 提现用户信息 + * + * @return UserExtractCashResponse + */ + @Override + public UserExtractCashResponse getExtractUser() { + User user = userService.getInfoException(); + // 提现最低金额 + String minPrice = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_EXTRACT_MIN_PRICE); + // 冻结天数 + String extractTime = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_EXTRACT_FREEZING_TIME); + // 可提现佣金 + BigDecimal brokeragePrice = user.getBrokeragePrice(); + // 冻结佣金 + BigDecimal freeze = userBrokerageRecordService.getFreezePrice(user.getUid()); + return new UserExtractCashResponse(minPrice, brokeragePrice, freeze, extractTime); + } + + /** + * 推广人列表统计 + * + * @return UserSpreadPeopleResponse + */ + @Override + public UserSpreadPeopleResponse getSpreadPeopleCount() { + //查询当前用户名下的一级推广员 + UserSpreadPeopleResponse userSpreadPeopleResponse = new UserSpreadPeopleResponse(); + List userIdList = new ArrayList<>(); + Integer userId = userService.getUserIdException(); + userIdList.add(userId); + userIdList = userService.getSpreadPeopleIdList(userIdList); //我推广的一级用户id集合 + + if (CollUtil.isEmpty(userIdList)) {//如果没有一级推广人,直接返回 + userSpreadPeopleResponse.setCount(0); + userSpreadPeopleResponse.setTotal(0); + userSpreadPeopleResponse.setTotalLevel(0); + return userSpreadPeopleResponse; + } + + userSpreadPeopleResponse.setTotal(userIdList.size()); //一级推广人 + //查询二级推广人 + List secondSpreadIdList = userService.getSpreadPeopleIdList(userIdList); + if (CollUtil.isEmpty(secondSpreadIdList)) { + userSpreadPeopleResponse.setTotalLevel(0); + userSpreadPeopleResponse.setCount(userSpreadPeopleResponse.getTotal()); + return userSpreadPeopleResponse; + } + userSpreadPeopleResponse.setTotalLevel(secondSpreadIdList.size()); + userSpreadPeopleResponse.setCount(userIdList.size() + secondSpreadIdList.size()); + return userSpreadPeopleResponse; + } + + /** + *充值申请 + */ + @Override + public Boolean userRechargeApply(UserRechargeApplicationRequest request) { + return userRechargeApplicationService.userRechargeApply(request); + } + + /** + * 兑换记录查询 + */ + @Override + public PageInfo getUserApplications(PageParamRequest pageParamRequest, Integer status) { + Integer uid = userService.getUserIdException(); + Page userRechargeApplicationPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + List userRechargeApplicationList = userRechargeApplicationService.getUserApplications(status,uid); + return CommonPage.copyPageInfo(userRechargeApplicationPage, userRechargeApplicationList); + } + + + /** + * 绑定手机号数据校验 + */ + private void checkBindingPhone(WxBindingPhoneRequest request) { + if (!request.getType().equals("public") && !request.getType().equals("routine") && !request.getType().equals("iosWx") && !request.getType().equals("androidWx")) { + throw new YztException("未知的用户类型"); + } + if (request.getType().equals("public") || request.getType().equals("iosWx") || request.getType().equals("androidWx")) { + if (StrUtil.isBlank(request.getCaptcha())) { + throw new YztException("验证码不能为空"); + } + boolean matchPhone = ReUtil.isMatch(RegularConstants.PHONE_TWO, request.getPhone()); + if (!matchPhone) { + throw new YztException("手机号格式错误,请输入正确得手机号"); + } + // 公众号用户校验验证码 + boolean match = ReUtil.isMatch(RegularConstants.VALIDATE_CODE_NUM_SIX, request.getCaptcha()); + if (!match) { + throw new YztException("验证码格式错误,验证码必须为6位数字"); + } + checkValidateCode(request.getPhone(), request.getCaptcha()); + } else { + if (StrUtil.isNotBlank(request.getCaptcha())) { + if (StrUtil.isBlank(request.getPhone())) { + throw new YztException("手机号不能为空"); + } + boolean matchPhone = ReUtil.isMatch(RegularConstants.PHONE_TWO, request.getPhone()); + if (!matchPhone) { + throw new YztException("手机号格式错误,请输入正确得手机号"); + } + boolean match = ReUtil.isMatch(RegularConstants.VALIDATE_CODE_NUM_SIX, request.getCaptcha()); + if (!match) { + throw new YztException("验证码格式错误,验证码必须为6位数字"); + } + checkValidateCode(request.getPhone(), request.getCaptcha()); + } else { + // 参数校验 + if (StrUtil.isBlank(request.getCode())) { + throw new YztException("小程序获取手机号code不能为空"); + } + if (StrUtil.isBlank(request.getEncryptedData())) { + throw new YztException("小程序获取手机号加密数据不能为空"); + } + if (StrUtil.isBlank(request.getIv())) { + throw new YztException("小程序获取手机号加密算法的初始向量不能为空"); + } + // 获取appid + String programAppId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_MINI_APPID); + if (StrUtil.isBlank(programAppId)) { + throw new YztException("微信小程序appId未设置"); + } + + WeChatMiniAuthorizeVo response = wechatNewService.miniAuthCode(request.getCode()); + System.out.println("小程序登陆成功 = " + JSON.toJSONString(response)); + String decrypt = WxUtil.decrypt(programAppId, request.getEncryptedData(), response.getSessionKey(), request.getIv()); + if (StrUtil.isBlank(decrypt)) { + throw new YztException("微信小程序获取手机号解密失败"); + } + JSONObject jsonObject = JSONObject.parseObject(decrypt); + if (StrUtil.isBlank(jsonObject.getString("phoneNumber"))) { + throw new YztException("微信小程序获取手机号没有有效的手机号"); + } + request.setPhone(jsonObject.getString("phoneNumber")); + } + } + } + + /** + * 赠送新人券 + * + * @param uid 用户uid + */ + private void giveNewPeopleCoupon(Integer uid) { + // 查询是否有新人注册赠送优惠券 + List couponUserList = CollUtil.newArrayList(); + List couponList = storeCouponService.findRegisterList(); + if (CollUtil.isNotEmpty(couponList)) { + couponList.forEach(storeCoupon -> { + //是否有固定的使用时间 + if (!storeCoupon.getIsFixedTime()) { + String endTime = YztDateUtil.addDay(YztDateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(YztDateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + if (storeCoupon.getIsFixedTime()) {// 使用固定时间 + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + } else {// 没有固定使用时间 + Date nowDate = YztDateUtil.nowDateTime(); + storeCouponUser.setStartTime(nowDate); + DateTime dateTime = DateUtil.offsetDay(nowDate, storeCoupon.getDay()); + storeCouponUser.setEndTime(dateTime); + } + storeCouponUser.setType("register"); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + storeCouponUser.setType(CouponConstants.STORE_COUPON_USER_TYPE_REGISTER); + couponUserList.add(storeCouponUser); + }); + } + + // 赠送客户优惠券 + if (CollUtil.isNotEmpty(couponUserList)) { + couponUserList.forEach(couponUser -> couponUser.setUid(uid)); + storeCouponUserService.saveBatch(couponUserList); + couponList.forEach(coupon -> storeCouponService.deduction(coupon.getId(), 1, coupon.getIsLimited())); + } + } + + /** + * 检测手机验证码 + * + * @param phone 手机号 + * @param code 验证码 + */ + private void checkValidateCode(String phone, String code) { + Object validateCode = redisUtil.get(SmsConstants.SMS_VALIDATE_PHONE + phone); + if (validateCode == null) { + throw new YztException("验证码已过期"); + } + if (!validateCode.toString().equals(code)) { + throw new YztException("验证码错误"); + } + //删除验证码 + redisUtil.delete(SmsConstants.SMS_VALIDATE_PHONE + phone); + } +} diff --git a/fightwine-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/fightwine-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..d732dd5 --- /dev/null +++ b/fightwine-front/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "properties": [ + { + "name": "wx.miniapp.configs", + "type": "java.util.List", + "description": "Description for wx.miniapp.configs." + } + ] +} diff --git a/fightwine-front/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService b/fightwine-front/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService new file mode 100644 index 0000000..582bd34 --- /dev/null +++ b/fightwine-front/src/main/resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService @@ -0,0 +1 @@ +com.yzt.front.service.impl.CaptchaCacheServiceRedisImpl \ No newline at end of file diff --git a/fightwine-front/src/main/resources/application.yml b/fightwine-front/src/main/resources/application.yml new file mode 100644 index 0000000..76b79cd --- /dev/null +++ b/fightwine-front/src/main/resources/application.yml @@ -0,0 +1,151 @@ +# YZT 相关配置 +yzt: + version: YZT-JAVA # 当前代码版本 + domain: #配合swagger使用 # 待部署域名 + wechat-api-url: #请求微信接口中专服务器 + wechat-js-api-debug: false #微信js api系列是否开启调试模式 + wechat-js-api-beta: true #微信js api是否是beta版本 + asyncConfig: true #是否同步config表数据到redis + asyncWeChatProgramTempList: false #是否同步小程序公共模板库 + imagePath: /opt/fightwine/ # 服务器图片路径配置 斜杠结尾 + demoSite: true # 是否演示站点 所有手机号码都会掩码 + activityStyleCachedTime: 10 #活动边框缓存周期 秒为单位,生产环境适当5-10分钟即可 + ignored: #安全路径白名单 + - swagger-ui/ + - swagger-resources/** + - /**/v2/api-docs + - /**/*.html + - /**/*.js + - /**/*.css + - /**/*.png + - /**/*.map + - /favicon.ico + - /actuator/** + - /druid/** + - api/admin/pagediy/info + - api/public/** + +# 配置端口 +server: + port: 10087 + servlet: + context-path: / # 访问path + tomcat: + uri-encoding: UTF-8 # 默认编码格式 + max-threads: 1000 # 最大线程数量 默认200 + min-spare-threads: 30 # 初始化启动线程数量 + +spring: + mvc: + path match: + matching-strategy: ant_path_matcher + profiles: + # 配置的环境 +# active: #spring.profiles.active# + active: + servlet: + multipart: + max-file-size: 50MB #设置单个文件大小 + max-request-size: 50MB #设置单次请求文件的总大小 + application: + name: fightwine-front #这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name + jackson: + locale: zh_CN + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + # 数据库配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://183.6.65.90:5001/fight_wine?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai + username: root + password: Yizhitong@2024 + # quartz + + redis: + host: 183.6.65.90 #地址 + port: 5004 #端口 + password: Cbms@dev + timeout: 30000 # 连接超时时间(毫秒) + database: 6 #默认数据库 + jedis: + pool: + max-active: 200 # 连接池最大连接数(使用负值表示没有限制) + max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) + max-idle: 10 # 连接池中的最大空闲连接 + min-idle: 0 # 连接池中的最小空闲连接 + time-between-eviction-runs: -1 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 + second: + database: 14 # 微信accessToken存储库 + +debug: true +logging: + level: + io.swagger.*: error + org.springframework.boot.autoconfigure: debug + config: classpath:logback-spring.xml + file: + path: ./yzt_log/front/ + +# mybatis 配置 +mybatis-plus: + mapper-locations: classpath*:mapper/*/*Mapper.xml #xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置) + typeAliasesPackage: com.yzt.**.model + # 配置slq打印日志 + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: +# logic-delete-field: isDel #全局逻辑删除字段值 3.3.0开始支持,详情看下面。 + logic-delete-value: 1 # 逻辑已删除值(默认为 1) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + + +#swagger 配置 +swagger: + basic: + enable: true #是否开启 + check: false #是否打开验证 + username: #访问swagger的账号 + password: #访问swagger的密码 + +# 行为验证码 +aj: + captcha: + type: default # 验证码类型 + water-mark: YZT # 水印 + slip-offset: 15 # 校验滑动拼图允许误差偏移量(默认5像素) + aes-status: true # aes加密坐标开启或者禁用(true|false) + interference-options: 2 # 滑动干扰项(0/1/2) + font-style: 1 # 点选字体样式 默认Font.BOLD + font-size: 25 # 点选字体字体大小 + req-frequency-limit-enable: false # 接口请求次数一分钟限制是否开启 true|false + req-get-lock-limit: 5 # 验证失败5次,get接口锁定 + req-get-lock-seconds: 360 # 验证失败后,锁定时间间隔,s + req-get-minute-limit: 30 # get接口一分钟内请求数限制 + req-check-minute-limit: 60 # check接口一分钟内请求数限制 + req-verify-minute-limit: 60 # verify接口一分钟内请求数限制 + + # 滑动验证,底图路径,不配置将使用默认图片 + # 支持全路径 + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/jigsaw + jigsaw: classpath:images/jigsaw + #滑动验证,底图路径,不配置将使用默认图片 + ##支持全路径 + # 支持项目路径,以classpath:开头,取resource目录下路径,例:classpath:images/pic-click + pic-click: classpath:images/pic-click + # 对于分布式部署的应用,我们建议应用自己实现CaptchaCacheService,比如用Redis或者memcache, + # 参考CaptchaCacheServiceRedisImpl.java + # 如果应用是单点的,也没有使用redis,那默认使用内存。 + # 内存缓存只适合单节点部署的应用,否则验证码生产与验证在节点之间信息不同步,导致失败。 + # !!! 注意啦,如果应用有使用spring-boot-starter-data-redis, + # 请打开CaptchaCacheServiceRedisImpl.java注释。 + # redis -----> SPI: 在resources目录新建META-INF.services文件夹(两层),参考当前服务resources。 + # 缓存local/redis... + cache-type: redis + # local缓存的阈值,达到这个值,清除缓存 + cache-number: 1000 + # local定时清除过期缓存(单位秒),设置为0代表不执行 + timing-clear: 3600 + + history-data-clear-enable: false \ No newline at end of file diff --git a/fightwine-front/src/main/resources/fonts/WenQuanZhengHei.ttf b/fightwine-front/src/main/resources/fonts/WenQuanZhengHei.ttf new file mode 100644 index 0000000..f84e9fe Binary files /dev/null and b/fightwine-front/src/main/resources/fonts/WenQuanZhengHei.ttf differ diff --git a/fightwine-front/src/main/resources/fonts/license.txt b/fightwine-front/src/main/resources/fonts/license.txt new file mode 100644 index 0000000..719f68f --- /dev/null +++ b/fightwine-front/src/main/resources/fonts/license.txt @@ -0,0 +1,55 @@ +文泉驿是一个开源汉字字体项目 + +由旅美学者房骞骞(FangQ) + +于2004年10月创建 + +集中力量解决GNU/Linux + +高质量中文字体匮乏的状况 + +目前,文泉驿已经开发并发布了 + +第一个完整覆盖GB18030汉字 + +(包含27000多个汉字) + +的多规格点阵汉字字型文件 + +第一个覆盖GBK字符集的 + +开源矢量字型文件(文泉驿正黑) + +并提供了目前包含字符数目最多的 + +开源字体——GNU Unifont——中 + +绝大多数中日韩文相关的符号 + +这些字型文件已经逐渐成为 + +主流Linux/Unix发行版 + +中文桌面的首选中文字体 + +目前Ubuntu、Fedora、Slackware + +Magic Linux、CDLinux + +使用文泉驿作为默认中文字体 + +Debian、Gentoo、Mandriva + +ArchLinux、Frugalware + +则提供了官方源支持 + +而FreeBSD则在其ports中有提供 + +所以,今天我们所要分享的就是 + +文泉驿正黑体 + +可在Linux/UNIX,Windows + +Mac OS和嵌入式操作系统中使用 \ No newline at end of file diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg1.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg1.png new file mode 100644 index 0000000..f2a58b7 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg1.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg2.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg2.png new file mode 100644 index 0000000..78a1a3c Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg2.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg3.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg3.png new file mode 100644 index 0000000..5d2fc68 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg3.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg4.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg4.png new file mode 100644 index 0000000..992e8ff Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg4.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg5.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg5.png new file mode 100644 index 0000000..4f91e82 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg5.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/original/bg6.png b/fightwine-front/src/main/resources/images/jigsaw/original/bg6.png new file mode 100644 index 0000000..ae10126 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/original/bg6.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/1.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/1.png new file mode 100644 index 0000000..1905026 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/1.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/10.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/10.png new file mode 100644 index 0000000..e651cf4 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/10.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/11.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/11.png new file mode 100644 index 0000000..5a33509 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/11.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/2.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/2.png new file mode 100644 index 0000000..b1482d4 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/2.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/3.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/3.png new file mode 100644 index 0000000..cdbb0b1 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/3.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/4.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/4.png new file mode 100644 index 0000000..bc69c96 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/4.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/5.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/5.png new file mode 100644 index 0000000..0080a54 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/5.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/6.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/6.png new file mode 100644 index 0000000..b07c3b4 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/6.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/7.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/7.png new file mode 100644 index 0000000..3be019a Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/7.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/8.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/8.png new file mode 100644 index 0000000..96d3c76 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/8.png differ diff --git a/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/9.png b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/9.png new file mode 100644 index 0000000..524c940 Binary files /dev/null and b/fightwine-front/src/main/resources/images/jigsaw/slidingBlock/9.png differ diff --git a/fightwine-front/src/main/resources/images/pic-click/bg6.png b/fightwine-front/src/main/resources/images/pic-click/bg6.png new file mode 100644 index 0000000..4cd9cbb Binary files /dev/null and b/fightwine-front/src/main/resources/images/pic-click/bg6.png differ diff --git a/fightwine-front/src/main/resources/images/pic-click/bg8.png b/fightwine-front/src/main/resources/images/pic-click/bg8.png new file mode 100644 index 0000000..1721aea Binary files /dev/null and b/fightwine-front/src/main/resources/images/pic-click/bg8.png differ diff --git a/fightwine-front/src/main/resources/images/pic-click/bg9.png b/fightwine-front/src/main/resources/images/pic-click/bg9.png new file mode 100644 index 0000000..8d5060a Binary files /dev/null and b/fightwine-front/src/main/resources/images/pic-click/bg9.png differ diff --git a/fightwine-front/src/main/resources/logback-spring.xml b/fightwine-front/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..74b6f64 --- /dev/null +++ b/fightwine-front/src/main/resources/logback-spring.xml @@ -0,0 +1,129 @@ + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + ${log.path}/sys-console.log + + + ${log.path}/sys-console.%d{yyyy-MM-dd}.log + + 1 + + + ${log.pattern} + utf-8 + + + + INFO + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + 0 + + 512 + + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fightwine-service/pom.xml b/fightwine-service/pom.xml new file mode 100644 index 0000000..3d73a93 --- /dev/null +++ b/fightwine-service/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + + com.yzt.fightwine + yzt-fightwine + 1.0-SNAPSHOT + + + fightwine-service + + + 21 + 21 + UTF-8 + + + + + com.yzt.fightwine + fightwine-common + 1.0-SNAPSHOT + + + + com.jayway.jsonpath + json-path + 2.4.0 + + + + com.google.code.gson + gson + 2.8.9 + + + + org.projectlombok + lombok + + + + \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/delete/OrderUtils.java b/fightwine-service/src/main/java/com/yzt/service/delete/OrderUtils.java new file mode 100644 index 0000000..7db3d14 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/delete/OrderUtils.java @@ -0,0 +1,187 @@ +package com.yzt.service.delete; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.service.service.StoreOrderInfoService; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 订单工具类 + * + */ +@Service +public class OrderUtils { + + @Autowired + private UserService userService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + /** + * 检测支付渠道 + * @param payChannel 支付渠道 + */ + public static boolean checkPayChannel(String payChannel) { + if (!payChannel.equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5) && + !payChannel.equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM) && + !payChannel.equals(PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC) && + !payChannel.equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_IOS) && + !payChannel.equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_ANDROID)) { + return false; + } + return true; + } + + /** + * 检查支付类型 + * @param payType 支付类型标识 + * @return 是否支持 + */ + public Boolean checkPayType(String payType){ + boolean result = false; + payType = payType.toLowerCase(); + switch (payType){ + case PayConstants.PAY_TYPE_WE_CHAT: + result = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN).equals("1"); + break; + case PayConstants.PAY_TYPE_YUE: + result = (systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS).equals("1")); + break; + case PayConstants.PAY_TYPE_ALI_PAY: + result = (systemConfigService.getValueByKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS).equals("1")); + break; + } + return result; + } + + /** + * 根据订单号查询订单信息 + * @param id 订单id + * @return 计算后的价格集合 + */ + public StoreOrder getInfoById(Integer id) { + StoreOrder storeOrder = storeOrderService.getById(id); + Integer userId = userService.getUserIdException(); + + if(null == storeOrder || !userId.equals(storeOrder.getUid())){ + //订单号错误 + throw new YztException("没有找到相关订单信息!"); + } + + return storeOrder; + } + + /** + * 翻译支付方式给前端 + * @param payType + * @return + */ + public String getOrderPayTypeStr(String payType){ + String payTypeStr = null; + switch (payType){ + case Constants.PAY_TYPE_WE_CHAT: + payTypeStr = "微信支付"; + break; + case Constants.PAY_TYPE_YUE: + payTypeStr = "余额支付"; + break; + case Constants.PAY_TYPE_OFFLINE: + payTypeStr = "线下支付"; + break; + case Constants.PAY_TYPE_ALI_PAY: + payTypeStr = "支付宝支付"; + break; + default: + payTypeStr = "其他支付方式"; + break; + } + return payTypeStr; + } + + /** + * h5 订单查询 where status 封装 + * @param queryWrapper 查询条件 + * @param status 状态 + */ + public void statusApiByWhere(LambdaQueryWrapper queryWrapper, Integer status){ + switch (status){ + case Constants.ORDER_STATUS_H5_UNPAID: // 未支付 + queryWrapper.eq(StoreOrder::getPaid, false); + queryWrapper.eq(StoreOrder::getStatus, 0); + queryWrapper.eq(StoreOrder::getRefundStatus, 0); + queryWrapper.eq(StoreOrder::getType, 0); + break; + case Constants.ORDER_STATUS_H5_NOT_SHIPPED: // 待发货 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.eq(StoreOrder::getStatus, 0); + queryWrapper.eq(StoreOrder::getRefundStatus, 0); +// queryWrapper.eq(StoreOrder::getShippingType, 1); + break; + case Constants.ORDER_STATUS_H5_SPIKE: // 待收货 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.eq(StoreOrder::getStatus, 1); + queryWrapper.eq(StoreOrder::getRefundStatus, 0); + break; + case Constants.ORDER_STATUS_H5_JUDGE: // 已支付 已收货 待评价 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.eq(StoreOrder::getStatus, 2); + queryWrapper.eq(StoreOrder::getRefundStatus, 0); + break; + case Constants.ORDER_STATUS_H5_COMPLETE: // 已完成 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.eq(StoreOrder::getStatus, 3); + queryWrapper.eq(StoreOrder::getRefundStatus, 0); + break; + case Constants.ORDER_STATUS_H5_REFUNDING: // 退款中 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.in(StoreOrder::getRefundStatus, 1, 3); + break; + case Constants.ORDER_STATUS_H5_REFUNDED: // 已退款 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.eq(StoreOrder::getRefundStatus, 2); + break; + case Constants.ORDER_STATUS_H5_REFUND: // 包含已退款和退款中 + queryWrapper.eq(StoreOrder::getPaid, true); + queryWrapper.in(StoreOrder::getRefundStatus, 1,2,3); + break; + } + queryWrapper.eq(StoreOrder::getIsDel, false); + queryWrapper.eq(StoreOrder::getIsSystemDel, false); + } + + /** + * 根据订单id获取订单中商品和名称和购买数量字符串 + * @param orderId 订单id + * @return 商品名称*购买数量 + */ + public String getStoreNameAndCarNumString(int orderId){ + List currentOrderInfo = storeOrderInfoService.getOrderListByOrderId(orderId); + if(currentOrderInfo.size() > 0) { + StringBuilder sbOrderProduct = new StringBuilder(); + for (StoreOrderInfoOldVo storeOrderInfoVo : currentOrderInfo) { + sbOrderProduct.append(storeOrderInfoVo.getInfo().getProductName() + "*" + + storeOrderInfoVo.getInfo().getPayNum()); + } + return sbOrderProduct.toString(); + } + return null; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/delete/ProductUtils.java b/fightwine-service/src/main/java/com/yzt/service/delete/ProductUtils.java new file mode 100644 index 0000000..5105da0 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/delete/ProductUtils.java @@ -0,0 +1,557 @@ +package com.yzt.service.delete; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.seckill.StoreSeckill; +import com.yzt.common.model.seckill.StoreSeckillManger; +import com.yzt.common.request.StoreProductRequest; +import com.yzt.common.response.ProductActivityItemResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.UrlUtil; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.io.*; +import java.math.BigDecimal; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +/** + * 商品工具类 + * + */ +@Service +public class ProductUtils { + private String baseUrl; + + String rightUrl; + + @Autowired + private SystemConfigService systemConfigService; + + @Lazy + @Autowired + private StoreSeckillService storeSeckillService; + + @Autowired + private StoreSeckillMangerService storeSeckillMangerService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreCombinationService storeCombinationService; + + /** + * 解析淘宝产品数据 + * + * @param url + * @param tag + * @throws IOException + * @throws JSONException + */ + public StoreProductRequest getTaobaoProductInfo(String url, int tag) throws JSONException, IOException { + setConfig(url, tag); + JSONObject tbJsonData = getRequestFromUrl(baseUrl + rightUrl); +// JSONObject tbJsonData = new JSONObject(JSONExample.tbJson); // just Test + JSONObject data = tbJsonData.getJSONObject("data"); + if (null == data) throw new YztException("复制商品失败--返回数据格式错误--未找到data"); + JSONObject item = data.getJSONObject("item"); + if (null == item) throw new YztException("复制商品失败--返回数据格式错误--未找到item"); + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + product.setStoreName(item.getString("title")); +// product.setStoreInfo(item.getString("title")); + product.setSliderImage(item.getString("images")); + product.setImage(item.getString("images").split(",")[0] + .replace("[", "").replace("\"", "")); + product.setKeyword(item.getString("title")); + BeanUtils.copyProperties(product, productRequest); + productRequest.setContent(item.getString("desc")); + + productRequest.setSpecType(true); + JSONArray props = item.getJSONArray("props"); +// if (null == props) throw new YztException("复制商品失败--返回数据格式错误--未找到props"); + if (null == props || props.length() < 1) { + productRequest.setSpecType(false); + return productRequest; + } + List spaAttes = new ArrayList<>(); + for (int i = 0; i < props.length(); i++) { + JSONObject pItem = props.getJSONObject(i); + StoreProductAttr spattr = new StoreProductAttr(); + spattr.setAttrName(pItem.getString("name")); + JSONArray values = pItem.getJSONArray("values"); + List attrValues = new ArrayList<>(); + for (int j = 0; j < values.length(); j++) { + JSONObject value = values.getJSONObject(j); + attrValues.add(value.getString("name")); + } + spattr.setAttrValues(JSON.toJSONString(attrValues)); + spaAttes.add(spattr); + } + productRequest.setAttr(spaAttes); + return productRequest; + } + + /** + * 解析京东产品数据 + * + * @param url + * @param tag + * @return + * @throws JSONException + */ + public StoreProductRequest getJDProductInfo(String url, int tag) throws JSONException, IOException { + setConfig(url, tag); + JSONObject tbJsonData = getRequestFromUrl(baseUrl + rightUrl); +// JSONObject tbJsonData = new JSONObject(JSONExample.jdJson); // just Test + JSONObject data = tbJsonData.getJSONObject("data"); + if (null == data) throw new YztException("复制商品失败--返回数据格式错误--未找到data"); + JSONObject item = data.getJSONObject("item"); + if (null == item) throw new YztException("复制商品失败--返回数据格式错误--未找到item"); + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + product.setStoreName(item.getString("name")); +// product.setStoreInfo(item.getString("name")); + product.setSliderImage(item.getString("images")); + product.setImage(item.getString("images").split(",")[0] + .replace("[", "").replace("\"", "")); + product.setPrice(BigDecimal.valueOf(item.getDouble("price"))); + BeanUtils.copyProperties(product, productRequest); + productRequest.setContent(item.getString("desc")); + + JSONObject props = item.getJSONObject("skuProps"); + if (null == props) throw new YztException("复制商品失败--返回数据格式错误--未找到props"); + List spaAttes = new ArrayList<>(); + JSONObject saleJson = item.getJSONObject("saleProp"); + int attrValueIsNullCount = 0; + Iterator saleProps = saleJson.keys(); + while (saleProps.hasNext()) { + StoreProductAttr spattr = new StoreProductAttr(); + String stepkey = saleProps.next(); + String stepValue = props.getString(stepkey); + String stepValueValidLength = stepValue.replace("[", "").replace("]", "").replace("\"", ""); + if (stepValueValidLength.length() > 0) { + com.alibaba.fastjson.JSONArray stepValues = JSON.parseArray(stepValue); + int c = stepValues.get(0).toString().length(); + attrValueIsNullCount += c == 0 ? 1 : 0; + spattr.setAttrName(saleJson.getString(stepkey)); + spattr.setAttrValues(props.getString(stepkey)); + spaAttes.add(spattr); + productRequest.setAttr(spaAttes); + } else { + attrValueIsNullCount += 1; + } + } + // 判断是否单属性 + productRequest.setSpecType(spaAttes.size() != attrValueIsNullCount); + return productRequest; + } + + /** + * 解析天猫产品数据 + * + * @param url + * @param tag + * @return + * @throws JSONException + */ + public StoreProductRequest getTmallProductInfo(String url, int tag) throws JSONException, IOException { + setConfig(url, tag); + JSONObject tbJsonData = getRequestFromUrl(baseUrl + rightUrl); +// JSONObject tbJsonData = new JSONObject(JSONExample.tmallJson); // just Test + JSONObject data = tbJsonData.getJSONObject("data"); + if (null == data) throw new YztException("复制商品失败--返回数据格式错误--未找到data"); + JSONObject item = data.getJSONObject("item"); + if (null == item) throw new YztException("复制商品失败--返回数据格式错误--未找到item"); + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + product.setStoreName(item.getString("title")); +// product.setStoreInfo(item.getString("subTitle")); + product.setSliderImage(item.getString("images")); + product.setImage(item.getString("images").split(",")[0] + .replace("[", "").replace("\"", "")); + product.setKeyword(item.getString("title")); + BeanUtils.copyProperties(product, productRequest); + productRequest.setContent(item.getString("descUrl")); + + productRequest.setSpecType(true); + JSONArray props = item.getJSONArray("props"); +// if (null == props) throw new YztException("复制商品失败--返回数据格式错误--未找到props"); + if (null == props || props.length() < 1) { + // 无规格商品 + productRequest.setSpecType(false); + return productRequest; + } + List spaAttes = new ArrayList<>(); + for (int i = 0; i < props.length(); i++) { + JSONObject pItem = props.getJSONObject(i); + StoreProductAttr spattr = new StoreProductAttr(); + spattr.setAttrName(pItem.getString("name")); + JSONArray values = pItem.getJSONArray("values"); + List attrValues = new ArrayList<>(); + for (int j = 0; j < values.length(); j++) { + JSONObject value = values.getJSONObject(j); + attrValues.add(value.getString("name")); + } + spattr.setAttrValues(JSON.toJSONString(attrValues)); + spaAttes.add(spattr); + } + productRequest.setAttr(spaAttes); + return productRequest; + } + + /** + * 解析拼多多产品数据 + * + * @param url + * @param tag + * @return + * @throws JSONException + */ + public StoreProductRequest getPddProductInfo(String url, int tag) throws JSONException, IOException { + setConfig(url, tag); + JSONObject tbJsonData = getRequestFromUrl(baseUrl + rightUrl); +// JSONObject tbJsonData = new JSONObject(JSONExample.pddJson); // just Test + JSONObject data = tbJsonData.getJSONObject("data"); + if (null == data) throw new YztException("复制商品失败--返回数据格式错误--未找到data"); + JSONObject item = data.getJSONObject("item"); + if (null == item) throw new YztException("复制商品失败--返回数据格式错误--未找到item"); + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + product.setStoreName(item.getString("goodsName")); +// product.setStoreInfo(item.getString("goodsDesc")); + product.setSliderImage(item.getString("thumbUrl")); + product.setImage(item.getString("banner")); + product.setVideoLink(item.getJSONArray("video").getJSONObject(0).getString("videoUrl")); + product.setPrice(BigDecimal.valueOf(item.getDouble("maxNormalPrice"))); + product.setOtPrice(BigDecimal.valueOf(item.getDouble("marketPrice"))); + BeanUtils.copyProperties(product, productRequest); + + JSONArray props = item.getJSONArray("skus"); + if (null == props) throw new YztException("复制商品失败--返回数据格式错误--未找到props"); + if (props.length() > 0) { + List spaAttes = new ArrayList<>(); + HashMap> tempAttr = new HashMap<>(); + for (int i = 0; i < props.length(); i++) { + JSONObject pItem = props.getJSONObject(i); + JSONArray specArray = pItem.getJSONArray("specs"); + for (int j = 0; j < specArray.length(); j++) { + JSONObject specItem = specArray.getJSONObject(j); + String keyTemp = specItem.getString("spec_key"); + String valueTemp = specItem.getString("spec_value"); + if (tempAttr.containsKey(keyTemp)) { + if (!tempAttr.get(keyTemp).contains(valueTemp)) { + tempAttr.get(keyTemp).add(valueTemp); + } + } else { + List tempList = new ArrayList<>(); + tempList.add(valueTemp); + tempAttr.put(keyTemp, tempList); + } + } + + } + Iterator iterator = tempAttr.keySet().iterator(); + while (iterator.hasNext()) { + String key = (String) iterator.next(); + StoreProductAttr spattr = new StoreProductAttr(); + spattr.setAttrName(key); + spattr.setAttrValues(tempAttr.get(key).toString()); + spaAttes.add(spattr); + } + productRequest.setAttr(spaAttes); + } + return productRequest; + } + + /** + * *** 苏宁返回的数据不一致,暂放 + * 解析苏宁产品数据 + * + * @param url + * @param tag + * @return + * @throws JSONException + */ + public StoreProductRequest getSuningProductInfo(String url, int tag) throws JSONException, IOException { + setConfig(url, tag); + JSONObject tbJsonData = getRequestFromUrl(baseUrl + rightUrl); + System.out.println("tbJsonData:" + tbJsonData); +// JSONObject tbJsonData = new JSONObject(JSONExample.snJson); // just Test + JSONObject data = tbJsonData.getJSONObject("data"); + if (null == data) throw new YztException("复制商品失败--返回数据格式错误--未找到data"); + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + product.setStoreName(data.getString("title")); +// product.setStoreInfo(data.getString("title")); + product.setSliderImage(data.getString("images")); + product.setImage(data.getString("images").split(",")[0] + .replace("[", "").replace("\"", "")); + Long priceS = data.getLong("price"); + product.setPrice(BigDecimal.valueOf(priceS)); + BeanUtils.copyProperties(product, productRequest); + productRequest.setContent(data.getString("desc")); + + List spaAttes = new ArrayList<>(); + StoreProductAttr spattr = new StoreProductAttr(); + spattr.setAttrName("默认"); + List attrValues = new ArrayList<>(); + attrValues.add("默认"); + spattr.setAttrValues(attrValues.toString()); + productRequest.setSpecType(false); + productRequest.setAttr(spaAttes); + return productRequest; + } + + /** + * 设置配置数据 + * + * @param tag + */ + public void setConfig(String url, int tag) { + String rightEndUrl = "&itemid="; + switch (tag) { // 导入平台1=淘宝,2=京东,3=苏宁,4=拼多多, 5=天猫 + case 1: + baseUrl = systemConfigService.getValueByKey("importProductTB"); + rightEndUrl += UrlUtil.getParamsByKey(url, "id"); + break; + case 2: + baseUrl = systemConfigService.getValueByKey("importProductJD"); + rightEndUrl += url.substring(url.lastIndexOf("/") + 1).replace(".html", ""); + break; + case 3: + baseUrl = systemConfigService.getValueByKey("importProductSN"); + int start = url.indexOf(".com/") + 5; + int end = url.indexOf(".html"); + String sp = url.substring(start, end); + String[] shopProduct = sp.split("/"); + rightEndUrl += shopProduct[1] + "&shopid=" + shopProduct[0]; + break; + case 4: + rightEndUrl += UrlUtil.getParamsByKey(url, "goods_id"); + baseUrl = systemConfigService.getValueByKey("importProductPDD"); + break; + case 5: + rightEndUrl += UrlUtil.getParamsByKey(url, "id"); + baseUrl = systemConfigService.getValueByKey("importProductTM"); + break; + } +// String token = systemConfigService.getValueByKey("importProductToken"); + String token = systemConfigService.getValueByKey("copy_product_apikey"); + if (StringUtils.isBlank(token)) { + throw new YztException("请配置复制产品平台的Token -- www.99api.com"); + } + if (StringUtils.isBlank(baseUrl)) { + throw new YztException("请配置复制产品平台的Url-- www.99api.com"); + } +// rightUrl = "?apikey="+systemConfigService.getValueByKey("importProductToken")+rightEndUrl; + rightUrl = "?apikey=" + systemConfigService.getValueByKey("copy_product_apikey") + rightEndUrl; + + } + + /** + * 99api产品复制工具方法 + * + * @param rd + * @return + * @throws IOException + */ + public static String readAll(Reader rd) throws IOException { + StringBuilder sb = new StringBuilder(); + int cp; + while ((cp = rd.read()) != -1) { + sb.append((char) cp); + } + return sb.toString(); + } + + /** + * 根据url访问99api后返回对应的平台的产品json数据 + * + * @param url + * @return + * @throws IOException + * @throws JSONException + */ + public static JSONObject getRequestFromUrl(String url) throws IOException, JSONException { + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + InputStream instream = conn.getInputStream(); + try { + BufferedReader rd = new BufferedReader(new InputStreamReader(instream, Charset.forName("UTF-8"))); + String jsonText = readAll(rd); + JSONObject json = new JSONObject(jsonText); + return json; + } finally { + instream.close(); + } + } + + /** + * 根据商品参加的活动次序查找对应活动明细 + * + * @param productId 商品id + * @param activity 活动次序 + * @return 活动结果 + */ + public HashMap getActivityByProduct(Integer productId, String activity) { + HashMap result = null; + // 根据参与活动配置次序查找对应活动信息 + if (StringUtils.isBlank(activity)) { + return result; + } + result = new HashMap<>(); + + List activitys = YztUtil.stringToArrayInt(activity); + for (Integer code : activitys) { + if (code == 1) { // 查找秒杀信息 + List currentSecKills = storeSeckillService.getCurrentSecKillByProductId(productId); + if (null != currentSecKills && currentSecKills.size() > 0) { + // 查询当前秒杀活动时间段配置信息 + StoreSeckillManger secKillManager = storeSeckillMangerService.getById(currentSecKills.get(0).getTimeId()); + // 将当前时间段转化成时间戳 + int secKillEndSecondTimestamp = + YztDateUtil.getSecondTimestamp(YztDateUtil.nowDateTime("yyyy-MM-dd " + secKillManager.getEndTime() + ":00:00")); + ProductActivityItemResponse secKillResponse = new ProductActivityItemResponse(); + secKillResponse.setId(currentSecKills.get(0).getId()); + secKillResponse.setTime(secKillEndSecondTimestamp); + secKillResponse.setType(Constants.PRODUCT_TYPE_SECKILL + ""); + result.put(code, secKillResponse); + } + } + if (code == 2) { // 查找砍价信息 + List currentBargains = storeBargainService.getCurrentBargainByProductId(productId); + if (CollUtil.isNotEmpty(currentBargains)) { + ProductActivityItemResponse bargainResponse = new ProductActivityItemResponse(); + bargainResponse.setId(currentBargains.get(0).getId()); + bargainResponse.setTime(YztDateUtil.getSecondTimestamp(currentBargains.get(0).getStopTime())); + bargainResponse.setType(Constants.PRODUCT_TYPE_BARGAIN + ""); + result.put(code, bargainResponse); + } + } + if (code == 3) { // 查找拼团信息 + List currentCombinations = storeCombinationService.getCurrentBargainByProductId(productId); + if (CollUtil.isNotEmpty(currentCombinations)) { + ProductActivityItemResponse bargainResponse = new ProductActivityItemResponse(); + bargainResponse.setId(currentCombinations.get(0).getId()); + bargainResponse.setTime(YztDateUtil.getSecondTimestamp(currentCombinations.get(0).getStopTime())); + bargainResponse.setType(Constants.PRODUCT_TYPE_PINGTUAN + ""); + result.put(code, bargainResponse); + } + } + } + return result; + } + + /** + * 获取商品参与的全部活动 + * + * @param storeProduct 当前商品 + * @return 商品所参与的活动 + */ + public List getProductAllActivity(StoreProduct storeProduct) { + HashMap currentActivityList + = getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (StringUtils.isBlank(storeProduct.getActivity())) return new ArrayList<>(); + List activityH5 = new ArrayList<>(); + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + for (Integer code : activityList) { + if (null != currentActivityList.get(code)) { + activityH5.add(currentActivityList.get(code)); + } + } + return activityH5; + } + + /** + * 获取当前商品参与的第一个活动 + * + * @param storeProduct 当前商品信息 + * @return 当前参与的商品活动 + */ + public ProductActivityItemResponse getProductCurrentActivity(StoreProduct storeProduct) { + HashMap currentActivityList + = getActivityByProduct(storeProduct.getId(), storeProduct.getActivity()); + if (StringUtils.isBlank(storeProduct.getActivity())) return null; + List activityList = YztUtil.stringToArrayInt(storeProduct.getActivity()); + + return currentActivityList.get(activityList.get(0)); + } + + /** + * 一号通复制商品转公共商品参数 + * + * @param jsonObject 一号通复制商品 + */ + public static StoreProductRequest onePassCopyTransition(com.alibaba.fastjson.JSONObject jsonObject) { + if (null == jsonObject) return null; + + StoreProductRequest productRequest = new StoreProductRequest(); + StoreProduct product = new StoreProduct(); + + product.setStoreName(jsonObject.getString("store_name")); +// product.setStoreInfo(jsonObject.getString("store_info")); + product.setSliderImage(jsonObject.getString("slider_image")); + product.setImage(jsonObject.getString("image").replace("[", "").replace("\"", "")); + product.setKeyword(jsonObject.getString("store_name")); + product.setCost(jsonObject.getBigDecimal("cost")); + product.setPrice(jsonObject.getBigDecimal("price")); + product.setOtPrice(jsonObject.getBigDecimal("ot_price")); + product.setUnitName(jsonObject.getString("unit_name")); + BeanUtils.copyProperties(product, productRequest); + + productRequest.setContent(jsonObject.getString("description")); + productRequest.setSpecType(true); + + com.alibaba.fastjson.JSONArray props = jsonObject.getJSONArray("items"); + if (null == props || props.size() < 1) { + // 无规格商品 + productRequest.setSpecType(false); + return productRequest; + } + + List spaAttes = new ArrayList<>(); + for (int i = 0; i < props.size(); i++) { + com.alibaba.fastjson.JSONObject pItem = props.getJSONObject(i); + StoreProductAttr spattr = new StoreProductAttr(); + spattr.setAttrName(pItem.getString("value")); + com.alibaba.fastjson.JSONArray values = pItem.getJSONArray("detail"); + List attrValues = new ArrayList<>(); + for (int j = 0; j < values.size(); j++) { + String value = values.getString(j); + attrValues.add(value); + } + spattr.setAttrValues(JSON.toJSONString(attrValues)); + spaAttes.add(spattr); + } + productRequest.setAttr(spaAttes); + return productRequest; + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/exception/GlobalExceptionHandler.java b/fightwine-service/src/main/java/com/yzt/service/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..a039f7b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/exception/GlobalExceptionHandler.java @@ -0,0 +1,166 @@ +package com.yzt.service.exception; + +import com.yzt.common.exception.YztException; +import com.yzt.common.model.exception.ExceptionLog; +import com.yzt.common.result.CommonResult; +import com.yzt.service.service.ExceptionLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.http.HttpStatus; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.jdbc.UncategorizedSQLException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Objects; + +/** + * 全局参数、异常拦截 + * + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + +// private static String REQUESTBODY = "requestBodyMessage"; + + @Autowired + private ExceptionLogService exceptionLogService; + + /** + * 拦截表单参数校验 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler({BindException.class}) + public CommonResult bindException(HttpServletRequest request, BindException e) { + doLog(request, e); + BindingResult bindingResult = e.getBindingResult(); + return CommonResult.failed(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); + } + + /** + * 拦截JSON参数校验 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MethodArgumentNotValidException.class) + public CommonResult bindException(HttpServletRequest request, MethodArgumentNotValidException e) { + doLog(request, e); + BindingResult bindingResult = e.getBindingResult(); + return CommonResult.failed(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); + } + + /** + * 拦截参数类型不正确 + * + * @param e + * @return + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpMediaTypeNotSupportedException.class) + public CommonResult bindException(HttpServletRequest request, HttpMediaTypeNotSupportedException e) { + doLog(request, e); + return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage())); + } + + /** + * 错误SQL语句异常 + */ + @ExceptionHandler(BadSqlGrammarException.class) + public CommonResult handleBadSqlGrammarException(HttpServletRequest request, BadSqlGrammarException e) { + doLog(request, e); + return CommonResult.failed().setMessage("服务器数据异常,请联系管理员"); + } + + /** + * 拦截表示违反数据库的完整性约束导致的异常 + */ + @ExceptionHandler(DataIntegrityViolationException.class) + public CommonResult handleDataIntegrityViolationException(HttpServletRequest request, DataIntegrityViolationException e) { + doLog(request, e); + return CommonResult.failed().setMessage( "服务器数据异常,请联系管理员"); + } + + /** + * 拦截违反数据库的非完整性约束导致的异常,可能也会拦截一些也包括 SQL 语句错误、连接问题、权限问题等各种数据库异常 + */ + @ExceptionHandler(UncategorizedSQLException.class) + public CommonResult handleUncategorizedSqlException(HttpServletRequest request, UncategorizedSQLException e) { + doLog(request, e); + return CommonResult.failed().setMessage("服务器数据异常,请联系管理员"); + } + + //声明要捕获的异常 + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(Exception.class) + @ResponseBody + public CommonResult defaultExceptionHandler(HttpServletRequest request, Exception e) { + doLog(request, e); + e.printStackTrace(); + if (e instanceof YztException) { + return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage())); + } + if (e instanceof MissingServletRequestParameterException) { + return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage())); + } + //未知错误 + return CommonResult.failed().setMessage(e.getMessage()); + } + + /** + * 打印日志 + */ + private void doLog(HttpServletRequest request, Exception e) { + log.error("捕获到异常:", e); + // 加入数据库日志记录 + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + // 异常的详情 + String expDetail = sw.toString(); + + try { + sw.close(); + } catch (IOException ioException) { + log.error("异常日志:关闭异常详情Writer异常"); + } + + // 异常的url + String expUrl = request.getRequestURI(); + + // 异常的参数 暂时不记录入参 +// Object body = request.getAttribute(REQUESTBODY); +// String expParams = ObjectUtil.isNotNull(body) ? body.toString() : ""; + + // 异常的类型 + String expType = e.getClass().getName(); + + // 异常的类名 + StackTraceElement stackTraceElement = e.getStackTrace()[0]; + String expController = stackTraceElement.getClassName(); + + // 异常的方法名 + String expMethod = stackTraceElement.getMethodName(); + + ExceptionLog exceptionLog = new ExceptionLog(); + exceptionLog.setExpUrl(expUrl); +// exceptionLog.setExpParams(expParams); + exceptionLog.setExpParams(""); + exceptionLog.setExpType(expType); + exceptionLog.setExpController(expController); + exceptionLog.setExpMethod(expMethod); + exceptionLog.setExpDetail(expDetail); + + exceptionLogService.save(exceptionLog); + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ActivityStyleMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ActivityStyleMapper.java new file mode 100644 index 0000000..5a65671 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ActivityStyleMapper.java @@ -0,0 +1,15 @@ +package com.yzt.service.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.acticitystyle.ActivityStyle; + +/** + *

+ * 活动样式 Mapper 接口 + *

+ * + */ +public interface ActivityStyleMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ArticleMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ArticleMapper.java new file mode 100644 index 0000000..4d1955b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ArticleMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.article.Article; + +/** + * 文章管理表 Mapper 接口 + * fw_ + */ +public interface ArticleMapper extends BaseMapper
{ + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/CategoryMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/CategoryMapper.java new file mode 100644 index 0000000..75f29ec --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/CategoryMapper.java @@ -0,0 +1,11 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.category.Category; + +/** + * 分类表 Mapper 接口 + * fw_ + */ +public interface CategoryMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ExceptionLogMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ExceptionLogMapper.java new file mode 100644 index 0000000..cd83bc3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ExceptionLogMapper.java @@ -0,0 +1,14 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.exception.ExceptionLog; + +/** + *

+ * 异常信息表 Mapper 接口 + *

+ * + */ +public interface ExceptionLogMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ExpressMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ExpressMapper.java new file mode 100644 index 0000000..6b90df8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ExpressMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.express.Express; + +/** + * 快递公司表 Mapper 接口 + * fw_ + */ +public interface ExpressMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesFreeMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesFreeMapper.java new file mode 100644 index 0000000..a9acbab --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesFreeMapper.java @@ -0,0 +1,16 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.express.ShippingTemplatesFree; +import com.yzt.common.response.ShippingTemplatesFreeResponse; + +import java.util.List; + +/** + * Mapper 接口 + * + */ +public interface ShippingTemplatesFreeMapper extends BaseMapper { + + List getListGroup(Integer tempId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesMapper.java new file mode 100644 index 0000000..079ad02 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.express.ShippingTemplates; + +/** + * Mapper 接口 + * fw_ + */ +public interface ShippingTemplatesMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesRegionMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesRegionMapper.java new file mode 100644 index 0000000..9609cee --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/ShippingTemplatesRegionMapper.java @@ -0,0 +1,16 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.express.ShippingTemplatesRegion; +import com.yzt.common.response.ShippingTemplatesRegionResponse; + +import java.util.List; + +/** + * Mapper 接口 + * fw_ + */ +public interface ShippingTemplatesRegionMapper extends BaseMapper { + + List getListGroup(Integer tempId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SmsRecordMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SmsRecordMapper.java new file mode 100644 index 0000000..d3c04ed --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SmsRecordMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.sms.SmsRecord; + +/** + * 短信发送记录表 Mapper 接口 + * + */ +public interface SmsRecordMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SmsTemplateMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SmsTemplateMapper.java new file mode 100644 index 0000000..e9ae5c7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SmsTemplateMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.sms.SmsTemplate; + +/** + * 短信模板表 Mapper 接口 + * + */ +public interface SmsTemplateMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainMapper.java new file mode 100644 index 0000000..0494a7d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.bargain.StoreBargain; + +/** + * 砍价表 Mapper 接口 + * + */ +public interface StoreBargainMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserHelpMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserHelpMapper.java new file mode 100644 index 0000000..d608f0d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserHelpMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.bargain.StoreBargainUserHelp; + +/** + * 砍价用户帮助表 Mapper 接口 + * + */ +public interface StoreBargainUserHelpMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserMapper.java new file mode 100644 index 0000000..26898fa --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreBargainUserMapper.java @@ -0,0 +1,15 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.bargain.StoreBargainUser; + +import java.util.List; + +/** + * 用户参与砍价表 Mapper 接口 + * + */ +public interface StoreBargainUserMapper extends BaseMapper { + + List selectHeaderList(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCartMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCartMapper.java new file mode 100644 index 0000000..4b954a9 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCartMapper.java @@ -0,0 +1,17 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.cat.StoreCart; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 购物车表 Mapper 接口 + * + */ +public interface StoreCartMapper extends BaseMapper { + + @Select("SELECT COUNT(id) FROM fw_store_cart WHERE uid = #{uid} AND status = 1") + Integer getCartItemCount(@Param("uid") Integer uid); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCombinationMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCombinationMapper.java new file mode 100644 index 0000000..1035aad --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCombinationMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.combination.StoreCombination; + +/** + * 拼团商品表 Mapper 接口 + * + */ +public interface StoreCombinationMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponMapper.java new file mode 100644 index 0000000..037cef5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.coupon.StoreCoupon; + +/** + * 优惠券表 Mapper 接口 + * + */ +public interface StoreCouponMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponUserMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponUserMapper.java new file mode 100644 index 0000000..b684601 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreCouponUserMapper.java @@ -0,0 +1,18 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.coupon.StoreCouponUser; + +import java.util.List; +import java.util.Map; + +/** + * 优惠券记录表 Mapper 接口 + * + */ +public interface StoreCouponUserMapper extends BaseMapper { + + List getListByPreOrderNo(Map map); + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInfoMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInfoMapper.java new file mode 100644 index 0000000..204e835 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInfoMapper.java @@ -0,0 +1,28 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.order.StoreOrderInfo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; + +/** + * 订单购物详情表 Mapper 接口 + * + */ +public interface StoreOrderInfoMapper extends BaseMapper { + + /** + * 根据时间、商品id获取销售件数 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + */ + Integer getSalesNumByDateAndProductId(@Param("date") String date, @Param("proId") Integer proId); + + /** + * 根据时间、商品id获取销售额 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + */ + BigDecimal getSalesByDateAndProductId(@Param("date") String date, @Param("proId") Integer proId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInvoiceMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInvoiceMapper.java new file mode 100644 index 0000000..87f90e1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderInvoiceMapper.java @@ -0,0 +1,13 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.order.StoreOrderInvoice; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单发票Mapper接口 + */ +@Mapper +public interface StoreOrderInvoiceMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderMapper.java new file mode 100644 index 0000000..23acc03 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderMapper.java @@ -0,0 +1,66 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.request.StoreDateRangeSqlPram; +import com.yzt.common.request.StoreOrderStaticsticsRequest; +import com.yzt.common.response.OrderBrokerageData; +import com.yzt.common.response.StoreOrderStatisticsChartItemResponse; +import com.yzt.common.response.StoreStaffDetail; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 订单表 Mapper 接口 + * + */ +public interface StoreOrderMapper extends BaseMapper { + + /** + * 订单总金额 + */ + BigDecimal getTotalPrice(String where); + + /** + * 退款总金额 + */ + BigDecimal getRefundPrice(String where); + + /** + * 获取退款总单数 + */ + Integer getRefundTotal(String where); + + List findFrontList(Map searchMap); + + /** + * 核销详情 月数据 + * @param request 分页和日期 + * @return 月数据 + */ + List getOrderVerificationDetail(StoreOrderStaticsticsRequest request); + + /** + * 订单统计详情 price + * @param pram 时间区间参数 + * @return 月数据 + */ + List getOrderStatisticsPriceDetail(StoreDateRangeSqlPram pram); + + /** + * 订单统计详情 订单量 + * @param pram 时间区间参数 + * @return 月数据 + */ + List getOrderStatisticsOrderCountDetail(StoreDateRangeSqlPram pram); + + /** + * 获取佣金相关数据 + * @param uid 用户uid + * @param spreadId 推广人uid + */ + OrderBrokerageData getBrokerageData(@Param("uid") Integer uid, @Param("spreadId") Integer spreadId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderStatusMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderStatusMapper.java new file mode 100644 index 0000000..10ae616 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreOrderStatusMapper.java @@ -0,0 +1,22 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.order.StoreOrderStatus; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; + +/** + * 订单操作记录表 Mapper 接口 + * + */ +public interface StoreOrderStatusMapper extends BaseMapper { + + /** + * 通过日期获取订单退款金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getRefundOrderAmountByDate(@Param("date") String date); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StorePinkMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StorePinkMapper.java new file mode 100644 index 0000000..d3009f5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StorePinkMapper.java @@ -0,0 +1,15 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.combination.StorePink; + +import java.util.List; + +/** + * 拼团表 Mapper 接口 + * + */ +public interface StorePinkMapper extends BaseMapper { + + List selectSizePink(Integer size); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrMapper.java new file mode 100644 index 0000000..5224d1e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductAttr; + +/** + * 商品属性表 Mapper 接口 + * + */ +public interface StoreProductAttrMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrResultMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrResultMapper.java new file mode 100644 index 0000000..e0697ec --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrResultMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductAttrResult; + +/** + * 商品属性详情表 Mapper 接口 + * + */ +public interface StoreProductAttrResultMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrValueMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrValueMapper.java new file mode 100644 index 0000000..d9cd5f7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductAttrValueMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductAttrValue; + +/** + * 商品属性值表 Mapper 接口 + * + */ +public interface StoreProductAttrValueMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductCouponMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductCouponMapper.java new file mode 100644 index 0000000..a86a8be --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductCouponMapper.java @@ -0,0 +1,13 @@ +package com.yzt.service.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductCoupon; + +/** + * Mapper 接口 + * + */ +public interface StoreProductCouponMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductDescriptionMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductDescriptionMapper.java new file mode 100644 index 0000000..1cd5df4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductDescriptionMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductDescription; + +/** + * Mapper 接口 + * + */ +public interface StoreProductDescriptionMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductLogMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductLogMapper.java new file mode 100644 index 0000000..1a288fb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductLogMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.log.StoreProductLog; + +/** + * 商品统计 Mapper 接口 + * + */ +public interface StoreProductLogMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductMapper.java new file mode 100644 index 0000000..9ca484d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProduct; + +/** + * 商品表 Mapper 接口 + * + */ +public interface StoreProductMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRelationMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRelationMapper.java new file mode 100644 index 0000000..7a41023 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRelationMapper.java @@ -0,0 +1,20 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductRelation; +import com.yzt.common.response.UserRelationResponse; + +import java.util.List; + +/** + * 商品点赞和收藏表 Mapper 接口 + * + */ +public interface StoreProductRelationMapper extends BaseMapper { + + /** + * 用户收藏列表 + * @param uid 用户uid + */ + List getUserList(Integer uid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductReplyMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductReplyMapper.java new file mode 100644 index 0000000..846eed0 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductReplyMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductReply; + +/** + * 评论表 Mapper 接口 + * + */ +public interface StoreProductReplyMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRuleMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRuleMapper.java new file mode 100644 index 0000000..acc289c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreProductRuleMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.product.StoreProductRule; + +/** + * 商品规则值(规格)表 Mapper 接口 + * + */ +public interface StoreProductRuleMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMangerMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMangerMapper.java new file mode 100644 index 0000000..541e0cb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMangerMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.seckill.StoreSeckillManger; + +/** + * Mapper 接口 + * + */ +public interface StoreSeckillMangerMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMapper.java new file mode 100644 index 0000000..9c8b9dc --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/StoreSeckillMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.seckill.StoreSeckill; + +/** + * 商品秒杀产品表 Mapper 接口 + * + */ +public interface StoreSeckillMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAdminMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAdminMapper.java new file mode 100644 index 0000000..5bd36c7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAdminMapper.java @@ -0,0 +1,11 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemAdmin; + +/** + * 后台管理员表 Mapper 接口 + * + */ +public interface SystemAdminMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAttachmentMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAttachmentMapper.java new file mode 100644 index 0000000..f4eca13 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemAttachmentMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemAttachment; + +/** + * 附件管理表 Mapper 接口 + * + */ +public interface SystemAttachmentMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemBankMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemBankMapper.java new file mode 100644 index 0000000..04cf392 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemBankMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemBank; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +public interface SystemBankMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemCityMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemCityMapper.java new file mode 100644 index 0000000..d8b8040 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemCityMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemCity; + +/** + * 城市表 Mapper 接口 + * + */ +public interface SystemCityMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemConfigMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemConfigMapper.java new file mode 100644 index 0000000..81a24b3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemConfigMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemConfig; + +/** + * 配置表 Mapper 接口 + * + */ +public interface SystemConfigMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemFormTempMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemFormTempMapper.java new file mode 100644 index 0000000..98a0b15 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemFormTempMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemFormTemp; + +/** + * 表单模板 Mapper 接口 + * + */ +public interface SystemFormTempMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupDataMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupDataMapper.java new file mode 100644 index 0000000..5a254e5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupDataMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemGroupData; + +/** + * 组合数据详情表 Mapper 接口 + * + */ +public interface SystemGroupDataMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupMapper.java new file mode 100644 index 0000000..ca57cf9 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemGroupMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemGroup; + +/** + * 组合数据表 Mapper 接口 + * + */ +public interface SystemGroupMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemMenuMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemMenuMapper.java new file mode 100644 index 0000000..c7e139b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemMenuMapper.java @@ -0,0 +1,29 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemMenu; + +import java.util.List; + +/** + *

+ * 系统菜单表 Mapper 接口 + *

+ * + */ +public interface SystemMenuMapper extends BaseMapper { + + /** + * 通过角色数据获取权限 + * @param userId 用户id + * @return List + */ + List findPermissionByUserId(Integer userId); + + /** + * 获取用户路由 + * @param userId 用户id + * @return List + */ + List getMenusByUserId(Integer userId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemNotificationMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemNotificationMapper.java new file mode 100644 index 0000000..37b7cbc --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemNotificationMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemNotification; + +/** + * 通知设置表 Mapper 接口 + * + */ +public interface SystemNotificationMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMapper.java new file mode 100644 index 0000000..01eb9cd --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemRole; + +/** + * 身份管理表 Mapper 接口 + * + */ +public interface SystemRoleMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMenuMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMenuMapper.java new file mode 100644 index 0000000..a86d6cb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemRoleMenuMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemRoleMenu; + +/** + * 角色菜单关联表 Mapper 接口 + * + */ +public interface SystemRoleMenuMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreMapper.java new file mode 100644 index 0000000..f0872a1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreMapper.java @@ -0,0 +1,18 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.request.StoreNearRequest; +import com.yzt.common.vo.SystemStoreNearVo; + +import java.util.List; + +/** + * 门店自提 Mapper 接口 + * + */ +public interface SystemStoreMapper extends BaseMapper { + + List getNearList(StoreNearRequest request); +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreStaffMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreStaffMapper.java new file mode 100644 index 0000000..009c849 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemStoreStaffMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemStoreStaff; + +/** + * 门店店员表 Mapper 接口 + * + */ +public interface SystemStoreStaffMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/SystemUserLevelMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemUserLevelMapper.java new file mode 100644 index 0000000..03554a2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/SystemUserLevelMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.SystemUserLevel; + +/** + * 设置用户等级表 Mapper 接口 + * + */ +public interface SystemUserLevelMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/TemplateMessageMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/TemplateMessageMapper.java new file mode 100644 index 0000000..6026e83 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/TemplateMessageMapper.java @@ -0,0 +1,13 @@ +package com.yzt.service.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.TemplateMessage; + +/** + * 微信模板 Mapper 接口 + * + */ +public interface TemplateMessageMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/TenantMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/TenantMapper.java new file mode 100644 index 0000000..540e8fb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/TenantMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.system.Tenant; + +/** + * @Author: pengsz + * @Date: 2025/11/11 + * @Description: + */ +public interface TenantMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserAddressMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserAddressMapper.java new file mode 100644 index 0000000..e798364 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserAddressMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserAddress; + +/** + * 用户地址表 Mapper 接口 + * + */ +public interface UserAddressMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserBankCardMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBankCardMapper.java new file mode 100644 index 0000000..4edecb6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBankCardMapper.java @@ -0,0 +1,13 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserBankCard; + +/** + * Mapper 接口 + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ +public interface UserBankCardMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserBillMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBillMapper.java new file mode 100644 index 0000000..cdcaff2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBillMapper.java @@ -0,0 +1,17 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.response.UserBillResponse; + +import java.util.List; +import java.util.Map; + +/** + * 用户账单表 Mapper 接口 + * + */ +public interface UserBillMapper extends BaseMapper { + + List fundMonitoring(Map map); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserBrokerageRecordMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBrokerageRecordMapper.java new file mode 100644 index 0000000..7d98527 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserBrokerageRecordMapper.java @@ -0,0 +1,21 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserBrokerageRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户佣金记录表 Mapper 接口 + * + */ +public interface UserBrokerageRecordMapper extends BaseMapper { + + /** + * 获取佣金明细列表根据uid(按link_id和link_type分组统计) + * @param uid 用户ID + * @return 分组统计后的佣金记录列表 + */ + List findDetailListByUidGrouped(@Param("uid") Integer uid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserExperienceRecordMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserExperienceRecordMapper.java new file mode 100644 index 0000000..7476389 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserExperienceRecordMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserExperienceRecord; + +/** + * 用户经验记录表 Mapper 接口 + * + */ +public interface UserExperienceRecordMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserExtractMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserExtractMapper.java new file mode 100644 index 0000000..d6c9990 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserExtractMapper.java @@ -0,0 +1,11 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.finance.UserExtract; + +/** + * 用户提现表 Mapper 接口 + * fw_ + */ +public interface UserExtractMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserFundsMonitorMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserFundsMonitorMapper.java new file mode 100644 index 0000000..18b48cf --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserFundsMonitorMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.vo.UserFundsMonitor; + +/** + * 用户充值表 Mapper 接口 + * fw_ + */ +public interface UserFundsMonitorMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserGroupMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserGroupMapper.java new file mode 100644 index 0000000..abbb582 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserGroupMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserGroup; + +/** + * 用户分组表 Mapper 接口 + * + */ +public interface UserGroupMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserIntegralRecordMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserIntegralRecordMapper.java new file mode 100644 index 0000000..dd0ab12 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserIntegralRecordMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserIntegralRecord; + +/** + * 用户积分记录表 Mapper 接口 + * + */ +public interface UserIntegralRecordMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelMapper.java new file mode 100644 index 0000000..41656a6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserLevel; + +/** + * 用户等级记录表 Mapper 接口 + * + */ +public interface UserLevelMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelUpgradeAuditMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelUpgradeAuditMapper.java new file mode 100644 index 0000000..1fa1cdb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserLevelUpgradeAuditMapper.java @@ -0,0 +1,14 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserLevelUpgradeAudit; +import org.apache.ibatis.annotations.Mapper; + +/** + * @Author: pengsz + * @Date: 2025/11/22 + * @Description: + */ +@Mapper +public interface UserLevelUpgradeAuditMapper extends BaseMapper { +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserMapper.java new file mode 100644 index 0000000..9541cc7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserMapper.java @@ -0,0 +1,19 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.User; +import com.yzt.common.response.UserSpreadPeopleItemResponse; + +import java.util.List; +import java.util.Map; + +/** + * 用户表 Mapper 接口 + * + */ +public interface UserMapper extends BaseMapper { + + List getSpreadPeopleList(Map map); + + List findAdminList(Map map); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeApplicationMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeApplicationMapper.java new file mode 100644 index 0000000..4cb4144 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeApplicationMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserRechargeApplication; + +/** + * @Author: pengsz + * @Date: 2025/11/18 + * @Description: + */ +public interface UserRechargeApplicationMapper extends BaseMapper { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeMapper.java new file mode 100644 index 0000000..9afe0ff --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserRechargeMapper.java @@ -0,0 +1,26 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.finance.UserRecharge; + +import java.math.BigDecimal; + +/** + * 用户充值表 Mapper 接口 + * fw_ + */ +public interface UserRechargeMapper extends BaseMapper { + + /** + * 根据类型获取该类型充值总金额 + * @param type 充值类型 + * @return 该类型充值总金额 + */ + BigDecimal getSumByType(String type); + + /** + * 获取退款总金额 + * @return 退款总金额 + */ + BigDecimal getSumByRefund(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserSignMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserSignMapper.java new file mode 100644 index 0000000..615c227 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserSignMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserSign; + +/** + * 签到记录表 Mapper 接口 + * + */ +public interface UserSignMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserTagMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserTagMapper.java new file mode 100644 index 0000000..b1a60f3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserTagMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserTag; + +/** + * 用户分组表 Mapper 接口 + * + */ +public interface UserTagMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserTokenMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserTokenMapper.java new file mode 100644 index 0000000..f65a2df --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserTokenMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.user.UserToken; + +/** + * Mapper 接口 + * + */ +public interface UserTokenMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/UserVisitRecordMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/UserVisitRecordMapper.java new file mode 100644 index 0000000..54c7905 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/UserVisitRecordMapper.java @@ -0,0 +1,27 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.record.UserVisitRecord; +import org.apache.ibatis.annotations.Param; + +/** + * 用户访问记录表 Mapper 接口 + * + */ +public interface UserVisitRecordMapper extends BaseMapper { + + /** + * 获取活跃用户数 + * @param date 日期 + * @return Integer + */ + Integer getActiveUserNumByDate(@Param("date") String date); + + /** + * 通过时间段获取活跃用户数 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getActiveUserNumByPeriod(@Param("startDate") String startDate, @Param("endDate") String endDate); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatCallbackMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatCallbackMapper.java new file mode 100644 index 0000000..58af44b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatCallbackMapper.java @@ -0,0 +1,14 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatCallback; + +/** + *

+ * 微信回调表 Mapper 接口 + *

+ * + */ +public interface WechatCallbackMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatExceptionsMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatExceptionsMapper.java new file mode 100644 index 0000000..aa83936 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatExceptionsMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatExceptions; + +/** + * 微信异常表 Mapper 接口 + * fw_ + */ +public interface WechatExceptionsMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatMerchantConfigMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatMerchantConfigMapper.java new file mode 100644 index 0000000..b13620d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatMerchantConfigMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatMerchantConfig; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +public interface WechatMerchantConfigMapper extends BaseMapper { +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatPayInfoMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatPayInfoMapper.java new file mode 100644 index 0000000..a276d1a --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatPayInfoMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatPayInfo; + +/** + * 微信订单表 Mapper 接口 + * fw_ + */ +public interface WechatPayInfoMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramMyTempMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramMyTempMapper.java new file mode 100644 index 0000000..56b4d9e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramMyTempMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatProgramMyTemp; + +/** + * 小程序我的模板 Mapper 接口 + * + */ +public interface WechatProgramMyTempMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramPublicTempMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramPublicTempMapper.java new file mode 100644 index 0000000..e212aac --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatProgramPublicTempMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatProgramPublicTemp; + +/** + * Mapper 接口 + * + */ +public interface WechatProgramPublicTempMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatQrcodeMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatQrcodeMapper.java new file mode 100644 index 0000000..dcf778b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatQrcodeMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatQrcode; + +/** + * 微信二维码管理表 Mapper 接口 + * + */ +public interface WechatQrcodeMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/WechatReplyMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatReplyMapper.java new file mode 100644 index 0000000..1a53de2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/WechatReplyMapper.java @@ -0,0 +1,12 @@ +package com.yzt.service.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.wechat.WechatReply; + +/** + * 微信关键字回复表 Mapper 接口 + * + */ +public interface WechatReplyMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageCategoryMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageCategoryMapper.java new file mode 100644 index 0000000..1f9c6f3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageCategoryMapper.java @@ -0,0 +1,15 @@ +package com.yzt.service.mapper.page; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.page.PageCategory; + +/** + *

+ * 页面链接分类 Mapper 接口 + *

+ * + */ +public interface PageCategoryMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageDiyMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageDiyMapper.java new file mode 100644 index 0000000..04c12fe --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageDiyMapper.java @@ -0,0 +1,14 @@ +package com.yzt.service.mapper.page; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.page.PageDiy; + +/** + *

+ * DIY数据表 Mapper 接口 + *

+ * + */ +public interface PageDiyMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageLinkMapper.java b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageLinkMapper.java new file mode 100644 index 0000000..e859bb1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/mapper/page/PageLinkMapper.java @@ -0,0 +1,15 @@ +package com.yzt.service.mapper.page; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yzt.common.model.page.PageLink; + +/** + *

+ * 页面链接 Mapper 接口 + *

+ * + */ +public interface PageLinkMapper extends BaseMapper { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePlugin.java b/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePlugin.java new file mode 100644 index 0000000..b1cacc1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePlugin.java @@ -0,0 +1,43 @@ +package com.yzt.service.plugin.file; + +import com.yzt.common.enums.OssEnum; + +import java.io.InputStream; +import java.util.List; + +/** + * 文件插件接口 + * + */ +public interface FilePlugin { + /** + * 插件名称 + */ + OssEnum pluginName(); + + /** + * 文件路径上传 + * + * @param filePath + * @param key + * @return + */ + String pathUpload(String filePath, String key); + + /** + * 文件流上传 + * + * @param inputStream + * @param key + * @return + */ + String inputStreamUpload(InputStream inputStream, String key); + + + /** + * 删除文件 + * + * @param key + */ + void deleteFile(List key); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePluginFactory.java b/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePluginFactory.java new file mode 100644 index 0000000..224eb88 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/file/FilePluginFactory.java @@ -0,0 +1,54 @@ +package com.yzt.service.plugin.file; + +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.enums.OssEnum; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.OssSetting; +import com.yzt.service.plugin.file.impl.AliFilePlugin; +import com.yzt.service.plugin.file.impl.TencentFilePlugin; +import com.yzt.service.service.SystemConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 文件服务抽象工厂 直接返回操作类 + * + */ +@Slf4j +@Component +public class FilePluginFactory { + @Autowired + private SystemConfigService systemConfigService; + + public FilePlugin filePlugin() { + OssSetting ossSetting = new OssSetting(); + try { + ossSetting.setType(OssEnum.getName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_UPLOAD_TYPE))); + switch (OssEnum.valueOf(ossSetting.getType())) { + case ALI_OSS: + ossSetting.setAliyunOSSEndPoint(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_UPLOAD_URL)); + ossSetting.setAliyunOSSAccessKeyId(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_ACCESS_KEY)); + ossSetting.setAliyunOSSAccessKeySecret(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_SECRET_KEY)); + ossSetting.setAliyunOSSBucketName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_STORAGE_NAME)); + return new AliFilePlugin(ossSetting); + case MINIO: + return null; + case HUAWEI_OBS: + return null; + case TENCENT_COS: + ossSetting.setTencentCOSEndPoint(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_UPLOAD_URL)); + ossSetting.setTencentCOSSecretId(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_ACCESS_KEY)); + ossSetting.setTencentCOSSecretKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_SECRET_KEY)); + ossSetting.setTencentCOSBucket(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_STORAGE_NAME)); + ossSetting.setTencentCOSRegion(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_STORAGE_REGION)); + return new TencentFilePlugin(ossSetting); + default: + throw new YztException("文件插件工厂异常"); + } + } catch (Exception e) { + log.error("文件插件工厂异常", e); + throw new YztException("文件插件工厂异常"); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/AliFilePlugin.java b/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/AliFilePlugin.java new file mode 100644 index 0000000..39da9d4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/AliFilePlugin.java @@ -0,0 +1,145 @@ +package com.yzt.service.plugin.file.impl; + +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.DeleteObjectsRequest; +import com.aliyun.oss.model.ObjectMetadata; +import com.yzt.common.enums.OssEnum; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.OssSetting; +import com.yzt.service.plugin.file.FilePlugin; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.util.List; + +/** + * 阿里oss 文件操作 + * + */ +@Slf4j +public class AliFilePlugin implements FilePlugin { + private OssSetting ossSetting; + + public AliFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } + + @Override + public OssEnum pluginName() { + return OssEnum.ALI_OSS; + } + + /** + * 获取oss client + * + * @return + */ + private OSS getOssClient() { + return new OSSClientBuilder().build( + ossSetting.getAliyunOSSEndPoint(), + ossSetting.getAliyunOSSAccessKeyId(), + ossSetting.getAliyunOSSAccessKeySecret()); + } + + /** + * 获取配置前缀 + * + * @return + */ + private String getUrlPrefix() { + return "https://" + ossSetting.getAliyunOSSBucketName() + "." + ossSetting.getAliyunOSSEndPoint() + "/"; + } + + @Override + public String pathUpload(String filePath, String key) { + OSS ossClient = getOssClient(); + try { + ossClient.putObject(ossSetting.getAliyunOSSBucketName(), key, new File(filePath)); + } catch (OSSException oe) { + log.error("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + log.error("Error Message: " + oe.getErrorMessage()); + log.error("Error Code: " + oe.getErrorCode()); + log.error("Request ID: " + oe.getRequestId()); + log.error("Host ID: " + oe.getHostId()); + throw new YztException("上传文件到OSS失败"); + } catch (ClientException ce) { + log.error("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + log.error("Error Message: " + ce.getMessage(), ce); + throw new YztException("上传文件到OSS失败"); + } finally { + /* + * Do not forget to shut down the client finally to release all allocated resources. + */ + ossClient.shutdown(); + } + ossClient.shutdown(); + return getUrlPrefix() + key; + } + + @Override + public String inputStreamUpload(InputStream inputStream, String key) { + OSS ossClient = getOssClient(); + try { + ObjectMetadata meta = new ObjectMetadata(); + meta.setContentType("image/jpg"); + ossClient.putObject(ossSetting.getAliyunOSSBucketName(), key, inputStream, meta); + } catch (OSSException oe) { + log.error("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + log.error("Error Message: " + oe.getErrorMessage()); + log.error("Error Code: " + oe.getErrorCode()); + log.error("Request ID: " + oe.getRequestId()); + log.error("Host ID: " + oe.getHostId()); + throw new YztException("上传文件到OSS失败"); + } catch (ClientException ce) { + log.error("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + log.error("Error Message: " + ce.getMessage()); + throw new YztException("上传文件到OSS失败"); + } finally { + /* + * Do not forget to shut down the client finally to release all allocated resources. + */ + ossClient.shutdown(); + } + ossClient.shutdown(); + return getUrlPrefix() + key; + } + + @Override + public void deleteFile(List key) { + OSS ossClient = getOssClient(); + + try { + ossClient.deleteObjects( + new DeleteObjectsRequest(ossSetting.getAliyunOSSBucketName()).withKeys(key)); + } catch (OSSException oe) { + log.error("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + log.error("Error Message: " + oe.getErrorMessage()); + log.error("Error Code: " + oe.getErrorCode()); + log.error("Request ID: " + oe.getRequestId()); + log.error("Host ID: " + oe.getHostId()); + throw new YztException("上传文件到OSS失败"); + } catch (ClientException ce) { + log.error("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + log.error("Error Message: " + ce.getMessage()); + throw new YztException("上传文件到OSS失败"); + } finally { + /* + * Do not forget to shut down the client finally to release all allocated resources. + */ + ossClient.shutdown(); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/TencentFilePlugin.java b/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/TencentFilePlugin.java new file mode 100644 index 0000000..dd85c36 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/file/impl/TencentFilePlugin.java @@ -0,0 +1,122 @@ +package com.yzt.service.plugin.file.impl; + +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.exception.CosServiceException; +import com.qcloud.cos.http.HttpProtocol; +import com.qcloud.cos.model.DeleteObjectsRequest; +import com.qcloud.cos.model.ObjectMetadata; +import com.qcloud.cos.region.Region; +import com.yzt.common.enums.OssEnum; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.OssSetting; +import com.yzt.service.plugin.file.FilePlugin; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * 腾讯cos 文件操作 + * + */ +@Slf4j +public class TencentFilePlugin implements FilePlugin { + private OssSetting ossSetting; + + public TencentFilePlugin(OssSetting ossSetting) { + this.ossSetting = ossSetting; + } + + /** + * 获取oss client + * + * @return + */ + private COSClient getCOSClient() { + // 1 初始化用户身份信息(secretId, secretKey)。 + COSCredentials cred = new BasicCOSCredentials(ossSetting.getTencentCOSSecretId(), ossSetting.getTencentCOSSecretKey()); + // 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224 + ClientConfig clientConfig = new ClientConfig(new Region(ossSetting.getTencentCOSRegion())); + // 这里建议设置使用 https 协议 + clientConfig.setHttpProtocol(HttpProtocol.https); + // 3 生成 cos 客户端。 + return new COSClient(cred, clientConfig); + } + + @Override + public OssEnum pluginName() { + return OssEnum.TENCENT_COS; + } + + /** + * 获取配置前缀 + * + * @return + */ + private String getUrlPrefix() { + return "https://" + ossSetting.getTencentCOSBucket() + ".cos." + ossSetting.getTencentCOSRegion() + ".myqcloud.com/"; + } + + @Override + public String pathUpload(String filePath, String key) { + COSClient cosClient = getCOSClient(); + try { + cosClient.putObject(ossSetting.getTencentCOSBucket(), key, new File(filePath)); + } catch (CosServiceException oe) { + log.error("上传文件到OSS失败", oe); + throw new YztException("上传文件到OSS失败"); + } catch (CosClientException ce) { + log.error("上传文件到OSS失败", ce); + throw new YztException("上传文件到OSS失败"); + } finally { + cosClient.shutdown(); + } + return getUrlPrefix() + key; + } + + @Override + public String inputStreamUpload(InputStream inputStream, String key) { + COSClient cosClient = getCOSClient(); + try { + ObjectMetadata meta = new ObjectMetadata(); + meta.setContentType("image/jpg"); + cosClient.putObject(ossSetting.getTencentCOSBucket(), key, inputStream, meta); + } catch (CosServiceException oe) { + log.error("上传文件到OSS失败", oe); + throw new YztException("上传文件到OSS失败"); + } catch (CosClientException ce) { + log.error("上传文件到OSS失败", ce); + throw new YztException("上传文件到OSS失败"); + } finally { + cosClient.shutdown(); + } + return getUrlPrefix() + key; + } + + @Override + public void deleteFile(List keys) { + COSClient cosClient = getCOSClient(); + + try { + List delObjects = new ArrayList<>(); + for (String key : keys) { + delObjects.add(new DeleteObjectsRequest.KeyVersion(key)); + } + cosClient.deleteObjects(new DeleteObjectsRequest(ossSetting.getTencentCOSBucket()).withKeys(delObjects)); + } catch (CosServiceException oe) { + log.error("删除文件失败", oe); + throw new YztException("上传文件到OSS失败"); + } catch (CosClientException ce) { + log.error("删除文件失败", ce); + throw new YztException("上传文件到OSS失败"); + } finally { + cosClient.shutdown(); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPlugin.java b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPlugin.java new file mode 100644 index 0000000..b65255c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPlugin.java @@ -0,0 +1,73 @@ +package com.yzt.service.plugin.sms; + +import com.yzt.common.enums.SmsEnum; + +import java.util.List; +import java.util.Map; + +/** + * 短信插件接口 + * + * @author Bulbasaur + * @since 2023-02-16 + */ +public interface SmsPlugin { + + /** + * 插件名称 + */ + SmsEnum pluginName(); + + /** + * 短信发送 + * + * @param mobile 接收手机号 + * @param param 参数 + */ + boolean sendSmsCode(String mobile, Map param); + + /** + * 短信批量发送 + * + * @param mobile 接收手机号 + * @param signName 签名 + * @param templateCode 模版code + */ + void sendBatchSms(String signName, List mobile, String templateCode); + + + /** + * 删除短信签名 + * + * @param signName 签名名称 + * @throws Exception 阿里短信签名错误 + */ + void deleteSmsSign(String signName) throws Exception; + + /** + * 查询短信签名申请状态 + * + * @param signName 签名名称 + * @return 短信签名申请状态 + * @throws Exception 阿里短信签名错误 + */ + Map querySmsSign(String signName) throws Exception; + + + /** + * 查看短信模板 + * + * @param templateCode 短信模板CODE + * @return 短信模板 + * @throws Exception 阿里短信签名错误 + */ + Map querySmsTemplate(String templateCode) throws Exception; + + /** + * 删除短信模板 + * + * @param templateCode 短信模板CODE + * @throws Exception 阿里短信签名错误 + */ + void deleteSmsTemplate(String templateCode) throws Exception; +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPluginFactory.java b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPluginFactory.java new file mode 100644 index 0000000..03c7214 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/SmsPluginFactory.java @@ -0,0 +1,58 @@ +package com.yzt.service.plugin.sms; + +import cn.hutool.json.JSONUtil; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.enums.SmsEnum; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SmsSetting; +import com.yzt.service.plugin.sms.impl.TencentSmsPlugin; +import com.yzt.service.service.SystemConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 短信服务抽象工厂 直接返回操作类 + * + */ +@Slf4j +@Component +public class SmsPluginFactory { + + @Autowired + private SystemConfigService systemConfigService; + + + /** + * 获取oss client + * + * @return + */ + public SmsPlugin smsPlugin() { + + SmsSetting smsSetting = new SmsSetting(); + try { + smsSetting.setType(SmsEnum.getName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_SMS_TYPE))); + + switch (SmsEnum.valueOf(smsSetting.getType())) { + + case ALI: + return null; + case TENCENT: + smsSetting.setTencentSecretId(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_ACCESS_KEY)); + smsSetting.setTencentSecretKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_SECRET_KEY)); + smsSetting.setTencentSdkAppId(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_SMS_TEMPLATE_APPID)); + smsSetting.setRegisterTemplateCode(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_SMS_TEMPLATE_ID)); + smsSetting.setTencentSignName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_TX_SMS_SIGN_NAME)); + return new TencentSmsPlugin(smsSetting); + case HUAWEI: + return null; + default: + throw new YztException("短信插件工厂异常"); + } + } catch (Exception e) { + log.error("短信插件工厂异常", e); + throw new YztException("短信插件工厂异常"); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/plugin/sms/impl/TencentSmsPlugin.java b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/impl/TencentSmsPlugin.java new file mode 100644 index 0000000..5db7b07 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/plugin/sms/impl/TencentSmsPlugin.java @@ -0,0 +1,231 @@ +package com.yzt.service.plugin.sms.impl; + +import cn.hutool.core.convert.Convert; +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.common.profile.HttpProfile; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.ocr.v20181119.OcrClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import com.yzt.common.enums.SmsEnum; +import com.yzt.common.model.system.SmsSetting; +import com.yzt.service.plugin.sms.SmsPlugin; +import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; + +/** + * 腾讯云短信插件 + * + */ +@Slf4j +public class TencentSmsPlugin implements SmsPlugin { + + private SmsSetting smsSetting; + + public TencentSmsPlugin(SmsSetting smsSetting) { + this.smsSetting = smsSetting; + } + + @Override + public SmsEnum pluginName() { + return SmsEnum.TENCENT; + } + + + @Override + public boolean sendSmsCode(String mobile, Map param) { + try { + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + req.setSmsSdkAppId(smsSetting.getTencentSdkAppId()); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + req.setSignName(smsSetting.getTencentSignName()); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + req.setTemplateId(smsSetting.getRegisterTemplateCode()); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + req.setTemplateParamSet(param.values().toArray(new String[0])); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + String[] phoneNumberSet = {"+86" + mobile}; + req.setPhoneNumberSet(phoneNumberSet); + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + String sessionContext = ""; + req.setSessionContext(sessionContext); + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String extendCode = ""; + req.setExtendCode(extendCode); + + /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String senderid = ""; + req.setSenderId(senderid); + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = getClient().SendSms(req); + + // 输出json格式的字符串回包 + log.info("发送短信响应: {}", SendSmsResponse.toJsonString(res)); + String code = res.getSendStatusSet()[0].getCode(); + return "Ok".equals(code); + /* 当出现以下错误码时,快速解决方案参考 + * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms) + */ + } catch (TencentCloudSDKException tencentCloudSDKException) { + log.error("发送短信异常", tencentCloudSDKException); + tencentCloudSDKException.printStackTrace(); + } + return false; + } + + @Override + public void sendBatchSms(String signName, List mobile, String templateCode) { + try { + /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数 + * 你可以直接查询SDK源码确定接口有哪些属性可以设置 + * 属性可能是基本类型,也可能引用了另一个数据结构 + * 推荐使用IDE进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明 */ + SendSmsRequest req = new SendSmsRequest(); + + /* 填充请求参数,这里request对象的成员变量即对应接口的入参 + * 你可以通过官网接口文档或跳转到request对象的定义处查看请求参数的定义 + * 基本类型的设置: + * 帮助链接: + * 短信控制台: https://console.cloud.tencent.com/smsv2 + * 腾讯云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81 */ + + /* 短信应用ID: 短信SdkAppId在 [短信控制台] 添加应用后生成的实际SdkAppId,示例如1400006666 */ + // 应用 ID 可前往 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 查看 + req.setSmsSdkAppId(smsSetting.getTencentSdkAppId()); + + /* 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名 */ + // 签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看 + req.setSignName(smsSetting.getTencentSignName()); + + /* 模板 ID: 必须填写已审核通过的模板 ID */ + // 模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看 + req.setTemplateId(templateCode); + + /* 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 */ + req.setTemplateParamSet(null); + + /* 下发手机号码,采用 E.164 标准,+[国家或地区码][手机号] + * 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */ + req.setPhoneNumberSet(Convert.toStrArray(mobile)); + + /* 用户的 session 内容(无需要可忽略): 可以携带用户侧 ID 等上下文信息,server 会原样返回 */ + String sessionContext = ""; + req.setSessionContext(sessionContext); + + /* 短信码号扩展号(无需要可忽略): 默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String extendCode = ""; + req.setExtendCode(extendCode); + + /* 国际/港澳台短信 SenderId(无需要可忽略): 国内短信填空,默认未开通,如需开通请联系 [腾讯云短信小助手] */ + String senderid = ""; + req.setSenderId(senderid); + + /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 + * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */ + SendSmsResponse res = getClient().SendSms(req); + + // 输出json格式的字符串回包 + System.out.println(SendSmsResponse.toJsonString(res)); + + // 也可以取出单个值,你可以通过官网接口文档或跳转到response对象的定义处查看返回字段的定义 + // System.out.println(res.getRequestId()); + + /* 当出现以下错误码时,快速解决方案参考 + * [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F) + * 更多错误,可咨询[腾讯云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms) + */ + } catch (TencentCloudSDKException tencentCloudSDKException) { + log.error("发送短信异常", tencentCloudSDKException); + tencentCloudSDKException.printStackTrace(); + } + } + + @Override + public void deleteSmsSign(String signName) throws Exception { + + } + + @Override + public Map querySmsSign(String signName) throws Exception { + return null; + } + + @Override + public Map querySmsTemplate(String templateCode) throws Exception { + return null; + } + + @Override + public void deleteSmsTemplate(String templateCode) throws Exception { + + } + + + /** + * 获取smsclient + * + * @return + */ + private SmsClient getClient() { + /* 必要步骤: + * 实例化一个认证对象,入参需要传入腾讯云账户密钥对secretId,secretKey。 + * 这里采用的是从环境变量读取的方式,需要在环境变量中先设置这两个值。 + * 你也可以直接在代码中写死密钥对,但是小心不要将代码复制、上传或者分享给他人, + * 以免泄露密钥对危及你的财产安全。 + * SecretId、SecretKey 查询: https://console.cloud.tencent.com/cam/capi */ + Credential cred = new Credential(smsSetting.getTencentSecretId(), smsSetting.getTencentSecretKey()); + + // 实例化一个http选项,可选,没有特殊需求可以跳过 + HttpProfile httpProfile = new HttpProfile(); + // 设置代理(无需要直接忽略) + // httpProfile.setProxyHost("真实代理ip"); + // httpProfile.setProxyPort(真实代理端口); + /* SDK默认使用POST方法。 + * 如果你一定要使用GET方法,可以在这里设置。GET方法无法处理一些较大的请求 */ + httpProfile.setReqMethod("POST"); + /* SDK有默认的超时时间,非必要请不要进行调整 + * 如有需要请在代码中查阅以获取最新的默认值 */ + httpProfile.setConnTimeout(60); + /* 指定接入地域域名,默认就近地域接入域名为 sms.tencentcloudapi.com ,也支持指定地域域名访问,例如广州地域的域名为 sms.ap-guangzhou.tencentcloudapi.com */ + httpProfile.setEndpoint("sms.tencentcloudapi.com"); + + /* 实例化要请求产品(以sms为例)的client对象 + * 第二个参数是地域信息,可以直接填写字符串ap-guangzhou,支持的地域列表参考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8 */ + return new SmsClient(cred, "ap-guangzhou"); + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ActivityStyleService.java b/fightwine-service/src/main/java/com/yzt/service/service/ActivityStyleService.java new file mode 100644 index 0000000..e0df807 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ActivityStyleService.java @@ -0,0 +1,56 @@ +package com.yzt.service.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.acticitystyle.ActivityStyle; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.request.ActivityStyleSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityStyleResponse; + +import java.util.List; + +/** +* ActivityStyleService 接口 +*/ +public interface ActivityStyleService extends IService { + + /** + * 分页查询活动样式 + * @param request 查询条件 + * @param pageParamRequest 分页对行 + * @return 查询结果 + */ + PageInfo getList(ActivityStyleSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 更新 + * @param id id + * @param status 活动样式 状态 + * @return 更新状态结果 + */ + boolean updateStatus(Integer id, boolean status); + + /** + * 根据服务器时间查询正在进行和即将开始的活动边框配置 并缓存在redis中 + * 缓存时常5分钟 + * @param type 0边框 1背景 + * @return 正在进行和未开始的活动边框配置数据 + */ + List getListBeforeBeginTime(boolean type); + + /** + * 填补活动边框 用于商品列表 + * @param productList 待添加商品数据 + * @return + */ + List makeActivityBorderStyle(List productList); + + /** + * 填补活动背景 用于商品详情 + * @param product 待添加活动背景的商品 + * @return 已经添加活动背景的商品 + */ + String makeActivityBackgroundStyle(StoreProduct product); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ArticleService.java b/fightwine-service/src/main/java/com/yzt/service/service/ArticleService.java new file mode 100644 index 0000000..5c51c45 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ArticleService.java @@ -0,0 +1,89 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.article.Article; +import com.yzt.common.model.category.Category; +import com.yzt.common.request.ArticleRequest; +import com.yzt.common.request.ArticleSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ArticleResponse; +import com.yzt.common.vo.ArticleVo; + +import java.util.List; + +/** +* ArticleService 接口 +* fw_ +*/ +public interface ArticleService extends IService
{ + + /** + * 文章列表 + * @param cid 文章分类id + * @param pageParamRequest 分页类参数 + * @return PageInfo
+ */ + PageInfo getList(String cid, PageParamRequest pageParamRequest); + + /** + * 获取文章列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getAdminList(ArticleSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 文章详情 + * @param id 文章id + * @return ArticleVo + */ + ArticleResponse getVoByFront(Integer id); + + /** + * 获取移动端banner列表 + * @return List
+ */ + List
getBannerList(); + + /** + * 获取移动端热门列表 + * @return List + */ + List getHotList(); + + /** + * 获取文章分类列表 + * @return List + */ + List getCategoryList(); + + /** + * 文章新增 + * @param articleRequest 文章新增参数 + * @return Boolean + */ + Boolean create(ArticleRequest articleRequest); + + /** + * 文章删除 + * @param id 文章id + * @return Boolean + */ + Boolean deleteById(Integer id); + + /** + * 文章修改 + * @param id 文章id + * @param articleRequest 文章修改参数 + */ + Boolean updateArticle(Integer id, ArticleRequest articleRequest); + + /** + * 获取文章详情 + * @param id 文章id + * @return Article + */ + Article getDetail(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/CallbackService.java b/fightwine-service/src/main/java/com/yzt/service/service/CallbackService.java new file mode 100644 index 0000000..517ef48 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/CallbackService.java @@ -0,0 +1,21 @@ +package com.yzt.service.service; + +/** + * 订单支付回调 service + * + */ +public interface CallbackService { + /** + * 微信支付回调 + * @param xmlInfo 微信回调json + * @return String + */ + String weChat(String xmlInfo); + + /** + * 微信退款回调 + * @param request 微信回调json + * @return String + */ + String weChatRefund(String request); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/CategoryService.java b/fightwine-service/src/main/java/com/yzt/service/service/CategoryService.java new file mode 100644 index 0000000..1999053 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/CategoryService.java @@ -0,0 +1,77 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.category.Category; +import com.yzt.common.request.CategoryRequest; +import com.yzt.common.request.CategorySearchRequest; +import com.yzt.common.vo.CategoryTreeVo; + +import java.util.HashMap; +import java.util.List; + +/** +* CategoryService 接口 +* fw_ +*/ +public interface CategoryService extends IService { + + List getList(CategorySearchRequest request); + + int delete(Integer id); + + /** + * 获取树形结构数据 + * @param type 分类 + * @param status 状态 + * @param name 名称 + * @return List + */ + List getListTree(Integer type, Integer status, String name); + + /** + * 获取树形结构数据 + * @param type 分类 + * @param status 状态 + * @param categoryIdList 分类idList + * @return List + */ + List getListTree(Integer type, Integer status, List categoryIdList); + + List getByIds(List ids); + + /** + * 获取父级id集合 + * @param idList + * @return + */ + List getByPIds(List idList); + + List getByName(String name); + + HashMap getListInId(List cateIdList); + + Boolean checkAuth(List pathIdList, String uri); + + boolean update(CategoryRequest request, Integer id); + + List getChildVoListByPid(Integer pid); + /** + * 获取分类下子类时判断当前分类有效 + */ + List getChildVoStatusOnListByPid(Integer pid); + + boolean checkUrl(String uri); + + boolean updateStatus(Integer id); + + /** + * 新增分类表 + */ + Boolean create(CategoryRequest categoryRequest); + + /** + * 获取文章分类列表 + * @return List + */ + List findArticleCategoryList(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/CosService.java b/fightwine-service/src/main/java/com/yzt/service/service/CosService.java new file mode 100644 index 0000000..cb2b081 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/CosService.java @@ -0,0 +1,17 @@ +package com.yzt.service.service; + +import com.qcloud.cos.COSClient; +import com.yzt.common.vo.CloudVo; + +import java.io.File; + +/** + * CosService 接口 + * + */ +public interface CosService { + + void uploadFile(CloudVo cloudVo, String webPth, String localFile, Integer id, COSClient cosClient); + + void uploadFile(CloudVo cloudVo, String webPth, String localFile, File file, COSClient cosClient); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ExcelService.java b/fightwine-service/src/main/java/com/yzt/service/service/ExcelService.java new file mode 100644 index 0000000..b36bffa --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ExcelService.java @@ -0,0 +1,45 @@ +package com.yzt.service.service; + +import com.yzt.common.request.StoreBargainSearchRequest; +import com.yzt.common.request.StoreCombinationSearchRequest; +import com.yzt.common.request.StoreOrderSearchRequest; +import com.yzt.common.request.StoreProductSearchRequest; + +/** +* StoreProductService 接口 +* fw_ +*/ +public interface ExcelService{ + + /** + * 导出砍价商品 + * @param request 请求参数 + * @return 导出地址 + */ + String exportBargainProduct(StoreBargainSearchRequest request); + + /** + * 导出拼团商品 + * @param request 请求参数 + * @return 导出地址 + */ + String exportCombinationProduct(StoreCombinationSearchRequest request); + + /** + * 商品导出 + * @param request 请求参数 + * @return 导出地址 + */ + String exportProduct(StoreProductSearchRequest request); + + /** + * 订单导出 + * @param request 查询条件 + * @return 文件名称 + */ + String exportOrder(StoreOrderSearchRequest request); + /** + * @return 文件名称 + */ + String exportCustomer(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ExceptionLogService.java b/fightwine-service/src/main/java/com/yzt/service/service/ExceptionLogService.java new file mode 100644 index 0000000..3b2bf82 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ExceptionLogService.java @@ -0,0 +1,12 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.exception.ExceptionLog; + +/** + * ExceptionLogService 接口 + * + */ +public interface ExceptionLogService extends IService { + +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ExpressService.java b/fightwine-service/src/main/java/com/yzt/service/service/ExpressService.java new file mode 100644 index 0000000..4761be4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ExpressService.java @@ -0,0 +1,78 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.express.Express; +import com.yzt.common.request.ExpressSearchRequest; +import com.yzt.common.request.ExpressUpdateRequest; +import com.yzt.common.request.ExpressUpdateShowRequest; +import com.yzt.common.request.PageParamRequest; + +import java.util.List; + +/** +* ExpressService 接口 +* fw_ +*/ +public interface ExpressService extends IService { + + /** + * 列表 + * @param request 搜索条件 + * @param pageParamRequest 分页类参数 + * @return List + */ + List getList(ExpressSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 编辑 + */ + Boolean updateExpress(ExpressUpdateRequest expressRequest); + + /** + * 修改显示状态 + */ + Boolean updateExpressShow(ExpressUpdateShowRequest expressRequest); + + /** + * 同步快递公司 + */ + Boolean syncExpress(); + + /** + * 查询全部快递公司 + * @param type 类型:normal-普通,elec-电子面单 + */ + List findAll(String type); + + /** + * 查询快递公司面单模板 + * @param com 快递公司编号 + */ + JSONObject template(String com); + + /** + * 获取电子面单模版 + * @return + */ + JSONObject templateFor(String com, String type, String is_shipment, String page, String limit); + + /** + * 查询快递公司 + * @param code 快递公司编号 + * @return Express + */ + Express getByCode(String code); + + /** + * 通过物流公司名称获取 + * @param name 物流公司名称 + */ + Express getByName(String name); + + /** + * 获取快递公司详情 + * @param id 快递公司id + */ + Express getInfo(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/HomeService.java b/fightwine-service/src/main/java/com/yzt/service/service/HomeService.java new file mode 100644 index 0000000..ec3f122 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/HomeService.java @@ -0,0 +1,55 @@ +package com.yzt.service.service; + +import com.yzt.common.response.HomeOperatingDataResponse; +import com.yzt.common.response.HomeRateResponse; + +import java.util.Map; + +/** + * 首页统计 + * + */ +public interface HomeService{ + + /** + * 用户曲线图 + */ + Map chartUser(); + + /** + * 30天订单量趋势 + */ + Map chartOrder(); + + /** + * 用户购买统计 + */ + Map chartUserBuy(); + + /** + * 周订单量趋势 + */ + Map chartOrderInWeek(); + + /** + * 月订单量趋势 + */ + Map chartOrderInMonth(); + + /** + * 年订单量趋势 + */ + Map chartOrderInYear(); + + /** + * 首页数据 + * @return HomeRateResponse + */ + HomeRateResponse indexDate(); + + /** + * 经营数据 + * @return HomeOperatingDataResponse + */ + HomeOperatingDataResponse operatingData(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/JdCloudService.java b/fightwine-service/src/main/java/com/yzt/service/service/JdCloudService.java new file mode 100644 index 0000000..36f9b16 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/JdCloudService.java @@ -0,0 +1,29 @@ +package com.yzt.service.service; + + +/** + * 京东云 Service + * + */ +public interface JdCloudService { + + /** + * 文件上传 + * @param fileName 文件名称 + * @param localFilePath 本地文件地址 + * @param bucket 存储桶名称 + */ + void uploadFile(String fileName, String localFilePath, String bucket); + + /** + * 创建新的存储空间 + */ + void createBucket(String bucketName); + + /** + * 获取文件URL + * @param bucket 存储桶名称 + * @param fileName 文件名称 + */ + String getUrl(String bucket, String fileName); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/LogisticService.java b/fightwine-service/src/main/java/com/yzt/service/service/LogisticService.java new file mode 100644 index 0000000..d280ffe --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/LogisticService.java @@ -0,0 +1,12 @@ +package com.yzt.service.service; + + +import com.yzt.common.vo.LogisticsResultVo; + +/** +* ExpressService 接口 +* fw_ +*/ +public interface LogisticService { + LogisticsResultVo info(String expressNo, String type, String com, String phone); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/OnePassService.java b/fightwine-service/src/main/java/com/yzt/service/service/OnePassService.java new file mode 100644 index 0000000..ca9ba1c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/OnePassService.java @@ -0,0 +1,98 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.request.*; +import com.yzt.common.request.onepass.OnePassLoginRequest; +import com.yzt.common.request.onepass.OnePassShipmentCancelOrderRequest; +import com.yzt.common.request.onepass.OnePassShipmentCreateOrderRequest; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.OnePassLogisticsQueryVo; + +/** + * 一号通 OnePassService 接口 + * + */ +public interface OnePassService { + + + /** + * 用户登录 + * @param request 登录参数 + */ + Boolean login(OnePassLoginRequest request); + + /** + * 保存一号通应用信息 + * @param request 一号通服务中申请的应用信息 + * @return 保存结果 + */ + Boolean saveOnePassApplicationInfo(OnePassLoginRequest request); + + /** + * 获取一号通应用信息 + * @return 一号通应用信息 + */ + OnePassLoginRequest getOnePassApplicationInfo(); + + /** + * 商家寄件 + * @param request 寄件请求对象 + * @return 寄件返回数据 + */ + JSONObject shipmentCreateOrder(OnePassShipmentCreateOrderRequest request); + + + /** + * 取消商家寄件 + * @param request 取消商家寄件请求对象 + * @return 取消寄件返回对象 + */ + JSONObject shipmentCancelOrder(OnePassShipmentCancelOrderRequest request); + + /** + * 获取商家寄件所需的快递公司列表 + * @return 商家寄件功能对应的快递公司列表 + */ + JSONObject shipmentComs(); + + /** + * 商家寄件功能对应的回调 + * @return 回调数据 + */ + Boolean shipmentCallBackMethod(String type, String data); + + + /** + * 一号通用户信息 + */ + JSONObject info(); + /** + * 服务开通 + * @param request 服务开通参数 + */ + Boolean serviceOpen(ServiceOpenRequest request); + + /** + * 复制平台商品 + * @param url 商品链接 + */ + JSONObject copyGoods(String url); + + /** + * 电子面单 + */ + MyRecord expressDump(MyRecord record); + + /** + * 物流追踪 + * @param expressNo 快递单号 + * @param com 快递公司简写 + * @return OnePassLogisticsQueryVo + */ + OnePassLogisticsQueryVo exprQuery(String expressNo, String com); + + /** + * 校验一号通账号是否配置 + */ + Boolean checkAccount(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/OrderPayService.java b/fightwine-service/src/main/java/com/yzt/service/service/OrderPayService.java new file mode 100644 index 0000000..1a971c5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/OrderPayService.java @@ -0,0 +1,33 @@ +package com.yzt.service.service; + +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.request.OrderPayRequest; +import com.yzt.common.response.OrderPayResultResponse; +import com.yzt.common.response.PayConfigResponse; + +/** + * 订单支付 + * + */ +public interface OrderPayService{ + + + /** + * 获取支付配置 + */ + PayConfigResponse getPayConfig(); + + /** + * 支付成功处理 + * @param storeOrder 订单 + */ + Boolean paySuccess(StoreOrder storeOrder); + + /** + * 订单支付 + * @param orderPayRequest 支付参数 + * @param ip ip + * @return OrderPayResultResponse + */ + OrderPayResultResponse payment(OrderPayRequest orderPayRequest, String ip); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/OrderService.java b/fightwine-service/src/main/java/com/yzt/service/service/OrderService.java new file mode 100644 index 0000000..b4f70e0 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/OrderService.java @@ -0,0 +1,136 @@ +package com.yzt.service.service; + +import com.github.pagehelper.PageInfo; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.vo.MyRecord; + +import java.util.List; + +/** + * H5端订单操作 + * fw_ + */ +public interface OrderService { + + /** + * 订单列表 + * @param type 类型 + * @param pageRequest 分页 + * @return 订单集合 + */ + PageInfo list(String keywords,Integer type, PageParamRequest pageRequest); + + /** + * 订单详情 + * @param orderId 订单id + */ + StoreOrderDetailInfoResponse detailOrder(String orderId); + + /** + * 订单状态数量 + * @return 订单状态数据量 + */ + OrderDataResponse orderData(); + + /** + * 查询退款理由 + * @return 退款理由集合 + */ + List getRefundReason(); + + /** + * 订单删除 + * @param id 订单id + * @return Boolean + */ + Boolean delete(Integer id); + + /** + * 创建订单商品评价 + * @param request 请求参数 + * @return Boolean + */ + Boolean reply(StoreProductReplyAddRequest request); + + /** + * 订单收货 + * @param id 订单id + * @return Boolean + */ + Boolean take(Integer id); + + /** + * 订单取消 + * @param id 订单id + * @return Boolean + */ + Boolean cancel(Integer id); + + /** + * 订单退款申请 + * @param request 申请参数 + * @return Boolean + */ + Boolean refundApply(OrderRefundApplyRequest request); + + /** + * 订单退款申请Task使用 + * @param applyList 退款List + * @return Boolean + */ + Boolean refundApplyTask(List applyList); + + /** + * 订单物流查看 + */ + Object expressOrder(String orderId); + + /** + * 获取待评价商品信息 + * @param getProductReply 订单详情参数 + * @return 待评价 + */ + OrderProductReplyResponse getReplyProduct(GetProductReply getProductReply); + + /** + * 获取申请订单退款信息 + * @param orderId 订单编号 + * @return ApplyRefundOrderInfoResponse + */ + ApplyRefundOrderInfoResponse applyRefundOrderInfo(String orderId); + + /** + * 订单预下单 + * @param request 预下单请求参数 + * @return PreOrderResponse + */ + MyRecord preOrder(PreOrderRequest request); + + /** + * 加载预下单信息 + * @param preOrderNo 预下单号 + * @return 预下单信息 + */ + PreOrderResponse loadPreOrder(String preOrderNo); + + /** + * 计算订单价格 + * @param request 计算订单价格请求对象 + * @return ComputedOrderPriceResponse + */ + ComputedOrderPriceResponse computedOrderPrice(OrderComputedPriceRequest request); + + /** + * 创建订单 + * @param orderRequest 创建订单请求参数 + * @return MyRecord 订单编号 + */ + MyRecord createOrder(CreateOrderRequest orderRequest); + + /** + * 获取支付配置 + * @return PreOrderResponse + */ + PreOrderResponse getPayConfig(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/OrderTaskService.java b/fightwine-service/src/main/java/com/yzt/service/service/OrderTaskService.java new file mode 100644 index 0000000..6fcd714 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/OrderTaskService.java @@ -0,0 +1,37 @@ +package com.yzt.service.service; + + +/** + * 订单任务服务 StoreOrderService 接口 + * + */ + public interface OrderTaskService{ + + void cancelByUser(); + + void refundApply(); + + void complete(); + + void orderPaySuccessAfter(); + + /** + * 自动取消未支付订单 + */ + void autoCancel(); + + /** + * 订单收货 + */ + void orderReceiving(); + + /** + * 订单自动完成 + */ + void autoComplete(); + + /** + * 订单自动收货 + */ + void autoTakeDelivery(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/OssService.java b/fightwine-service/src/main/java/com/yzt/service/service/OssService.java new file mode 100644 index 0000000..80eef90 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/OssService.java @@ -0,0 +1,16 @@ +package com.yzt.service.service; + + +import com.yzt.common.vo.CloudVo; + +import java.io.File; + +/** + * OssService 接口 + * + */ +public interface OssService { + + void upload(CloudVo cloudVo, String webPth, String localFile, File file); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/PageDiyService.java b/fightwine-service/src/main/java/com/yzt/service/service/PageDiyService.java new file mode 100644 index 0000000..d344212 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/PageDiyService.java @@ -0,0 +1,75 @@ +package com.yzt.service.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.page.PageDiy; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.page.PageDiyEditNameRequest; +import com.yzt.common.response.page.PageDiyResponse; + +import java.util.List; + +/** +* @author dazongzi +* @description PageDiyService 接口 +* @date 2023-05-16 +*/ +public interface PageDiyService extends IService { + + /** + * 列表 + * @since 2023-05-16 + * @return List + */ + List getList(String name,PageParamRequest pageParamRequest); + + /** + * 保存diy + * @param pageDiy + */ + PageDiy savePageDiy(PageDiy pageDiy); + + /** + * 更新diy + * @param pageDiy + */ + Boolean editPageDiy(PageDiy pageDiy); + + /** + * 编辑diy名称 + * @param pageDiyEditNameRequest 待编辑名称对象 + */ + Boolean editPageDiyName(PageDiyEditNameRequest pageDiyEditNameRequest); + + /** + * 设置DIY首页模版 + * @param diyId 被设置为首页的diy模版id + * @return 设置结果 + */ + Boolean setDiyPageHome(Integer diyId); + + /** + * 获取DIY首页模版Id + * @param isLoadValue 是否加载value详情数据 + * @return 首页模版ID + */ + PageDiy getDiyPageHome(Boolean isLoadValue); + + /** 针对Front + * 根据id加载diy模版配置 + * @param id 对应的模版id + * 描述: + * id=0加载商城首页的,也就是setDiyPageHome后的数据,平台端会默认设置已经有首页的数据,也会预制 + * id>1时加载对应的模版即可 + */ + PageDiyResponse getDiyPageByPageIdForFront(Integer id); + + /** 针对Admin + * 根据id加载diy模版配置 + * @param id 对应的模版id + * 描述: + * id=0加载商城首页的,也就是setDiyPageHome后的数据,平台端会默认设置已经有首页的数据,也会预制 + * id>1时加载对应的模版即可 + */ + PageDiy getDiyPageByPageIdForAdmin(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/PageLayoutService.java b/fightwine-service/src/main/java/com/yzt/service/service/PageLayoutService.java new file mode 100644 index 0000000..ae5746e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/PageLayoutService.java @@ -0,0 +1,79 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; + +import java.util.HashMap; + +/** + * 页面布局接口 + * fw_ + */ +public interface PageLayoutService { + + /** + * 页面首页 + * @return 首页信息 + */ + HashMap index(); + + /** + * 首页保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean save(JSONObject jsonObject); + + /** + * 页面首页banner保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean indexBannerSave(JSONObject jsonObject); + + /** + * 页面首页menu保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean indexMenuSave(JSONObject jsonObject); + + /** + * 页面首页新闻保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean indexNewsSave(JSONObject jsonObject); + + /** + * 页面用户中心banner保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean userBannerSave(JSONObject jsonObject); + + /** + * 页面用户中心导航保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean userMenuSave(JSONObject jsonObject); + + /** + * 页面用户中心商品table保存 + * @param jsonObject 数据 + * @return Boolean + */ + Boolean indexTableSave(JSONObject jsonObject); + + /** + * 获取页面底部导航信息 + */ + PageLayoutBottomNavigationResponse getBottomNavigation(); + + /** + * 页面底部导航信息保存 + * @return 保存结果 + */ + Boolean bottomNavigationSave(JSONObject jsonObject); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/QiNiuService.java b/fightwine-service/src/main/java/com/yzt/service/service/QiNiuService.java new file mode 100644 index 0000000..53290c7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/QiNiuService.java @@ -0,0 +1,16 @@ +package com.yzt.service.service; + +import com.qiniu.storage.UploadManager; +import com.yzt.common.vo.CloudVo; + +import java.io.File; + +/** + * QiNiuService 接口 + * + */ +public interface QiNiuService { + void upload(UploadManager uploadManager, CloudVo cloudVo, String upToken, String webPth, String localFile, Integer id); + + void uploadFile(UploadManager uploadManager, String upToken, String webPth, String localFile, File file); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/QrCodeService.java b/fightwine-service/src/main/java/com/yzt/service/service/QrCodeService.java new file mode 100644 index 0000000..116d561 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/QrCodeService.java @@ -0,0 +1,58 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.vo.QrCodeVo; + +import java.util.Map; + +/** + * QrCodeService 接口 + * + */ +public interface QrCodeService { + + /** + * 获取二维码 + * + * @return QrCodeVo + */ + QrCodeVo getWecahtQrCode(JSONObject data); + + /** + * 远程图片转base64 + * + * @param url 图片链接地址 + * @return QrCodeVo + */ + QrCodeVo urlToBase64(String url); + + /** + * 将字符串 转base64 + * @param text 字符串 + * @param width 宽 + * @param height 高 + * @return QrCodeVo + */ + QrCodeVo strToBase64(String text, Integer width, Integer height); + + /** + * 获取二维码 + * @return CommonResult + */ + Map get(JSONObject data); + + /** + * 远程图片转base64 + * @param url 图片链接地址 + */ + Map base64(String url); + + /** + * 将字符串 转base64 + * @param text 字符串 + * @param width 宽 + * @param height 高 + */ + Map base64String(String text,int width, int height); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/RechargePayService.java b/fightwine-service/src/main/java/com/yzt/service/service/RechargePayService.java new file mode 100644 index 0000000..416af35 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/RechargePayService.java @@ -0,0 +1,16 @@ +package com.yzt.service.service; + +import com.yzt.common.model.finance.UserRecharge; + +/** + * 订单支付 + * + */ +public interface RechargePayService { + + /** + * 支付成功处理 + * @param userRecharge 充值订单 + */ + Boolean paySuccess(UserRecharge userRecharge); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/RetailShopService.java b/fightwine-service/src/main/java/com/yzt/service/service/RetailShopService.java new file mode 100644 index 0000000..7fe267f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/RetailShopService.java @@ -0,0 +1,38 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.RetailShopRequest; +import com.yzt.common.response.SpreadUserResponse; + +/** + * 分销业务 + * + */ +public interface RetailShopService extends IService { + + /** + * 分销员列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + * @return CommonPage + */ + CommonPage getSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest); + + /** + * 获取分销配置 + * @return 分销配置信息 + */ + RetailShopRequest getManageInfo(); + + /** + * 保存或者更新分销配置信息 + * @param retailShopRequest 待保存数据 + * @return 保存结果 + */ + boolean setManageInfo(RetailShopRequest retailShopRequest); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SafetyService.java b/fightwine-service/src/main/java/com/yzt/service/service/SafetyService.java new file mode 100644 index 0000000..f3d5868 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SafetyService.java @@ -0,0 +1,29 @@ +package com.yzt.service.service; + +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; + +import javax.servlet.http.HttpServletRequest; + + +/** + * 类的详细说明 + * + */ +public interface SafetyService { + + /** + * 获取行为验证码 + */ + ResponseModel getSafetyCode(CaptchaVO data, HttpServletRequest request); + + /** + * 验证行为验证码 + */ + ResponseModel checkSafetyCode(CaptchaVO data, HttpServletRequest request); + + /** + * 行为验证码二次校验 + */ + ResponseModel verifySafetyCode(CaptchaVO data); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesFreeService.java b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesFreeService.java new file mode 100644 index 0000000..1ef3cda --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesFreeService.java @@ -0,0 +1,35 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.express.ShippingTemplatesFree; +import com.yzt.common.request.ShippingTemplatesFreeRequest; +import com.yzt.common.response.ShippingTemplatesFreeResponse; + +import java.util.List; + +/** + * ShippingTemplatesFreeService 接口 + * + */ +public interface ShippingTemplatesFreeService extends IService { + + Boolean saveAll(List shippingTemplatesFreeRequestList, Integer type, Integer id); + + List getListGroup(Integer tempId); + + /** + * 删除 + * + * @param tempId 运费模板id + */ + Boolean deleteByTempId(Integer tempId); + + /** + * 根据模板编号、城市ID查询 + * + * @param tempId 模板编号 + * @param cityId 城市ID + * @return 运费模板 + */ + ShippingTemplatesFree getByTempIdAndCityId(Integer tempId, Integer cityId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesRegionService.java b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesRegionService.java new file mode 100644 index 0000000..f76ebc2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesRegionService.java @@ -0,0 +1,43 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.express.ShippingTemplatesRegion; +import com.yzt.common.request.ShippingTemplatesRegionRequest; +import com.yzt.common.response.ShippingTemplatesRegionResponse; + +import java.util.List; + +/** +* ShippingTemplatesRegionService 接口 +* fw_ +*/ +public interface ShippingTemplatesRegionService extends IService { + + Boolean saveAll(List shippingTemplatesRegionRequestList, Integer type, Integer id); + + List getListGroup(Integer tempId); + + Boolean deleteByTempId(Integer tempId); + + /** + * 删除 + * @param tempId 运费模板id + * @return Boolean + */ + Boolean delete(Integer tempId); + + /** + * 根据模板编号、城市ID查询 + * @param tempId 模板编号 + * @param cityId 城市ID + * @return 运费模板 + */ + ShippingTemplatesRegion getByTempIdAndCityId(Integer tempId, Integer cityId); + + /** + * 获取运费模板区域列表 + * @param tempId 模板标号 + * @return List + */ + List findListById(Integer tempId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesService.java b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesService.java new file mode 100644 index 0000000..9da3769 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/ShippingTemplatesService.java @@ -0,0 +1,42 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.express.ShippingTemplates; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ShippingTemplatesRequest; +import com.yzt.common.request.ShippingTemplatesSearchRequest; +import com.yzt.common.response.ShippingTemplatesInfoResponse; + +import java.util.List; + +/** +* ShippingTemplatesService 接口 +* fw_ +*/ +public interface ShippingTemplatesService extends IService { + + List getList(ShippingTemplatesSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增运费模板 + * @param request 请求参数 + * @return 新增结果 + */ + Boolean create(ShippingTemplatesRequest request); + + Boolean update(Integer id, ShippingTemplatesRequest request); + + /** + * 删除模板 + * @param id 模板id + * @return Boolean + */ + Boolean remove(Integer id); + + /** + * 获取模板信息 + * @param id 模板id + * @return ShippingTemplates + */ + ShippingTemplatesInfoResponse getInfo(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SmsRecordService.java b/fightwine-service/src/main/java/com/yzt/service/service/SmsRecordService.java new file mode 100644 index 0000000..148641d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SmsRecordService.java @@ -0,0 +1,19 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.sms.SmsRecord; + +/** + * SmsRecordService 接口 + * + */ +public interface SmsRecordService extends IService { + + /** + * 保存短信记录 + * @param smsRecord 待保存短信记录 + * @return 保存结果 + */ + boolean save(SmsRecord smsRecord); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SmsService.java b/fightwine-service/src/main/java/com/yzt/service/service/SmsService.java new file mode 100644 index 0000000..feadade --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SmsService.java @@ -0,0 +1,109 @@ +package com.yzt.service.service; + +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SmsApplyTempRequest; +import com.yzt.common.request.SmsModifySignRequest; +import com.yzt.common.vo.MyRecord; + +import java.math.BigDecimal; + +/** + * SmsService 接口 + * + */ +public interface SmsService { + + /** + * 修改签名 + */ + Boolean modifySign(SmsModifySignRequest request); + + /** + * 短信模板 + */ + MyRecord temps(PageParamRequest pageParamRequest); + + /** + * 申请模板消息 + */ + Boolean applyTempMessage(SmsApplyTempRequest request); + + /** + * 模板申请记录 + * + * @param type (1=验证码 2=通知 3=推广) + */ + MyRecord applys(Integer type, PageParamRequest pageParamRequest); + + /** + * 发送公共验证码 + * + * @param phone 手机号 + */ + Boolean sendCommonCode(String phone); + + /** + * 发送支付成功短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param payPrice 支付金额 + * @param msgTempId 短信模板id + * @return Boolean + */ + Boolean sendPaySuccess(String phone, String orderNo, BigDecimal payPrice, Integer msgTempId); + + /** + * 发送管理员下单短信提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + */ + Boolean sendCreateOrderNotice(String phone, String orderNo, String realName, Integer msgTempId); + + /** + * 发送订单支付成功管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + */ + Boolean sendOrderPaySuccessNotice(String phone, String orderNo, String realName, Integer msgTempId); + + /** + * 发送用户退款管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + */ + Boolean sendOrderRefundApplyNotice(String phone, String orderNo, String realName, Integer msgTempId); + + /** + * 发送用户确认收货管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + */ + Boolean sendOrderReceiptNotice(String phone, String orderNo, String realName, Integer msgTempId); + + /** + * 发送订单改价提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param price 修改后的支付金额 + * @param msgTempId 短信模板id + */ + Boolean sendOrderEditPriceNotice(String phone, String orderNo, BigDecimal price, Integer msgTempId); + + /** + * 发送订单发货提醒短信 + * @param phone 手机号 + * @param nickName 用户昵称 + * @param storeName 商品名称 + * @param orderNo 订单编号 + * @param msgTempId 短信模板id + */ + Boolean sendOrderDeliverNotice(String phone, String nickName, String storeName, String orderNo, Integer msgTempId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SmsTemplateService.java b/fightwine-service/src/main/java/com/yzt/service/service/SmsTemplateService.java new file mode 100644 index 0000000..857a4df --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SmsTemplateService.java @@ -0,0 +1,18 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.sms.SmsTemplate; + +/** + * SmsTemplateService 接口 + * + */ +public interface SmsTemplateService extends IService { + + /** + * 获取详情 + * @param id 模板id + * @return SmsTemplate + */ + SmsTemplate getDetail(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainService.java new file mode 100644 index 0000000..f43cf57 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainService.java @@ -0,0 +1,125 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreBargainRequest; +import com.yzt.common.request.StoreBargainSearchRequest; +import com.yzt.common.response.*; +import com.yzt.common.vo.MyRecord; + +import java.util.HashMap; +import java.util.List; + +/** + * 砍价 Service + * + */ +public interface StoreBargainService extends IService { + + /** + * 分页显示砍价商品列表 + */ + PageInfo getList(StoreBargainSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增砍价商品 + */ + boolean saveBargain(StoreBargainRequest storeBargainRequest); + + /** + * 删除砍价商品 + */ + boolean deleteById(Integer id); + + /** + * 修改砍价商品 + */ + boolean updateBargain(StoreBargainRequest storeBargainRequest); + + /** + * 修改砍价商品状态 + */ + boolean updateBargainStatus(Integer id, boolean status); + + /** + * 查询砍价商品详情 + */ + StoreProductInfoResponse getAdminDetail(Integer id); + + /** + * H5 砍价商品列表 + * @return PageInfo + */ + PageInfo getH5List(PageParamRequest pageParamRequest); + + /** + * H5 获取砍价商品详情信息 + * @return BargainDetailResponse + */ + BargainDetailH5Response getH5Detail(Integer id); + + /** + * 获取当前时间的砍价商品 + * @return List + */ + List getCurrentBargainByProductId(Integer productId); + + /** + * 创建砍价活动 + * @return MyRecord + */ + MyRecord start(BargainFrontRequest bargainFrontRequest); + + /** + * 后台任务批量操作库存 + */ + void consumeProductStock(); + + /** + * 砍价活动结束后处理 + */ + void stopAfterChange(); + + /** + * 商品是否存在砍价活动 + * @param productId 商品编号 + */ + Boolean isExistActivity(Integer productId); + + /** + * 查询带异常 + * @param id 砍价商品id + * @return StoreBargain + */ + StoreBargain getByIdException(Integer id); + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationStock(Integer id, Integer num, String type); + + /** + * 砍价首页信息 + * @return BargainIndexResponse + */ + BargainIndexResponse getIndexInfo(); + + /** + * 获取砍价列表header + * @return BargainHeaderResponse + */ + BargainHeaderResponse getHeader(); + + /** + * 根据id数组获取砍价商品map + * @param bargainIdList 砍价商品id数组 + * @return HashMap + */ + HashMap getMapInId(List bargainIdList); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserHelpService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserHelpService.java new file mode 100644 index 0000000..57e0362 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserHelpService.java @@ -0,0 +1,75 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.bargain.StoreBargainUserHelp; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.response.StoreBargainUserHelpResponse; + +import java.util.List; +import java.util.Map; + +/** + * 用户帮助砍价 Service + * + */ +public interface StoreBargainUserHelpService extends IService { + + /** + * 列表 + * @param bargainUserId 砍价活动id + * @return List + */ + List getList(Integer bargainUserId); + + /** + * 获取帮忙砍价好友数量 + * @param bargainId 砍价商品Id + * @return Long + */ + Long getHelpCountByBargainId(Integer bargainId); + + /** + * 获取帮忙砍价好友数量 + * @param bargainId 砍价商品Id + * @param bargainUid 砍价用户uid + * @return Long + */ + Long getHelpCountByBargainIdAndBargainUid(Integer bargainId, Integer bargainUid); + + /** + * 砍价 + * @param bargainFrontRequest 砍价请求参数 + * @return Map + */ + Map help(BargainFrontRequest bargainFrontRequest); + + /** + * 获取参与砍价总人数(次) + * @return Integer + */ + Integer getCount(); + + /** + * 获取好友助力列表 + * @param bargainUserId 砍价用户表id + * @return List + */ + List getHelpListByBargainUserId(Integer bargainUserId); + + /** + * 是否帮砍过 + * @param bargainUserId 用户砍价活动id + * @param uid 用户uid + * @return Boolean + */ + Boolean getIsHelp(Integer bargainUserId, Integer uid); + + /** + * 获取该砍价商品用户的帮砍次数 + * @param bargainId 砍价商品id + * @param uid 用户uid + * @param bargainUserIdList 用户参与砍价活动id数组 + * @return Integer + */ + Integer getHelpCountByBargainIdAndUidInBUserId(Integer bargainId, Integer uid, List bargainUserIdList); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserService.java new file mode 100644 index 0000000..327ead1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreBargainUserService.java @@ -0,0 +1,62 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.bargain.StoreBargainUser; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreBargainUserSearchRequest; +import com.yzt.common.response.BargainRecordResponse; +import com.yzt.common.response.BargainUserInfoResponse; +import com.yzt.common.response.StoreBargainUserResponse; + +import java.util.List; + +/** + * 用户参与砍价 Service + * + */ +public interface StoreBargainUserService extends IService { + + PageInfo getList(StoreBargainUserSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 获取砍价商品参与用户列表 + * @param bargainId 砍价商品Id + * @return List + */ + List getListByBargainId(Integer bargainId); + + /** + * 获取用户砍价活动列表 + * @param bargainId 砍价商品编号 + * @param uid 参与用户uid + * @return StoreBargainUser + */ + List getListByBargainIdAndUid(Integer bargainId, Integer uid); + + /** + * 砍价商品用户根据实体查询 + * @param bargainUser 砍价活动 + * @return List + */ + List getByEntity(StoreBargainUser bargainUser); + + /** + * 获取砍价成功列表Header + */ + List getHeaderList(); + + /** + * 获取用户砍价信息 + * @param bargainFrontRequest 请求参数 + * @return BargainUserInfoResponse + */ + BargainUserInfoResponse getBargainUserInfo(BargainFrontRequest bargainFrontRequest); + + /** + * 砍价记录 + * @return PageInfo + */ + PageInfo getRecordList(PageParamRequest pageParamRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreCartService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreCartService.java new file mode 100644 index 0000000..f90d29e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreCartService.java @@ -0,0 +1,116 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.cat.StoreCart; +import com.yzt.common.request.CartNumRequest; +import com.yzt.common.request.CartRequest; +import com.yzt.common.request.CartResetRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CartInfoResponse; +import com.yzt.common.response.IndexProductResponse; + +import java.util.List; +import java.util.Map; + +/** + * StoreCartService 接口 + * + */ +public interface StoreCartService extends IService { + + /** + * 根据有效标识符获取出数据 + * @param pageParamRequest 分页参数 + * @param isValid 是否失效 + * @return 购物车列表 + */ + PageInfo getList(PageParamRequest pageParamRequest, boolean isValid); + + /** + * 获取当前购物车数量 + * @param request 请求参数 + * @return 数量 + */ + Map getUserCount(CartNumRequest request); + + /** + * 新增购物车数据 + * @param storeCartRequest 新增购物车参数 + * @return 新增结果 + */ + String saveCate(CartRequest storeCartRequest); + + /** + * 删除购物车 + * @param ids 待删除id + * @return 返回删除状态 + */ + Boolean deleteCartByIds(List ids); + + + /** + * 检测商品是否有效 更新购物车商品状态 + * @param productId 商品id + * @return 跟新结果 + */ + Boolean productStatusNotEnable(Integer productId); + + /** + * 购物车重选提交 + * @param resetRequest 重选数据 + * @return 提交结果 + */ + Boolean resetCart(CartResetRequest resetRequest); + + /** + * 对应sku购物车生效 + * @param skuIdList skuIdList + */ + Boolean productStatusNoEnable(List skuIdList); + + /** + * 删除商品对应的购物车 + * @param productId 商品id + */ + Boolean productDelete(Integer productId); + + /** + * 通过id和uid获取购物车信息 + * @param id 购物车id + * @param uid 用户uid + * @return StoreCart + */ + StoreCart getByIdAndUid(Long id, Integer uid); + + /** + * 获取购物车商品数量(不区分规格) + * @param uid 用户uid + * @param proId 商品id + */ + Integer getProductNumByUidAndProductId(Integer uid, Integer proId); + + /** + * 修改购物车商品数量 + * @param id 购物车id + * @param number 数量 + */ + Boolean updateCartNum(Integer id, Integer number); + + + /** + * 查询购物车项目数 + */ + String getCartItemCount(); + + /** + * 更新购物车状态 + */ + boolean updateCartStatus(Long id, Integer status); + + + /** + * 查询购物车商品 + */ + List getProductByCartIds(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreCombinationService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreCombinationService.java new file mode 100644 index 0000000..2f9c17c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreCombinationService.java @@ -0,0 +1,128 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreCombinationRequest; +import com.yzt.common.request.StoreCombinationSearchRequest; +import com.yzt.common.request.StorePinkRequest; +import com.yzt.common.response.*; + +import java.util.List; +import java.util.Map; + +/** + * StorePinkService + * + */ +public interface StoreCombinationService extends IService { + + /** + * 分页显示拼团商品表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + PageInfo getList(StoreCombinationSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增拼团商品 + */ + Boolean saveCombination(StoreCombinationRequest request); + + /** + * 删除拼团商品 + */ + Boolean deleteById(Integer id); + + /** + * 编辑拼团商品 + */ + Boolean updateCombination(StoreCombinationRequest request); + + /** + * 查询拼团商品详情 + * @return StoreProductInfoResponse + */ + StoreProductInfoResponse getAdminDetail(Integer id); + + /** + * 修改拼团商品状态 + */ + Boolean updateCombinationShow(Integer id, Boolean isShow); + + /** + * admin拼团统计 + */ + Map getAdminStatistics(); + + /** + * H5拼团商品列表 + */ + List getH5List(PageParamRequest pageParamRequest); + + /** + * H5拼团商品详情 + * @param id 拼团商品编号 + */ + CombinationDetailResponse getH5Detail(Integer id); + + /** + * 去拼团 + * @param pinkId 拼团团长单ID + */ + GoPinkResponse goPink(Integer pinkId); + + /** + * 更多拼团信息 + */ + PageInfo getMore(PageParamRequest pageParamRequest, Integer comId); + + /** + * 取消拼团 + */ + Boolean removePink(StorePinkRequest storePinkRequest); + + /** + * 后台任务批量操作库存 + */ + void consumeProductStock(); + + /** + * 获取当前时间的拼团商品 + */ + List getCurrentBargainByProductId(Integer productId); + + /** + * 商品是否存在拼团活动 + * @param productId 商品编号 + */ + Boolean isExistActivity(Integer productId); + + /** + * 查询带异常 + * @param combinationId 拼团商品id + * @return StoreCombination + */ + StoreCombination getByIdException(Integer combinationId); + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationStock(Integer id, Integer num, String type); + + /** + * 拼团首页数据 + * @return CombinationIndexResponse + */ + CombinationIndexResponse getIndexInfo(); + + /** + * 拼团列表header + * @return CombinationHeaderResponse + */ + CombinationHeaderResponse getHeader(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponService.java new file mode 100644 index 0000000..3b38e3c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponService.java @@ -0,0 +1,80 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SearchAndPageRequest; +import com.yzt.common.request.StoreCouponRequest; +import com.yzt.common.request.StoreCouponSearchRequest; +import com.yzt.common.response.StoreCouponFrontResponse; +import com.yzt.common.response.StoreCouponInfoResponse; + +import java.util.List; + +/** + * StoreCouponService 接口 + * + */ +public interface StoreCouponService extends IService { + + List getList(StoreCouponSearchRequest request, PageParamRequest pageParamRequest); + + boolean create(StoreCouponRequest request); + + StoreCoupon getInfoException(Integer id); + + StoreCouponInfoResponse info(Integer id); + + /** + * 根据优惠券id获取 + * @param ids 优惠券id集合 + * @return 优惠券列表 + */ + List getByIds(List ids); + + /** + * 扣减数量 + * @param id 优惠券id + * @param num 数量 + * @param isLimited 是否限量 + */ + Boolean deduction(Integer id, Integer num, Boolean isLimited); + + /** + * 获取用户注册赠送新人券 + * @return 优惠券列表 + */ + List findRegisterList(); + + /** + * 发送优惠券列表 + * @param searchAndPageRequest 搜索分页参数 + * @return 优惠券列表 + */ + List getSendList(SearchAndPageRequest searchAndPageRequest); + + /** + * 删除优惠券 + * @param id 优惠券id + * @return Boolean + */ + Boolean delete(Integer id); + + /** + * 移动端优惠券列表 + * + * @param type 类型,1-通用,2-商品,3-品类 + * @param productId 产品id,搜索产品指定优惠券 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getH5List(Integer type, Integer productId, PageParamRequest pageParamRequest); + + /** + * 修改优惠券状态 + * @param id 优惠券id + * @param status 状态 + */ + Boolean updateStatus(Integer id, Boolean status); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponUserService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponUserService.java new file mode 100644 index 0000000..f9547e5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreCouponUserService.java @@ -0,0 +1,87 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreCouponUserRequest; +import com.yzt.common.request.StoreCouponUserSearchRequest; +import com.yzt.common.request.UserCouponReceiveRequest; +import com.yzt.common.response.StoreCouponUserOrder; +import com.yzt.common.response.StoreCouponUserResponse; +import com.yzt.common.vo.MyRecord; + +import java.util.HashMap; +import java.util.List; + +/** + * StoreCouponUserService 接口 + * + */ +public interface StoreCouponUserService extends IService { + + /** + * 优惠券发放记录 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getList(StoreCouponUserSearchRequest request, PageParamRequest pageParamRequest); + + /** + * PC领取优惠券 + * @param storeCouponUserRequest 优惠券参数 + * @return Boolean + */ + Boolean receive(StoreCouponUserRequest storeCouponUserRequest); + + HashMap getMapByUserId(Integer userId); + + /** + * 当前订单可用优惠券 + * @param preOrderNo 预下单订单号 + * @return 可用优惠券集合 + */ + List getListByPreOrderNo(String preOrderNo); + + /** + * 优惠券过期定时任务 + */ + void overdueTask(); + + /** + * 用户领取优惠券 + */ + Boolean receiveCoupon(UserCouponReceiveRequest request); + + /** + * 支付成功赠送处理 + * @param couponId 优惠券编号 + * @param uid 用户uid + * @return MyRecord + */ + MyRecord paySuccessGiveAway(Integer couponId, Integer uid); + + /** + * 根据uid获取列表 + * @param uid uid + * @param pageParamRequest 分页参数 + * @return List + */ + List findListByUid(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取可用优惠券数量 + * @param uid 用户uid + */ + Integer getUseCount(Integer uid); + + /** + * 我的优惠券列表 + * @param type 类型,usable-可用,unusable-不可用 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + CommonPage getMyCouponList(String type, PageParamRequest pageParamRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInfoService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInfoService.java new file mode 100644 index 0000000..1099f20 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInfoService.java @@ -0,0 +1,90 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ActivityEnrollSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityEnrollResponse; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.common.vo.StoreOrderInfoVo; +import com.yzt.common.vo.VirtualRemarkVo; +import org.springframework.web.bind.annotation.ModelAttribute; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; + +/** + * StoreOrderInfoService 接口 + * + */ +public interface StoreOrderInfoService extends IService { + + HashMap> getMapInId(List orderIdList); + + PageInfo getEnrollmentListByActivity(Integer id, PageParamRequest pageParamRequest); + PageInfo getList(ActivityEnrollSearchRequest request, + PageParamRequest pageParamRequest); + + List getOrderListByOrderId(Integer orderId); + +// List getOrderListByProductId(Integer productId); + + /** + * 批量添加订单详情 + * @param storeOrderInfos 订单详情集合 + * @return 保存结果 + */ + boolean saveOrderInfos(List storeOrderInfos); + + /** + * 通过订单编号和规格号查询 + * @param uni 规格号 + * @param orderId 订单编号 + * @return StoreOrderInfo + */ + StoreOrderInfo getByUniAndOrderId(String uni, Integer orderId); + + /** + * 获取订单详情vo列表 + * @param orderId 订单id + * @return List + */ + List getVoListByOrderId(Integer orderId); + + /** + * 获取订单详情-订单编号 + * @param orderNo 订单编号 + * @return List + */ + List getListByOrderNo(String orderNo); + + /** + * 根据时间、商品id获取销售件数 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + * @return Integer + */ + Integer getSalesNumByDateAndProductId(String date, Integer proId); + + /** + * 根据时间、商品id获取销售额 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + * @return BigDecimal + */ + BigDecimal getSalesByDateAndProductId(String date, Integer proId); + + /** + * 根据订单id、商品id、商品唯一id更新回复状态 + * + * @param orderId 订单id + * @param productId 商品id + * @param unique 商品唯一id + * @return + */ + void updateReply(Integer orderId, Integer productId, String unique); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInvoiceService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInvoiceService.java new file mode 100644 index 0000000..0de7dbf --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderInvoiceService.java @@ -0,0 +1,47 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.vo.InvoiceRequestVo; + +import java.math.BigDecimal; + +/** + * 订单发票服务接口 + */ +public interface StoreOrderInvoiceService extends IService { + + /** + * 保存订单发票信息 + * @param orderId 订单号 + * @param invoiceRequestVo 发票请求信息 + * @param invoiceAmount 开票金额 + * @return 是否保存成功 + */ + boolean saveOrderInvoice(String orderId, InvoiceRequestVo invoiceRequestVo, BigDecimal invoiceAmount); + + /** + * 验证发票信息 + * @param invoiceRequestVo 发票请求信息 + */ + void validateInvoiceInfo(InvoiceRequestVo invoiceRequestVo); + + /** + * 根据订单号查询发票信息 + * @param orderId 订单号 + * @return 发票信息 + */ + StoreOrderInvoice getByOrderId(String orderId); + + /** + * 更新发票开票状态 + * @param orderId 订单号 + * @param invoiceStatus 开票状态 + * @param invoiceCode 发票代码 + * @param invoiceNumber 发票号码 + * @param invoiceUrl 电子发票URL + * @return 是否更新成功 + */ + boolean updateInvoiceStatus(String orderId, Integer invoiceStatus, String invoiceCode, + String invoiceNumber, String invoiceUrl); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderRefundService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderRefundService.java new file mode 100644 index 0000000..5d89aa1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderRefundService.java @@ -0,0 +1,15 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.request.StoreOrderRefundRequest; + + +/** + * StoreOrderRefundService 接口 + * + */ +public interface StoreOrderRefundService extends IService { + + void refund(StoreOrderRefundRequest request, StoreOrder storeOrder); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderService.java new file mode 100644 index 0000000..1bc820f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderService.java @@ -0,0 +1,444 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.vo.ExpressSheetVo; +import com.yzt.common.vo.LogisticsResultVo; +import com.yzt.common.vo.VirtualRemarkVo; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * StoreOrderService 接口 + * + */ +public interface StoreOrderService extends IService { + + /** + * 列表(PC) + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return CommonPage + */ + CommonPage getAdminList(StoreOrderSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 核销列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + SystemWriteOffOrderResponse getWriteOffList(SystemWriteOffOrderSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 累计消费 + * @param userId Integer 用户id + * @return UserBalanceResponse + */ + BigDecimal getSumBigDecimal(Integer userId, String date); + + /** + * H5订单列表 + * @param uid 用户uid + * @param status 评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成,-3=售后/退款 + * @param pageParamRequest 分页参数 + * @return 订单结果列表 + */ + List getUserOrderList(Integer uid, Integer status, PageParamRequest pageParamRequest); + PageInfo getUserOrderList_2_3(String keywords, Integer uid, Integer status, PageParamRequest pageParamRequest); + /** + * 创建订单 + * @param storeOrder 订单参数 + * @return 创建结果 + */ + boolean create(StoreOrder storeOrder); + + /** + * 根据属性仅仅获取一条 + * @param storeOrder 参数 + * @return 当前查询结果 + */ + StoreOrder getByEntityOne(StoreOrder storeOrder); + + /** + * h5 top data 工具方法 + * @param status 状态参数 + * @return 查询到的订单结果 + */ + Integer getTopDataUtil(Integer status, Integer userId); + + List getOrderGroupByDate(String dateLimit, int lefTime); + + boolean refund(StoreOrderRefundRequest request); + + /** + * 订单详情(PC) + * @param orderNo 订单编号 + * @return StoreOrderInfoResponse + */ + StoreOrderInfoResponse info(String orderNo); + + String send(StoreOrderSendRequest request); + + /** + * 订单备注 + * @param orderNo 订单编号 + * @param mark 备注 + * @return Boolean + */ + Boolean mark(String orderNo, String mark); + + /** + * 拒绝退款 + * @param orderNo 订单编号 + * @param reason String 原因 + * @return Boolean + */ + Boolean refundRefuse(String orderNo, String reason); + + StoreOrder getInfoByEntity(StoreOrder storeOrder); + + /** + * 获取订单快递信息 + * @param orderNo 订单编号 + * @return LogisticsResultVo + */ + LogisticsResultVo getLogisticsInfo(String orderNo); + + /** + * 根据时间参数统计订单价格 + * @param dateLimit 时间区间 + * @param type 1=price 2=订单量 + * @return 统计订单信息 + */ + StoreOrderStatisticsResponse orderStatisticsByTime(String dateLimit, Integer type); + + /** + * 获取用户当天的秒杀数量 + * + * @param uid 用户uid + * @param seckillId 秒杀商品id + * @return 用户当天的秒杀商品订单数量 + */ + List getUserCurrentDaySecKillOrders(Integer uid, Integer seckillId); + + /** + * 获取用户当前的砍价订单 + * @param uid 用户uid + * @return 用户当前的砍价订单 + */ + List getUserCurrentBargainOrders(Integer uid, Integer bargainId); + + /** + * 获取用户当前的拼团订单 + * @param uid 用户uid + * @return 用户当前的拼团订单 + */ + List getUserCurrentCombinationOrders(Integer uid, Integer combinationId); + + StoreOrder getByOderId(String orderId); + + /** + * 获取面单默认配置信息 + * @return ExpressSheetVo + */ + ExpressSheetVo getDeliveryInfo(); + + /** + * 更新支付结果 + * @param orderNo 订单编号 + */ + Boolean updatePaid(String orderNo); + + /** + * 跟据订单号列表获取订单列表Map + * @param orderNoList 订单号列表 + * @return Map + */ + Map getMapInOrderNo(List orderNoList); + + /** + * 获取推广订单总金额 + * @param orderNoList 订单编号列表 + * @return BigDecimal + */ + BigDecimal getSpreadOrderTotalPriceByOrderList(List orderNoList); + + /** + * 获取所有收货订单id集合 + * @return List + */ + List findIdAndUidListByReceipt(); + + /** + * 根据用户uid查询所有已支付订单 + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + List findPaidListByUid(Integer userId, PageParamRequest pageParamRequest); + + /** + * 订单改价 + * @param request 改价请求对象 + * @return 改价是否成功 + */ + Boolean updatePrice(StoreOrderUpdatePriceRequest request); + + /** + * 获取订单总数量 + * @param uid 用户uid + * @return Integer + */ + Integer getOrderCountByUid(Integer uid); + + /** + * 获取用户总消费金额 + * @param userId 用户uid + * @return BigDecimal + */ + BigDecimal getSumPayPriceByUid(Integer userId); + + /** + * 获取用户总消费金额 + * @param uid 用户uid + * @return BigDecimal + */ + BigDecimal getTotalPaidAmountByUid(Integer uid); + + /** + * 获取用户总销售金额 + * @param uids 用户uid + * @return BigDecimal + */ + BigDecimal getTotalPaidAmountByUids(List uids); + /** + * 获取订单数量(时间) + * @param uid 用户uid + * @return Integer + */ + Integer getOrderCountByUidAndDate(Integer uid, String date); + + /** + * 获取用户消费金额(时间) + * @param userId 用户uid + * @return BigDecimal + */ + BigDecimal getSumPayPriceByUidAndDate(Integer userId, String date); + + /** + * 获取砍价订单 + * @param bargainId 砍价商品id + * @param bargainUserId 用户砍价活动id + * @return StoreOrder + */ + StoreOrder getByBargainOrder(Integer bargainId, Integer bargainUserId); + + /** + * 获取订单状态数量 + * @param dateLimit 时间端 + * @param type 订单类型:0普通订单,1-视频号订单, 2-活动订单,3-全部订单 + * @param orderNo 订单号 + * @return StoreOrderCountItemResponse + */ + StoreOrderCountItemResponse getOrderStatusNum(String dateLimit, Integer type, String orderNo); + + /** + * 获取订单统计数据 + * @param dateLimit 时间端 + * @return StoreOrderTopItemResponse + */ + StoreOrderTopItemResponse getOrderData(String dateLimit); + + /** + * 订单删除 + * @param orderNo 订单编号 + * @return Boolean + */ + Boolean delete(String orderNo); + +// /** +// * 视频订单发货 +// * @param request 发货请求参数 +// * @return Boolean +// */ +// Boolean videoSend(VideoOrderSendRequest request); + + /** + * 通过日期获取商品交易件数 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getOrderProductNumByDate(String date); + + /** + * 通过日期获取商品交易成功件数 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getOrderSuccessProductNumByDate(String date); + + /** + * 通过日期获取订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getOrderNumByDate(String date); + + /** + * 通过日期获取支付订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getPayOrderNumByDate(String date); + + /** + * 通过日期获取支付订单金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getPayOrderAmountByDate(String date); + + /** + * 通过日期获取支付订单金额 + * @param startDate 日期 + * @param endDate 日期 + * @return BigDecimal + */ + BigDecimal getPayOrderAmountByPeriod(String startDate, String endDate); + + /** + * 通过日期获取余额支付订单支付金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getYuePayOrderAmountByDate(String date); + + /** + * 获取累计消费金额 + * @return BigDecimal + */ + BigDecimal getTotalPrice(); + + /** + * 统计在指定完成时间区间内且状态为已完成(status=3)的订单支付金额总和 + * @param startTime 开始时间(含) + * @param endTime 结束时间(含) + * @return BigDecimal + */ + BigDecimal getCompletedPayPriceByFinishTimeRange(Date startTime, Date endTime); + + /** + * 根据日期获取下单用户数量 + * @param date 日期 + * @return Integer + */ + Integer getOrderUserNumByDate(String date); + + /** + * 根据日期获取下单用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getOrderUserNumByPeriod(String startDate, String endDate); + + /** + * 根据日期获取成交用户数量 + * @param date 日期 + * @return Integer + */ + Integer getOrderPayUserNumByDate(String date); + + /** + * 根据日期获取成交用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getOrderPayUserNumByPeriod(String startDate, String endDate); + + /** + * 根据用户uid列表获取成交用户数量 + * @param uidList 用户列表 + * @return Integer + */ + Integer getOrderPayUserNumByUidList(List uidList); + + /** + * 根据用户uid列表获取支付金额 + * @param uidList 用户列表 + * @return BigDecimal + */ + BigDecimal getPayOrderAmountByUidList(List uidList); + + /** + * 获取待发货订单数量 + * @return Integer + */ + Integer getNotShippingNum(); + + /** + * 获取退款中订单数量 + */ + Integer getRefundingNum(); + + /** + * 获取待核销订单数量 + */ + Integer getNotWriteOffNum(); + + /** + * 获取佣金相关数据 + * @param uid 用户uid + * @param spreadId 推广人uid + */ + OrderBrokerageData getBrokerageData(Integer uid, Integer spreadId); + + /** + * 获取待收货订单 + * @param sendTime 发货时间 + * @return List + */ + List findAwaitTakeDeliveryOrderList(String sendTime); + + /** + * 更改订单运单号 + */ + Boolean updateTrackingNumber(StoreOrderSendRequest request); + + /** + * 一号通商家寄件 寄件 + * @param request 寄件请求数据 + * @param storeOrder 当前操作订单数据 + */ + void expressForOnePassShipment(StoreOrderSendRequest request, StoreOrder storeOrder); + + /** + * 一号通商家寄件 快递揽件回调 + * @param jsonObject 回调结果 + */ + void expressForOnePassShipmentTakeCallBack(JSONObject jsonObject); + + + /** + * 一号通商家寄件 取消寄件回调 + * @param jsonObject 回调结果 + */ + void expressForOnePassShipmentCancelCallBack(JSONObject jsonObject); + + /** + * 获取用户总销售金额 + * @param ids 订单id + * @return + */ + List getVirtualRemarkVoByIds(List ids); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderStatusService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderStatusService.java new file mode 100644 index 0000000..1684120 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderStatusService.java @@ -0,0 +1,70 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.order.StoreOrderStatus; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreOrderStatusSearchRequest; + +import java.math.BigDecimal; +import java.util.List; + +/** + * StoreOrderStatusService 接口 + * + */ +public interface StoreOrderStatusService extends IService { + + /** + * 订单操作记录列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(StoreOrderStatusSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 保存订单退款记录 + * @param orderId 订单id + * @param amount 金额 + * @param message 备注 + * @return Boolean + */ + Boolean saveRefund(Integer orderId, BigDecimal amount, String message); + + /** + * 添加订单日志 + * @param orderId 订单id + * @param type 类型 + * @param message 备注 + * @return Boolean + */ + Boolean createLog(Integer orderId, String type, String message); + + /** + * 根据实体参数获取 + * @param storeOrderStatus 订单状态参数 + * @return 订单状态结果 + */ + List getByEntity(StoreOrderStatus storeOrderStatus); + + /** + * 根据订单id获取最后一条记录 + * @param orderId 订单id + * @return StoreOrderStatus + */ + StoreOrderStatus getLastByOrderId(Integer orderId); + + /** + * 通过日期获取订单退款数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getRefundOrderNumByDate(String date); + + /** + * 通过日期获取订单退款金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getRefundOrderAmountByDate(String date); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderTaskService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderTaskService.java new file mode 100644 index 0000000..9c8d10f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderTaskService.java @@ -0,0 +1,21 @@ +package com.yzt.service.service; + + +import com.yzt.common.model.order.StoreOrder; + +/** + * 订单任务服务 + * + */ +public interface StoreOrderTaskService { + + Boolean cancelByUser(StoreOrder storeOrder); + + Boolean complete(StoreOrder storeOrder); + + Boolean refundOrder(StoreOrder storeOrder); + + Boolean autoCancel(StoreOrder storeOrder); + + Boolean orderReceiving(Integer orderId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderVerification.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderVerification.java new file mode 100644 index 0000000..5e77882 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreOrderVerification.java @@ -0,0 +1,40 @@ +package com.yzt.service.service; + + +import com.yzt.common.request.StoreOrderStaticsticsRequest; +import com.yzt.common.response.StoreOrderVerificationConfirmResponse; +import com.yzt.common.response.StoreStaffDetail; +import com.yzt.common.response.StoreStaffTopDetail; + +import java.util.List; + +/** + * 订单核销业务 + * + */ +public interface StoreOrderVerification { + /** + * 获取订单核销数据 + */ + StoreStaffTopDetail getOrderVerificationData(); + + /** + * 核销月详情 + * @return 月详情 + */ + List getOrderVerificationDetail(StoreOrderStaticsticsRequest request); + + /** + * 根据核销码核销订单 + * @param vCode 核销码 + * @return 核销结果 + */ + boolean verificationOrderByCode(String vCode); + + /** + * 根据核销码查询待核销订单 + * @param vCode 核销码 + * @return 待核销订单详情 + */ + StoreOrderVerificationConfirmResponse getVerificationOrderByCode(String vCode); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StorePinkService.java b/fightwine-service/src/main/java/com/yzt/service/service/StorePinkService.java new file mode 100644 index 0000000..793d4db --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StorePinkService.java @@ -0,0 +1,105 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StorePinkSearchRequest; +import com.yzt.common.response.StorePinkAdminListResponse; +import com.yzt.common.response.StorePinkDetailResponse; + +import java.util.List; + +/** + * StorePinkService + * + */ +public interface StorePinkService extends IService { + + /** + * 获取拼团列表 + * @param request + * @param pageParamRequest + * @return + */ + PageInfo getList(StorePinkSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 获取拼团列表Cid + * @param cid 拼团商品id + * @return + */ + List getListByCid(Integer cid); + + /** + * 实体查询 + * @param storePink + * @return + */ + List getByEntity(StorePink storePink); + + /** + * PC拼团详情列表 + * @param pinkId 团长pinkId + * @return + */ + List getAdminList(Integer pinkId); + + /** + * 查询拼团列表 + * @param cid + * @param kid + */ + List getListByCidAndKid(Integer cid, Integer kid); + + /** + * 根据团长拼团id获取拼团人数 + * @param pinkId + * @return + */ + Integer getCountByKid(Integer pinkId); + + /** + * 检查状态,更新数据 + */ + void detectionStatus(); + + /** + * 拼团成功 + * @param kid + * @return + */ + boolean pinkSuccess(Integer kid); + + /** + * 根据订单编号获取 + * @param orderId + * @return + */ + StorePink getByOrderId(String orderId); + + /** + * 获取最后3个拼团信息(不同用户) + * @return List + */ + List findSizePink(Integer size); + + /** + * 获取拼团参与总人数 + * @return Integer + */ + Integer getTotalPeople(); + + + /** + * 获取用户拼团列表 + * @return StorePink + */ + List getListByUid(Integer uid , Integer type); + + /** + * 使指定订单号的所有排队记录失效,并重新计算剩余排队的 queueNo 与进度 + * @param orderId 订单号 + */ + void invalidateQueueByOrderId(String orderId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrResultService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrResultService.java new file mode 100644 index 0000000..33c6a4e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrResultService.java @@ -0,0 +1,20 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductAttrResult; + +import java.util.List; + +/** + * StoreProductAttrResultService 接口 + * + */ +public interface StoreProductAttrResultService extends IService { + + /** + * 根据商品属性值集合查询 + * @param storeProductAttrResult 查询参数 + * @return 查询结果 + */ + List getByEntity(StoreProductAttrResult storeProductAttrResult); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrService.java new file mode 100644 index 0000000..2041910 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrService.java @@ -0,0 +1,43 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductAttr; + +import java.util.List; + +/** + * StoreProductAttrService 接口 + * + */ +public interface StoreProductAttrService extends IService { + + /** + * 根据基本属性查询商品属性详情 + * @param storeProductAttr 商品属性 + * @return 查询商品属性集合 + */ + List getByEntity(StoreProductAttr storeProductAttr); + + /** + * 根据id删除商品 + * @param productId 待删除商品id + * @param type 类型区分是是否添加营销 + */ + void removeByProductId(Integer productId,int type); + + /** + * 删除商品规格 + * @param productId 商品id + * @param type 商品类型 + * @return Boolean + */ + Boolean deleteByProductIdAndType(Integer productId, Integer type); + + /** + * 获取商品规格列表 + * @param productId 商品id + * @param type 商品类型 + * @return List + */ + List getListByProductIdAndType(Integer productId, Integer type); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrValueService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrValueService.java new file mode 100644 index 0000000..549c853 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductAttrValueService.java @@ -0,0 +1,98 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductAttrValue; + +import java.util.List; + +/** + * StoreProductAttrValueService 接口 + * + */ +public interface StoreProductAttrValueService extends IService { + + /** + * 根据商品id和attrId获取列表集合 + * @param productId 商品id + * @param attrId 属性id + * @param type 商品类型 + * @return 商品属性集合 + */ + List getListByProductIdAndAttrId(Integer productId, String attrId, Integer type); + + /** + * 根据商品属性查询 + * @param storeProductAttrValue 商品属性参数 + * @return 商品属性结果 + */ + List getByEntity(StoreProductAttrValue storeProductAttrValue); + + /** + * 根据商品删除attrValue + * @param productId 商品id + * @param type 类型区分是是否添加营销 + * @return 删除结果 + */ + boolean removeByProductId(Integer productId,int type); + + /** + * 根据id、类型查询 + * @param id ID + * @param type 类型 + * @return StoreProductAttrValue + */ + StoreProductAttrValue getByIdAndProductIdAndType(Integer id, Integer productId, Integer type); + + /** + * 根据sku查询 + * @param productId 商品id + * @param suk sku + * @param type 规格类型 + * @return StoreProductAttrValue + */ + StoreProductAttrValue getByProductIdAndSkuAndType(Integer productId, String suk, Integer type); + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param operationType 类型:add—添加,sub—扣减 + * @param type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + */ + Boolean operationStock(Integer id, Integer num, String operationType, Integer type, Integer version); + + /** + * 删除商品规格属性值 + * @param productId 商品id + * @param type 商品类型 + * @return Boolean + */ + Boolean deleteByProductIdAndType(Integer productId, Integer type); + + /** + * 获取商品规格列表 + * @param productId 商品id + * @param type 商品类型 + * @return List + */ + List getListByProductIdAndType(Integer productId, Integer type); + + /** + * 根据商品id和attrIdList获取 商品属性列表集合 + * @param productId 商品id + * @param attrIdList 属性idList + * @return 商品属性集合 + */ + List getByProductIdAndAttrIdList(Integer productId, List attrIdList); + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param operationType 类型:add—添加,sub—扣减 + * @param version 版本 + */ + Boolean operationStock(Integer id, Integer num, String operationType, Integer version); + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductCouponService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductCouponService.java new file mode 100644 index 0000000..c2ef8a2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductCouponService.java @@ -0,0 +1,25 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductCoupon; + +import java.util.List; + +/** + * StoreProductCouponService 接口 + * + */ +public interface StoreProductCouponService extends IService { + /** + * 根据产品id删除 优惠券关联信息 + * @param productId 产品id + */ + boolean deleteByProductId(Integer productId); + + /** + * 根据商品id获取已关联优惠券信息 + * @param productId 商品id + * @return 已关联优惠券 + */ + List getListByProductId(Integer productId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductDescriptionService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductDescriptionService.java new file mode 100644 index 0000000..1ef752f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductDescriptionService.java @@ -0,0 +1,26 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductDescription; + +/** + * StoreProductDescriptionService 接口 + * + */ +public interface StoreProductDescriptionService extends IService { + + /** + * 根据商品id和type删除对应描述 + * @param productId 商品id + * @param type 类型 + */ + void deleteByProductId(int productId,int type); + + /** + * 获取详情 + * @param productId 商品id + * @param type 商品类型 + * @return + */ + StoreProductDescription getByProductIdAndType(Integer productId, Integer type); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductLogService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductLogService.java new file mode 100644 index 0000000..237e81b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductLogService.java @@ -0,0 +1,12 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.log.StoreProductLog; + +/** + * StoreProductLogService 接口 + * + */ +public interface StoreProductLogService extends IService { + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRelationService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRelationService.java new file mode 100644 index 0000000..f15b695 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRelationService.java @@ -0,0 +1,85 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductRelation; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserCollectAllRequest; +import com.yzt.common.request.UserCollectRequest; +import com.yzt.common.response.UserRelationResponse; + +import java.util.List; + +/** + * StoreProductRelationService 接口 + * + */ +public interface StoreProductRelationService extends IService { + + List getList(Integer productId, String type); + + /** + * 取消收藏 + * @param requestJson 收藏idsJson + * @return Boolean + */ + Boolean delete(String requestJson); + + /** + * 批量收藏 + * @param request 收藏参数 + * @return Boolean + */ + Boolean all(UserCollectAllRequest request); + + List getLikeOrCollectByUser(Integer userId, Integer productId,boolean isLike); + + /** + * 获取用户收藏列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getUserList(PageParamRequest pageParamRequest); + + /** + * 获取用户的收藏数量 + * @param uid 用户uid + * @return 收藏数量 + */ + Integer getCollectCountByUid(Integer uid); + + /** + * 根据商品Id取消收藏 + * @param proId 商品Id + * @return Boolean + */ + Boolean deleteByProId(Integer proId); + + /** + * 根据商品Id取消收藏 + * @param proId 商品Id + * @return Boolean + */ + Boolean deleteByProIdAndUid(Integer proId); + + /** + * 根据日期获取收藏量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getCountByDate(String date); + + /** + * 根据日期获取收藏量 + * @param date 日期,yyyy-MM-dd格式 + * @param proId 商品id + * @return Integer + */ + Integer getCountByDateAndProId(String date, Integer proId); + + /** + * 添加收藏 + * @param request 收藏参数 + */ + Boolean add(UserCollectRequest request); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductReplyService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductReplyService.java new file mode 100644 index 0000000..498d916 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductReplyService.java @@ -0,0 +1,91 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.product.StoreProductReply; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductReplyAddRequest; +import com.yzt.common.request.StoreProductReplyCommentRequest; +import com.yzt.common.request.StoreProductReplySearchRequest; +import com.yzt.common.response.ProductDetailReplyResponse; +import com.yzt.common.response.ProductReplyResponse; +import com.yzt.common.response.StoreProductReplyResponse; +import com.yzt.common.vo.MyRecord; + +/** + * StoreProductReplyService 接口 + * + */ +public interface StoreProductReplyService extends IService { + + /** + * 商品评论列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getList(StoreProductReplySearchRequest request, PageParamRequest pageParamRequest); + + /** + * 创建订单商品评价 + * @param request 请求参数 + * @return Boolean + */ + Boolean create(StoreProductReplyAddRequest request); + + /** + * 添加虚拟评论 + * @param request 评论参数 + * @return 评论结果 + */ + boolean virtualCreate(StoreProductReplyAddRequest request); + + /** + * 查询是否已经回复 + * @param unique skuId + * @param orderId 订单id + * @return Boolean + */ + Boolean isReply(String unique, Integer orderId); + + /** + * H5商品评论统计 + * @param productId 商品编号 + * @return MyRecord + */ + MyRecord getH5Count(Integer productId); + + /** + * H5商品详情评论信息 + * @param proId 商品编号 + * @return ProductDetailReplyResponse + */ + ProductDetailReplyResponse getH5ProductReply(Integer proId); + + /** + * 移动端商品评论列表 + * @param proId 商品编号 + * @param type 评价等级|0=全部,1=好评,2=中评,3=差评 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getH5List(Integer proId, Integer type, PageParamRequest pageParamRequest); + + /** + * 删除评论 + * @param id 评论id + * @return Boolean + */ + Boolean delete(Integer id); + + /** + * 商品评论回复 + * @param request 回复参数 + */ + Boolean comment(StoreProductReplyCommentRequest request); + + /** + * 获取统计数据(好评、中评、差评) + */ + Integer getCountByScore(Integer productId, String type); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRuleService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRuleService.java new file mode 100644 index 0000000..a403fc1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductRuleService.java @@ -0,0 +1,38 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.product.StoreProductRule; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductRuleRequest; +import com.yzt.common.request.StoreProductRuleSearchRequest; + +import java.util.List; + +/** + * StoreProductRuleService 接口 + * + */ +public interface StoreProductRuleService extends IService { + + /** + * 商品规格列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(StoreProductRuleSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增商品规格 + * @param storeProductRuleRequest 规格参数 + * @return 新增结果 + */ + boolean save(StoreProductRuleRequest storeProductRuleRequest); + + /** + * 修改规格 + * @param storeProductRuleRequest 规格参数 + * @return Boolean + */ + Boolean updateRule(StoreProductRuleRequest storeProductRuleRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreProductService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductService.java new file mode 100644 index 0000000..38a2e20 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreProductService.java @@ -0,0 +1,248 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.request.*; +import com.yzt.common.response.ActivityEnrollResponse; +import com.yzt.common.response.StoreProductInfoResponse; +import com.yzt.common.response.StoreProductResponse; +import com.yzt.common.response.StoreProductTabsHeader; +import com.yzt.common.vo.MyRecord; +import org.json.JSONException; + +import java.io.IOException; +import java.util.List; + +/** + * StoreProductService 接口 + * + */ +public interface StoreProductService extends IService { + + /** + * 获取产品列表Admin + * @param request 筛选参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getAdminList(StoreProductSearchRequest request, PageParamRequest pageParamRequest); + /** + * 获取活动产品列表Admin + * @param request 筛选参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getActivityList(ActivityEnrollSearchRequest request, PageParamRequest pageParamRequest); + /** + * 根据id集合获取商品信息 + * @param productIds id集合 + * @return 商品信息 + */ + List getListInIds(List productIds); + + /** + * 新增商品 + * @param request 商品请求对象 + * @return Boolean + */ + Boolean save(StoreProductAddRequest request); + + /** + * 更新商品信息 + * @param storeProductRequest 商品参数 + * @return 更新结果 + */ + Boolean update(StoreProductAddRequest storeProductRequest); + + /** + * 产品详情 + * @param id 商品id + * @return StoreProductResponse + */ + StoreProductResponse getByProductId(Integer id); + + /** + * 通过ID获取商品列表 + * + * @param proIdsList 商品ID列表 + * @param label admin-管理端,front-移动端 + */ + List findByIds(List proIdsList, String label); + + /** + * 商品详情(管理端) + * @param id 商品id + * @return StoreProductInfoResponse + */ + StoreProductInfoResponse getInfo(Integer id); + + /** + * 获取tabsHeader对应数量 + * @return List + */ + List getTabsHeader(StoreProductHeaderRequest request); + + /** + * 根据其他平台url导入产品信息 + * @param url 待倒入平台的url + * @param tag 待导入平台标识 + * @return 待导入的商品信息 + */ + StoreProductRequest importProductFromUrl(String url, int tag) throws IOException, JSONException; + + /** + * 删除商品 + * @param productId 商品id + * @param type 类型:recycle——回收站 delete——彻底删除 + * @return 删除结果 + */ + Boolean deleteProduct(Integer productId, String type); + + /** + * 恢复已删除商品 + * @param productId 商品id + * @return 恢复结果 + */ + Boolean reStoreProduct(Integer productId); + + /** + * 后台任务批量操作库存 + */ + void consumeProductStock(); + + /** + * 扣减库存任务操作 + * @param storeProductStockRequest 扣减库存参数 + * @return 执行结果 + */ + boolean doProductStock(StoreProductStockRequest storeProductStockRequest); + + /** + * 获取复制商品配置 + */ + MyRecord copyConfig(); + + /** + * 复制平台商品 + * @param url 商品链接 + * @return + */ + MyRecord copyProduct(String url); + + /** + * 添加/扣减库存 + * @param id 商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationStock(Integer id, Integer num, String type, Integer version); + + /** + * 下架 + * @param id 商品id + */ + Boolean offShelf(Integer id); + + /** + * 上架 + * @param id 商品id + * @return Boolean + */ + Boolean putOnShelf(Integer id); + + /** + * 首页商品列表 + * @param type 类型 【1 精品推荐 2 热门榜单 3首发新品 4促销单品】 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + List getIndexProduct(Integer type, PageParamRequest pageParamRequest); + + /** + * 获取商品移动端列表 + * @param request 筛选参数 + * @param pageRequest 分页参数 + * @return List + */ + List findH5List(ProductRequest request, PageParamRequest pageRequest); + + /** + * 获取移动端商品详情 + * @param id 商品id + * @return StoreProduct + */ + StoreProduct getH5Detail(Integer id); + + /** + * 获取购物车商品信息 + * @param productId 商品编号 + * @return StoreProduct + */ + StoreProduct getCartByProId(Integer productId); + + /** + * 根据日期获取新增商品数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getNewProductByDate(String date); + + /** + * 获取所有未删除的商品 + * @return List + */ + List findAllProductByNotDelte(); + + /** + * 模糊搜索商品名称 + * @param productName 商品名称 + * @return List + */ + List likeProductName(String productName); + + /** + * 警戒库存数量 + * @return Integer + */ + Integer getVigilanceInventoryNum(); + + /** + * 销售中(上架)商品数量 + * @return Integer + */ + Integer getOnSaleNum(); + + /** + * 未销售(仓库)商品数量 + * @return Integer + */ + Integer getNotSaleNum(); + + /** + * 获取商品排行榜 + * @return List + */ + List getLeaderboard(); + + /** + * 是否有商品使用运费模板 + * @return Boolean + */ + Boolean isUseShippingTemplateId(Integer templateId); + + /** + * 获取商品所用的分类(包含父级分类) + * @param productIdList 商品ID列表 + * @return 商品分类及所有父级分类ID + */ + List getProductAllCategoryIdByProductIds(List productIdList); + + /** + * 快捷添加库存 + * + * @param request 添加库存参数 + * @return Boolean + */ + Boolean quickAddStock(ProductAddStockRequest request); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillMangerService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillMangerService.java new file mode 100644 index 0000000..73005d7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillMangerService.java @@ -0,0 +1,79 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.seckill.StoreSeckillManger; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreSeckillMangerRequest; +import com.yzt.common.request.StoreSeckillMangerSearchRequest; +import com.yzt.common.response.StoreSeckillManagerResponse; + +import java.util.List; + +/** + * StoreSeckillMangerService 接口 + * + */ +public interface StoreSeckillMangerService extends IService { + + /** + * 秒杀配置列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(StoreSeckillMangerSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 删除秒杀配置 逻辑删除 + * @param id 待删除id + * @return 删除结果 + */ + boolean deleteLogicById(int id); + + /** + * 详情 + * @param id 配置id + * @return 查询到的结果 + */ + StoreSeckillManagerResponse detail(int id); + + /** + * 获取正在秒杀的时间段 + * @return 正在秒杀的时间段 + */ + List getCurrentSeckillManager(); + + /** + * 更新秒杀配置状态 + * @param id id + * @param status 待更新状态 + * @return 结果 + */ + Boolean updateStatus(Integer id, String status); + + /** + * 更新秒杀配置 + * @param id id + * @param storeSeckillMangerRequest 秒杀配置 + * @return 结果 + */ + Boolean update(Integer id, StoreSeckillMangerRequest storeSeckillMangerRequest); + + /** + * 获取移动端列表(正在进行和马上开始的秒杀) + * @return List + */ + List getH5List(); + + /** + * 获取所有秒杀配置 + * @return List + */ + List getAllList(); + + /** + * 添加秒杀配置 + * @param storeSeckillMangerRequest 配置参数 + */ + Boolean saveManger(StoreSeckillMangerRequest storeSeckillMangerRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillService.java b/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillService.java new file mode 100644 index 0000000..94d7d8e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/StoreSeckillService.java @@ -0,0 +1,121 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.seckill.StoreSeckill; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreSeckillAddRequest; +import com.yzt.common.request.StoreSeckillSearchRequest; +import com.yzt.common.response.*; + +import java.util.List; + +/** + * StoreSeckillService 接口 + * + */ +public interface StoreSeckillService extends IService { + + /** + * 秒杀产品列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getList(StoreSeckillSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 逻辑删除 + * @param id 秒杀id + * @return 删除结果 + */ + Boolean deleteById(Integer id); + + /** + * 新增秒杀商品 + * @param request 待新增秒杀商品 + * @return 新增结果 + */ + Boolean saveSeckill(StoreSeckillAddRequest request); + + /** + * 秒杀商品详情 H5 + * @param skillId 秒杀商品id + * @return 详情 + */ + StoreSeckillDetailResponse getDetailH5(Integer skillId); + + /** + * 秒杀商品详情 管理端 + * @param skillId 秒杀id + * @return 详情数据 + */ + StoreProductInfoResponse getDetailAdmin(Integer skillId); + + /** + * 更新秒杀商品 + * @param request 待更新秒杀商品 + * @return 更新结果 + */ + Boolean updateSeckill(StoreSeckillAddRequest request); + + /** + * 更新秒杀状态 + * @param secKillId 秒杀id + * @param status 秒杀状态 + * @return 更新结果 + */ + Boolean updateSecKillStatus(int secKillId,boolean status); + + /** + * 移动端 获取秒杀配置 + * @return 秒杀配置 + */ + List getForH5Index(); + + /** + * 根据秒杀时间段查询已配置的秒杀商品 + * @param timeId 秒杀id + * @return 秒杀中的商品 + */ + List getKillListByTimeId(String timeId, PageParamRequest pageParamRequest); + + /** + * 根据商品id查询正在秒杀的商品信息 + * @param productId 商品id + * @return 正在参与的秒杀信息 + */ + List getCurrentSecKillByProductId(Integer productId); + + /** + * 后台任务批量操作库存 + */ + void consumeProductStock(); + + /** + * 商品是否存在秒杀活动 + * @param productId 商品编号 + */ + Boolean isExistActivity(Integer productId); + + /** + * 查询带异常 + * @param id 秒杀商品id + * @return StoreSeckill + */ + StoreSeckill getByIdException(Integer id); + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationStock(Integer id, Integer num, String type); + + /** + * 获取秒杀首页信息 + * @return SeckillIndexResponse + */ + SeckillIndexResponse getIndexInfo(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SubsidyRewardService.java b/fightwine-service/src/main/java/com/yzt/service/service/SubsidyRewardService.java new file mode 100644 index 0000000..1e2c828 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SubsidyRewardService.java @@ -0,0 +1,14 @@ +package com.yzt.service.service; + +import java.util.Date; + +/** + * 每周补贴奖励服务 + */ +public interface SubsidyRewardService { + + /** + * 计算并发放上周的补贴奖励(等级5/6均分) + */ + void weeklySubsidyReward(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemAdminService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemAdminService.java new file mode 100644 index 0000000..8c45466 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemAdminService.java @@ -0,0 +1,78 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAdminAddRequest; +import com.yzt.common.request.SystemAdminRequest; +import com.yzt.common.request.SystemAdminUpdateRequest; +import com.yzt.common.response.SystemAdminResponse; + +import java.util.HashMap; +import java.util.List; + +/** + * SystemAdminService 接口 + * + */ +public interface SystemAdminService extends IService { + + /** + * 后台管理员列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(SystemAdminRequest request, PageParamRequest pageParamRequest); + + /** + * 新增管理员 + */ + Boolean saveAdmin(SystemAdminAddRequest systemAdminAddRequest); + + /** + * 更新管理员 + */ + Boolean updateAdmin(SystemAdminUpdateRequest systemAdminRequest); + + /** + * 修改后台管理员状态 + * @param id 管理员id + * @param status 状态 + * @return Boolean + */ + Boolean updateStatus(Integer id, Boolean status); + + /** + * 根据idList获取Map + * @param adminIdList id数组 + * @return HashMap + */ + HashMap getMapInId(List adminIdList); + + /** + * 修改后台管理员是否接收状态 + * @param id 管理员id + * @return Boolean + */ + Boolean updateIsSms(Integer id); + + /** + * 获取可以接收短信的管理员 + */ + List findIsSmsList(); + + /** + * 管理员详情 + * @param id 管理员id + * @return SystemAdmin + */ + SystemAdmin getDetail(Integer id); + + /** + * 通过用户名获取用户 + * @param username 用户名 + * @return SystemAdmin + */ + SystemAdmin selectUserByUserName(String username); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemAttachmentService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemAttachmentService.java new file mode 100644 index 0000000..7eed01e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemAttachmentService.java @@ -0,0 +1,90 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemAttachment; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAttachmentMoveRequest; +import com.yzt.common.request.SystemAttachmentRequest; + +import java.util.List; + +/** + * SystemAttachmentService 接口 + * + */ +public interface SystemAttachmentService extends IService { + + /** + * 同步到云服务, 更新图片上传类型 + * @param attId Integer 主键id + * @param type int 图片上传类型 1本地 2七牛云 3OSS 4COS + */ + void updateCloudType(Integer attId, int type); + + /** + * 附件分页 + * @param pid Integer pid + * @param attType 格式png,jpeg,jpg,audio/mpeg,text/plain,video/mp4,gif + * @param pageParamRequest PageParamRequest 分页参数 + * @return List + */ + List getList(Integer pid, String attType, PageParamRequest pageParamRequest); + + /** + * 给图片加前缀 + * @param path String 路径 + * @return String + */ + String prefixImage(String path); + + /** + * 给前端上传的文件加前缀 + * @param path 路径 + * @return 替换后的 + */ + String prefixUploadf(String path); + + /** + * 给文件加前缀 + * @param path String 路径 + * @return String + */ + String prefixFile(String path); + + /** + * 清除 cdn url, 在保存数据的时候使用 + * @param path String 文件路径 + * @return String + */ + String clearPrefix(String path); + + /** + * 新增附件 + * @param systemAttachmentRequest 新增参数 + */ + Boolean add(SystemAttachmentRequest systemAttachmentRequest); + + /** + * 编辑附件 + * @param systemAttachmentRequest 更新参数 + */ + Boolean edit(SystemAttachmentRequest systemAttachmentRequest); + + /** + * 更改图片目录 + * @param move 参数 + */ + Boolean updateAttrId(SystemAttachmentMoveRequest move); + + /** + * 获取cdn url + * @return String + */ + String getCdnUrl(); + + /** + * 删除附件 + * @param idList 附件ID列表 + */ + Boolean deleteByIds(List idList); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemBankService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemBankService.java new file mode 100644 index 0000000..d889dd6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemBankService.java @@ -0,0 +1,13 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemBank; +import com.yzt.common.model.system.SystemCity; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +public interface SystemBankService extends IService { +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemCityAsyncService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemCityAsyncService.java new file mode 100644 index 0000000..8277c59 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemCityAsyncService.java @@ -0,0 +1,18 @@ +package com.yzt.service.service; + +/** + * SystemCityAsyncService 接口 + * + */ +public interface SystemCityAsyncService { + + /** + * 数据整体刷入redis + */ + void async(Integer id); + + /** + * 设置属性列表进入redis + */ + void setListTree(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemCityService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemCityService.java new file mode 100644 index 0000000..ba5340b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemCityService.java @@ -0,0 +1,73 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemCity; +import com.yzt.common.request.SystemCityRequest; +import com.yzt.common.request.SystemCitySearchRequest; +import com.yzt.common.vo.SystemCityTreeVo; + +import java.util.List; + +/** + * SystemCityService 接口 + * + */ +public interface SystemCityService extends IService { + + /** + * 分页城市列表 + * @param request 搜索条件 + */ + Object getList(SystemCitySearchRequest request); + + /** + * 修改状态 + * @param id 城市id + * @param status 状态 + */ + Boolean updateStatus(Integer id, Boolean status); + + /** + * 修改城市 + * @param id 城市id + * @param request 修改参数 + */ + Boolean update(Integer id, SystemCityRequest request); + + /** + * 获取城市树 + */ + List getListTree(); + + /** + * 获取所有城市cityId + * @return List + */ + List getCityIdList(); + + /** + * 获取城市 + * @param cityId 城市id + * @return SystemCity + */ + SystemCity getCityByCityId(Integer cityId); + + /** + * 根据城市名称获取城市详细数据 + * @param cityName 城市名称 + * @return 城市数据 + */ + SystemCity getCityByCityName(String cityName); + + /** + * 根据区名获取数据 + */ + SystemCity getByAreaNameAndPid(String areaName, Integer pid); + + /** + * 通过区域id获取 + * @param areaId 区域Id + * @return SystemCity + */ + SystemCity getByAreaId(Integer areaId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemConfigService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemConfigService.java new file mode 100644 index 0000000..1da5011 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemConfigService.java @@ -0,0 +1,120 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.request.SaveConfigRequest; +import com.yzt.common.request.SystemFormCheckRequest; +import com.yzt.common.response.AdminSiteLogoResponse; +import com.yzt.common.vo.ExpressSheetVo; + +import java.util.HashMap; + +/** + * SystemConfigService 接口 + * + */ +public interface SystemConfigService extends IService { + + /** + * 根据menu name 获取 value + * @param key menu name + * @return String + */ + String getValueByKey(String key); + + /** + * 保存或更新配置数据 + * @param name 菜单名称 + * @param value 菜单值 + * @return Boolean + */ + Boolean updateOrSaveValueByName(String name, String value); + + /** + * 根据 name 获取 value 找不到抛异常 + * @param key menu name + * @return String + */ + String getValueByKeyException(String key); + + /** + * 整体保存表单数据 + * @param systemFormCheckRequest SystemFormCheckRequest 数据保存 + * @return Boolean + */ + Boolean saveForm(SystemFormCheckRequest systemFormCheckRequest); + + /** + * 根据formId查询数据 + * @param formId Integer id + * @return HashMap + */ + HashMap info(Integer formId); + + /** + * 获取面单默认配置信息 + * @return ExpressSheetVo + */ + ExpressSheetVo getDeliveryInfo(); + + /** + * 获取文件存储类型 + */ + SystemConfig getFileUploadType(); + + /** + * 获取管理端logo + * + * @return AdminSiteLogoResponse + */ + AdminSiteLogoResponse getSiteLogo(); + + /** + * 获取腾讯地图key + */ + SystemConfig getTxMapKey(); + + /** + * 获取移动端首页列表样式 + */ + SystemConfig getHomePageSaleListStyle(); + + /** + * 保存移动端首页列表样式 + */ + Boolean saveHomePageSaleListStyle(SaveConfigRequest request); + + /** + * 清除config缓存 + */ + Boolean clearCache(); + + /** + * 获取授权地址 + */ + SystemConfig getAuthHost(); + + /** + * 获取主题色 + */ + SystemConfig getChangeColor(); + + /** + * 保存主题色 + */ + Boolean saveChangeColor(SaveConfigRequest request); + + + /** + * 获取移动端域名 + * @return 移动端域名 + */ + String getFrontDomain(); + + /** + * 获取素材域名 + * + * @return 素材域名 + */ + String getMediaDomain(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemFormTempService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemFormTempService.java new file mode 100644 index 0000000..961cf50 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemFormTempService.java @@ -0,0 +1,44 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemFormTemp; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemFormCheckRequest; +import com.yzt.common.request.SystemFormTempRequest; +import com.yzt.common.request.SystemFormTempSearchRequest; + +import java.util.List; + +/** + * SystemFormTempService 接口 + * + */ +public interface SystemFormTempService extends IService { + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + List getList(SystemFormTempSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 验证item规则 + * @param systemFormCheckRequest SystemFormCheckRequest 表单数据提交 + */ + void checkForm(SystemFormCheckRequest systemFormCheckRequest); + + /** + * 新增表单模板 + * @param systemFormTempRequest 新增参数 + */ + Boolean add(SystemFormTempRequest systemFormTempRequest); + + /** + * 修改表单模板 + * @param id integer id + * @param systemFormTempRequest 修改参数 + */ + Boolean edit(Integer id, SystemFormTempRequest systemFormTempRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupDataService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupDataService.java new file mode 100644 index 0000000..bed7f57 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupDataService.java @@ -0,0 +1,73 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemGroupData; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemGroupDataRequest; +import com.yzt.common.request.SystemGroupDataSearchRequest; + +import java.util.HashMap; +import java.util.List; + +/** + * SystemGroupDataService 接口 + * + */ +public interface SystemGroupDataService extends IService { + + /** + * 分页组合数据详情 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + List getList(SystemGroupDataSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增组合数据详情 + * @param systemGroupDataRequest SystemFormCheckRequest 新增参数 + */ + Boolean create(SystemGroupDataRequest systemGroupDataRequest); + + /** + * 修改组合数据详情表 + * @param id integer id + * @param request 修改参数 + */ + Boolean update(Integer id, SystemGroupDataRequest request); + + /** + * 通过gid获取列表 推荐使用 + * @param gid Integer group id + * @return List + */ + List getListByGid(Integer gid, Class cls); + + List> getListMapByGid(Integer gid); + + /** + * 通过gid获取列表 + * @param groupDataId Integer group id + * @return + */ + T getNormalInfo(Integer groupDataId, Class cls); + + /** + * 获取个人中心菜单 + * @return HashMap + */ + HashMap getMenuUser(); + + /** + * 获取列表通过gid + * @param gid gid + * @return 列表 + */ + List findListByGid(Integer gid); + + /** + * 删除通过gid + * @param gid gid + * @return Boolean + */ + Boolean deleteByGid(Integer gid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupService.java new file mode 100644 index 0000000..5e24bd1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemGroupService.java @@ -0,0 +1,42 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemGroup; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemGroupRequest; +import com.yzt.common.request.SystemGroupSearchRequest; + +import java.util.List; + +/** + * SystemGroupService 接口 + * + */ +public interface SystemGroupService extends IService { + + /** + * 分页显示组合数据表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + List getList(SystemGroupSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增组合数据 + * @param systemGroupRequest 新增参数 + */ + Boolean add(SystemGroupRequest systemGroupRequest); + + /** + * 删除组合数据表 + * @param id Integer + */ + Boolean delete(Integer id); + + /** + * 修改组合数据表 + * @param id integer id + * @param systemGroupRequest 修改参数 + */ + Boolean edit(Integer id, SystemGroupRequest systemGroupRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemMenuService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemMenuService.java new file mode 100644 index 0000000..3dfc577 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemMenuService.java @@ -0,0 +1,99 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.request.SystemMenuRequest; +import com.yzt.common.request.SystemMenuSearchRequest; +import com.yzt.common.vo.MenuCheckVo; + +import java.util.List; + +/** + * SystemMenuService 接口 + * + */ +public interface SystemMenuService extends IService { + + /** + * 通过权限获取管理员可访问目录 + * @return List + */ + List findCatalogueByPermission(List permissionsList); + + /** + * 获取所有菜单 + * @return List + */ + List findAllCatalogue(); + + /** + * 菜单列表 + * @param request 请求参数 + */ + List getAdminList(SystemMenuSearchRequest request); + + /** + * 新增菜单 + * @param systemMenuRequest 菜单参数 + * @return Boolean + */ + Boolean add(SystemMenuRequest systemMenuRequest); + + /** + * 根据id删除菜单 + * @param id 菜单id + * @return Boolean + */ + Boolean deleteById(Integer id); + + /** + * 修改菜单 + * @param systemMenuRequest 菜单参数 + * @return Boolean + */ + Boolean edit(SystemMenuRequest systemMenuRequest); + + /** + * 获取菜单详情 + * @param id 菜单id + * @return SystemMenu + */ + SystemMenu getInfo(Integer id); + + /** + * 修改菜单显示状态 + * @param id 菜单id + * @return Boolean + */ + Boolean updateShowStatus(Integer id); + + /** + * 获取菜单缓存列表 + * @return List + */ + List getCacheList(); + + /** + * 菜单缓存树 + * @return List + */ + List getCacheTree(); + + /** + * 获取所有权限 + * @return List + */ + List getAllPermissions(); + + /** + * 通过用户id获取权限 + */ + List findPermissionByUserId(Integer userId); + + /** + * 获取用户路由 + * @param userId 用户id + * @return List + */ + List getMenusByUserId(Integer userId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemNotificationService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemNotificationService.java new file mode 100644 index 0000000..25a6a43 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemNotificationService.java @@ -0,0 +1,80 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.wechat.TemplateMessage; +import com.yzt.common.request.NotificationInfoRequest; +import com.yzt.common.request.NotificationSearchRequest; +import com.yzt.common.request.NotificationUpdateRequest; +import com.yzt.common.response.NotificationInfoResponse; + +import java.util.List; + +/** + * 短信模板表 + * + */ +public interface SystemNotificationService extends IService { + + /** + * 系统通知列表 + * @param request 查询对象 + * @return List + */ + List getList(NotificationSearchRequest request); + + /** + * 公众号模板开关 + * @param id 通知id + * @return Boolean + */ + Boolean wechatSwitch(Integer id); + + /** + * 小程序订阅模板开关 + * @param id 通知id + * @return Boolean + */ + Boolean routineSwitch(Integer id); + + /** + * 发送短信开关 + * @param id 通知id + * @return Boolean + */ + Boolean smsSwitch(Integer id); + + /** + * 通知详情 + * @param request 详情请求参数 + * @return NotificationInfoResponse + */ + NotificationInfoResponse getDetail(NotificationInfoRequest request); + + /** + * 根据标识查询信息 + * @param mark 标识 + * @return SystemNotification + */ + SystemNotification getByMark(String mark); + + /** + * 获取微信相关列表 + * @param type routine-小程序,public-公众号 + */ + List getListByWechat(String type); + + /** + * 修改通知 + * @param request 请求参数 + * @return Boolean + */ + Boolean modify(NotificationUpdateRequest request); + + /** + * 获取小程序订阅模板编号(小程序端调用) + * @param type 场景类型(支付之前:beforePay|支付成功:afterPay|申请退款:refundApply|充值之前:beforeRecharge|创建砍价:createBargain|参与拼团:pink|取消拼团:cancelPink) + * @return List + */ + List getMiniTempList(String type); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleMenuService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleMenuService.java new file mode 100644 index 0000000..df84da6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleMenuService.java @@ -0,0 +1,27 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemRoleMenu; + +import java.util.List; + +/** + * SystemRoleMenuService 接口 + * 角色菜单关联服务 + * + */ +public interface SystemRoleMenuService extends IService { + + /** + * 通过角色id删除 + * @param rid 角色id + */ + Boolean deleteByRid(Integer rid); + + /** + * 通过角色id获取菜单列表 + * @param rid 角色id + * @return List + */ + List getMenuListByRid(Integer rid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleService.java new file mode 100644 index 0000000..8b372c3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemRoleService.java @@ -0,0 +1,76 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemRole; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemRoleRequest; +import com.yzt.common.request.SystemRoleSearchRequest; +import com.yzt.common.response.RoleInfoResponse; +import com.yzt.common.vo.CategoryTreeVo; + +import java.util.List; + +/** + * SystemRoleService 接口 + * + */ +public interface SystemRoleService extends IService { + + /** + * 获取所有角色 + * @return List + */ + List getAllList(); + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + List getList(SystemRoleSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 根据id集合获取对应权限列表 + * @param ids id集合 + * @return 对应的权限列表 + */ + List getListInIds(List ids); + + /** + * 管理员菜单权限 + */ + List menu(); + + /** + * 修改身份状态 + */ + Boolean updateStatus(Integer id, Boolean status); + + /** + * 添加身份 + * @param systemRoleRequest 身份参数 + * @return Boolean + */ + Boolean add(SystemRoleRequest systemRoleRequest); + + /** + * 修改身份管理表 + * @param systemRoleRequest 修改参数 + */ + Boolean edit(SystemRoleRequest systemRoleRequest); + + /** + * 删除角色 + * @param id 角色id + * @return Boolean + */ + Boolean delete(Integer id); + + /** + * 获取角色详情 + * @param id 角色id + * @return RoleInfoResponse + */ + RoleInfoResponse getInfo(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreService.java new file mode 100644 index 0000000..460834f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreService.java @@ -0,0 +1,90 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreNearRequest; +import com.yzt.common.request.SystemStoreRequest; +import com.yzt.common.response.StoreNearResponse; + +import java.util.HashMap; +import java.util.List; + +/** + * SystemStoreService 接口 + * + */ +public interface SystemStoreService extends IService { + + /** + * 门店自提分页列表 + * @param keywords 搜索条件 + * @param status 状态 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(String keywords, Integer status, PageParamRequest pageParamRequest); + + /** + * 根据基本参数获取 + * @param systemStore 基本参数 + * @return 门店自提结果 + */ + SystemStore getByCondition(SystemStore systemStore); + + /** + * 修改门店显示状态 + * @param id integer id + * @param status 状态 + */ + Boolean updateStatus(Integer id, Boolean status); + + /** + * 删除门店自提 + * @param id Integer + */ + Boolean delete(Integer id); + + /** + * 表头数量 + * @param keywords 搜索条件:门店名称、门店电话 + * @return HashMap + */ + HashMap getCount(String keywords); + + HashMap getMapInId(List storeIdList); + + StoreNearResponse getNearList(StoreNearRequest request, PageParamRequest pageParamRequest); + + /** + * 新增门店自提 + * @param request SystemStoreRequest 新增参数 + */ + Boolean create(SystemStoreRequest request); + + /** + * 修改门店自提 + * @param id integer id + * @param request 修改参数 + */ + Boolean update(Integer id, SystemStoreRequest request); + + /** + * 彻底删除 + * @param id 提货点编号 + */ + Boolean completeLyDelete(Integer id); + + /** + * 提货点恢复 + * @param id 提货点编号 + */ + Boolean recovery(Integer id); + + /** + * 门店自提详情 + * @param id Integer + * @return SystemStore + */ + SystemStore getInfo(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreStaffService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreStaffService.java new file mode 100644 index 0000000..968970f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemStoreStaffService.java @@ -0,0 +1,45 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.system.SystemStoreStaff; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemStoreStaffRequest; +import com.yzt.common.response.SystemStoreStaffResponse; + +/** + * SystemStoreStaffService 接口 + * + */ +public interface SystemStoreStaffService extends IService { + + /** + * 分页显示门店核销员列表 + * @param storeId 门店id + * @param pageParamRequest 分页参数 + */ + PageInfo getList(Integer storeId, PageParamRequest pageParamRequest); + + /** + * 添加核销员 唯一验证 + * @param request 当前添加参数 + * @return 添加结果 + */ + Boolean saveUnique(SystemStoreStaffRequest request); + + /** + * 更新核销员信息 + * @param id 核销员id + * @param systemStoreStaffRequest 更新参数 + */ + Boolean edit(Integer id, SystemStoreStaffRequest systemStoreStaffRequest); + + /** + * 修改核销员状态 + * @param id 核销员id + * @param status 状态 + * @return Boolean + */ + Boolean updateStatus(Integer id, Integer status); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/SystemUserLevelService.java b/fightwine-service/src/main/java/com/yzt/service/service/SystemUserLevelService.java new file mode 100644 index 0000000..cce3574 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/SystemUserLevelService.java @@ -0,0 +1,68 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.request.SystemUserLevelRequest; +import com.yzt.common.request.SystemUserLevelUpdateShowRequest; + +import java.util.List; +import java.util.Map; + +/** + * SystemUserLevelService 接口 + * + */ +public interface SystemUserLevelService extends IService { + + /** + * 获取等级列表 + */ + List getList(); + + + /** + * 获取等级名称列表 + */ + Map buildGradeToNameMap(); + + /** + * 系统等级新增 + * @param request request + * @return Boolean + */ + Boolean create(SystemUserLevelRequest request); + + /** + * 系统等级更新 + * @param id 等级id + * @param request 等级数据 + * @return Boolean + */ + Boolean update(Integer id, SystemUserLevelRequest request); + + SystemUserLevel getByLevelId(Integer levelId); + + /** + * 获取系统等级列表(移动端) + */ + List getH5LevelList(); + + /** + * 删除系统等级 + * @param id 等级id + * @return Boolean + */ + Boolean delete(Integer id); + + /** + * 使用/禁用 + * @param request request + */ + Boolean updateShow(SystemUserLevelUpdateShowRequest request); + + /** + * 获取可用等级列表 + * @return List + */ + List getUsableList(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/TemplateMessageService.java b/fightwine-service/src/main/java/com/yzt/service/service/TemplateMessageService.java new file mode 100644 index 0000000..ea55971 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/TemplateMessageService.java @@ -0,0 +1,72 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.TemplateMessage; + +import java.util.HashMap; +import java.util.List; + +/** + * TemplateMessageService 接口 + * + */ +public interface TemplateMessageService extends IService { + + /** + * 公众号消费队列消费 + */ + void consumePublic(); + + /** + * 小程序消费队列消费 + */ + void consumeProgram(); + + /** + * 发送公众号模板消息 + * @param templateId 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + void pushTemplateMessage(Integer templateId, HashMap temMap, String openId); + + /** + * 发送小程序订阅消息 + * @param templateId 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + void pushMiniTemplateMessage(Integer templateId, HashMap temMap, String openId); + + /** + * 修改模板状态 + * @param id 模板id + * @param status 状态 + */ + Boolean updateStatus(Integer id, Integer status); + + /** + * 公众号模板消息同步 + * @return Boolean + */ + Boolean whcbqhnSync(); + + /** + * 小程序订阅消息同步 + * @return Boolean + */ + Boolean routineSync(); + + /** + * 获取详情 + * @param id id + */ + TemplateMessage info(Integer id); + + /** + * 获取模板列表 + * @param tidList id数组 + * @return List + */ + List getByIdList(List tidList); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/TenantService.java b/fightwine-service/src/main/java/com/yzt/service/service/TenantService.java new file mode 100644 index 0000000..26c137f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/TenantService.java @@ -0,0 +1,35 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.TenantPageRequest; +import com.yzt.common.request.TenantSaveRequest; +import com.yzt.common.vo.TenantVo; +import com.yzt.common.vo.WechatMerchantConfigVo; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +public interface TenantService extends IService { + + /** + * 新增租户 + */ + Long saveTenant(TenantSaveRequest tenantSaveRequest); + + List getList(TenantPageRequest tenantRequest, PageParamRequest pageParamRequest); + + TenantVo getInfo(Long tenantId); + + Boolean setStatus(Integer status, Long tenantId); + + /** + * 获取租户列表 + */ + List getTenantsByCurrentAdmin(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UploadService.java b/fightwine-service/src/main/java/com/yzt/service/service/UploadService.java new file mode 100644 index 0000000..bf5c38a --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UploadService.java @@ -0,0 +1,31 @@ +package com.yzt.service.service; + +import com.yzt.common.vo.FileResultVo; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +/** + * UploadService 接口 + * + */ +public interface UploadService { + + /** + * 图片上传 + * @param multipartFile 文件 + * @param model 模块 用户user,商品product,微信wechat,news文章 + * @param pid 分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 + * @return FileResultVo + */ + FileResultVo imageUpload(MultipartFile multipartFile, String model, Integer pid) throws IOException; + + /** + * 文件长传 + * @param multipartFile 文件 + * @param model 模块 用户user,商品product,微信wechat,news文章 + * @param pid 分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 + * @return FileResultVo + */ + FileResultVo fileUpload(MultipartFile multipartFile, String model, Integer pid) throws IOException; +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserAddressService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserAddressService.java new file mode 100644 index 0000000..68c88a2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserAddressService.java @@ -0,0 +1,72 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserAddress; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserAddressRequest; + +import java.util.List; + +/** + * UserAddressService 接口实现 + * + */ +public interface UserAddressService extends IService { + + /** + * 用户地址列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(PageParamRequest pageParamRequest,Boolean isAddress); + /** + * 用户地址列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getUserList(PageParamRequest pageParamRequest); + /** + * 客户信息列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getCustomerList(PageParamRequest pageParamRequest); + + /** + * 添加用户地址 + * @param request 地址请求参数 + * @return UserAddress + */ + UserAddress create(UserAddressRequest request); + + /** + * 设置默认地址 + * @param id 地址id + * @return Boolean + */ + Boolean def(Integer id); + + /** + * 删除用户地址 + * @param id 地址id + * @return Boolean + */ + Boolean delete(Integer id); + + UserAddress getDefault(); + + UserAddress getById(Integer addressId); + + /** + * 获取地址详情 + * @param id 地址id + * @return UserAddress + */ + UserAddress getDetail(Integer id); + + /** + * 获取默认地址 + * @return UserAddress + */ + UserAddress getDefaultByUid(Integer uid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserBankCardService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserBankCardService.java new file mode 100644 index 0000000..64aba5d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserBankCardService.java @@ -0,0 +1,27 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserBankCard; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserBankCardRequest; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ +public interface UserBankCardService extends IService { + List getList(PageParamRequest pageParamRequest); + + UserBankCard create(UserBankCardRequest request); + + boolean delete(Integer id); + + UserBankCard getDetail(Integer id); + + UserBankCard getDefault(); + + boolean def(Long id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserBillService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserBillService.java new file mode 100644 index 0000000..8481996 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserBillService.java @@ -0,0 +1,67 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.request.FundsMonitorRequest; +import com.yzt.common.request.FundsMonitorSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreOrderRefundRequest; +import com.yzt.common.response.MonitorResponse; + +import java.math.BigDecimal; +import java.util.List; + +/** + * UserBillService 接口实现 + * + */ +public interface UserBillService extends IService { + + /** + * 列表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + List getList(FundsMonitorSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增/消耗 总金额 + * + * @param pm Integer 0 = 支出 1 = 获得 + * @param userId Integer 用户uid + * @param category String 类型 + * @param date String 时间范围 + * @param type String 小类型 + * @return UserBill + */ + BigDecimal getSumBigDecimal(Integer pm, Integer userId, String category, String date, String type); + + /** + * 保存退款日志 + * + * @return boolean + */ + Boolean saveRefundBill(StoreOrderRefundRequest request, User user); + + /** + * 资金监控 + * + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo fundMonitoring(FundsMonitorRequest request, PageParamRequest pageParamRequest); + + /** + * 用户账单记录(现金) + * + * @param uid 用户uid + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return PageInfo + */ + PageInfo nowMoneyBillRecord(Integer uid, String type, PageParamRequest pageRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserBrokerageRecordService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserBrokerageRecordService.java new file mode 100644 index 0000000..583abd7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserBrokerageRecordService.java @@ -0,0 +1,179 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.request.BrokerageRecordRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.RetailShopStairUserRequest; +import com.yzt.common.response.SpreadCommissionDetailResponse; +import com.yzt.common.response.UserBrokerageRecordResponse; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + +/** + * 用户佣金记录服务接口 + * + */ +public interface UserBrokerageRecordService extends IService { + + /** + * 获取记录列表 + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + List findListByLinkIdAndLinkType(String linkId, String linkType); + + /** + * 获取记录(订单不可用此方法) + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + UserBrokerageRecord getByLinkIdAndLinkType(String linkId, String linkType); + + /** + * 佣金解冻 + */ + void brokerageThaw(); + + /** + * 每日释放超过7天的佣金记录 + */ + void brokerageRelease(); + + /** + * 昨天得佣金 + * @param uid 用户uid + */ + BigDecimal getYesterdayIncomes(Integer uid); + + /** + * 今天得佣金 + * @param uid 用户uid + */ + BigDecimal getTodayIncomes(Integer uid); + + /** + * 获取佣金明细列表根据uid + * @param uid uid + * @param pageParamRequest 分页参数 + */ + PageInfo findDetailListByUid(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取累计推广条数 + * @param uid 用户uid + * @return Integer + */ + Integer getSpreadCountByUid(Integer uid); + + /** + * 获取推广记录列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + List findSpreadListByUid(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取推广记录列表 + * @param request 用户uid + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo findAdminSpreadListByUid(RetailShopStairUserRequest request, PageParamRequest pageParamRequest); + + /** + * 获取月份对应的推广订单数 + * @param uid 用户uid + * @param monthList 月份列表 + * @return Map + */ + Map getSpreadCountByUidAndMonth(Integer uid, List monthList); + + /** + * 获取佣金排行榜(周、月) + * @param type week、month + * @return List + */ + List getBrokerageTopByDate(String type); + + /** + * 根据Uid和时间参数获取分佣记录列表 + * @param uid 用户uid + * @return List + */ + List getSpreadListByUid(Integer uid); + + /** + * 佣金总金额(单位时间) + * @param dateLimit 时间参数 + * @return BigDecimal + */ + BigDecimal getTotalSpreadPriceBydateLimit(String dateLimit); + + /** + * 佣金总金额 + * @return BigDecimal + */ + BigDecimal getCurrentUserTotalSpreadPrice(Integer uid); + + /** + * 单位时间消耗的佣金 + * @param dateLimit 时间参数 + * @return BigDecimal + */ + BigDecimal getSubSpreadPriceByDateLimit(String dateLimit); + + /** + * 获取冻结期佣金 + * @param uid uid + * @return BigDecimal + */ + BigDecimal getFreezePrice(Integer uid); + + /** + * 佣金记录列表 + * @param request 筛选条件 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getAdminList(BrokerageRecordRequest request, PageParamRequest pageParamRequest); + + /** + * 根据日期获取支付佣金金额(确认到账佣金) + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getBrokerageAmountByDate(String date); + + /** + * 获取累计佣金转余额金额 + * @return BigDecimal + */ + BigDecimal getTotalYuePrice(); + + /** + * 将指定订单号相关的佣金记录标记为失效(订单退款导致) + * @param orderId 订单号 + */ + void invalidateByOrderId(String orderId); + + /** + * 统计某个用户在某类商品类型(会员/加盟店/会馆) + * 获得销售奖励(sale_reward类型)实际次数,实现奖励比例自动轮循。 + * @param uid 用户ID(谁获得奖励) + * @param attrType 商品属性类型(0=会员,1=加盟店,2=会馆) + * @return 该用户针对该类型商品,已获得奖励的次数,用于决定本次奖励所用比例档位 + */ + int countByUidAndAttrType(Integer uid, Integer attrType); + + + BigDecimal getPendingIncomes(Integer uid); + + List getUserBrokerageRecords(Integer uid,String customerName, String phone, PageParamRequest pageParamRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserExperienceRecordService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserExperienceRecordService.java new file mode 100644 index 0000000..0386db5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserExperienceRecordService.java @@ -0,0 +1,30 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserExperienceRecord; +import com.yzt.common.request.PageParamRequest; + +import java.util.List; + +/** + * 用户经验记录服务接口 + * + */ +public interface UserExperienceRecordService extends IService { + + /** + * 获取用户经验列表(移动端) + * @param userId 用户id + * @param pageParamRequest 分页参数 + * @return List + */ + List getH5List(Integer userId, PageParamRequest pageParamRequest); + + /** + * 通过订单编号获取记录 + * @param orderNo 订单编号 + * @param uid uid + * @return UserExperienceRecord + */ + UserExperienceRecord getByOrderNoAndUid(String orderNo, Integer uid); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserExtractService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserExtractService.java new file mode 100644 index 0000000..bbc7dbe --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserExtractService.java @@ -0,0 +1,86 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserExtractRequest; +import com.yzt.common.request.UserExtractSearchRequest; +import com.yzt.common.response.BalanceResponse; +import com.yzt.common.response.UserExtractRecordResponse; +import com.yzt.common.response.UserExtractResponse; +import com.yzt.common.response.UserExtractDetailResponse; + +import java.math.BigDecimal; +import java.util.List; + +/** +* UserExtractService 接口 +* fw_ +*/ +public interface UserExtractService extends IService { + + List getList(UserExtractSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 提现总金额 + */ + BalanceResponse getBalance(String dateLimit); + + /** + * 提现总金额 + * + * @since 2020-05-11 + * @return BalanceResponse + */ + BigDecimal getWithdrawn(String startTime,String endTime); + + UserExtractResponse getUserExtractByUserId(Integer userId); + + /** + * 提现审核 + * @param id 提现申请id + * @param status 审核状态 -1 未通过 0 审核中 1 已提现 + * @param backMessage 驳回原因 + * @param auditRemark 审核备注 + * @param transferVoucherUrl 转账凭证地址 + * @return 审核结果 + */ + Boolean updateStatus(Integer id,Integer status,String backMessage,String auditRemark,String transferVoucherUrl); + + /** + * 获取提现记录列表 + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getExtractRecord(Integer userId, PageParamRequest pageParamRequest); + + BigDecimal getExtractTotalMoney(Integer userId); + + /** + * 提现申请 + * @return Boolean + */ + Boolean extractApply(UserExtractRequest request); + + /** + * 修改提现申请 + * @param id 申请id + * @param userExtractRequest 具体参数 + */ + Boolean updateExtract(Integer id, UserExtractRequest userExtractRequest); + + /** + * 提现申请待审核数量 + * @return Integer + */ + Integer getNotAuditNum(); + + /** + * 提现申请详情 + * @param id 提现申请记录id + * @return 详情数据 + */ + UserExtractDetailResponse getDetailById(Integer id); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserFundsMonitorService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserFundsMonitorService.java new file mode 100644 index 0000000..3d60339 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserFundsMonitorService.java @@ -0,0 +1,23 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.request.BrokerageRecordRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.vo.UserFundsMonitor; + +/** +* UserRechargeService 接口 +* fw_ +*/ +public interface UserFundsMonitorService extends IService { + + /** + * 佣金记录 + * @param request 筛选条件 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getBrokerageRecord(BrokerageRecordRequest request, PageParamRequest pageParamRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserGroupService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserGroupService.java new file mode 100644 index 0000000..99d4f88 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserGroupService.java @@ -0,0 +1,37 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserGroup; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserGroupRequest; + +import java.util.List; + +/** + * UserGroupService 接口实现 + * + */ +public interface UserGroupService extends IService { + + /** + * 会员-分组列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(PageParamRequest pageParamRequest); + + String getGroupNameInId(String groupIdValue); + + /** + * 新增用户分组 + * @param userGroupRequest 分组参数 + */ + Boolean create(UserGroupRequest userGroupRequest); + + /** + * 修改用户分组 + * @param id 分组id + * @param userGroupRequest 修改参数 + */ + Boolean edit(Integer id, UserGroupRequest userGroupRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserIntegralRecordService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserIntegralRecordService.java new file mode 100644 index 0000000..25195c6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserIntegralRecordService.java @@ -0,0 +1,73 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.request.AdminIntegralSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserIntegralRecordResponse; + +import java.util.List; + +/** + * 用户积分记录Service + * + */ +public interface UserIntegralRecordService extends IService { + + /** + * 根据订单编号、uid获取记录列表 + * @param orderNo 订单编号 + * @param uid 用户uid + * @return 记录列表 + */ + List findListByOrderIdAndUid(String orderNo, Integer uid); + + /** + * 积分解冻 + */ + void integralThaw(); + + /** + * PC后台列表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + * @return 记录列表 + */ + PageInfo findAdminList(AdminIntegralSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 根据类型条件计算积分总数 + * @param uid 用户uid + * @param type 类型:1-增加,2-扣减 + * @param date 日期 + * @param linkType 关联类型 + * @return 积分总数 + */ + Integer getSumIntegral(Integer uid, Integer type, String date, List linkTypeList); + + /** + * H5用户积分列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + List findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest); + + /** + * 获取用户冻结的积分 + * @param uid 用户uid + * @return 积分数量 + */ + Integer getFrozenIntegralByUid(Integer uid); + + /** + * 积分转让(用户间) + * @param phone 收款人手机号 + * @param integral 转让积分(当 transferType 为 now_money 时表示余额) + * @param tradePassword 交易密码 + * @param transferType 转账类型:integral-积分,now_money-余额 + * @return Boolean + */ + Boolean transferIntegral(String phone, Integer integral, String tradePassword, String transferType); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserLevelService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserLevelService.java new file mode 100644 index 0000000..c160ce2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserLevelService.java @@ -0,0 +1,44 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserLevel; +import com.yzt.common.request.PageParamRequest; + +import java.util.List; + +/** + * UserLevelService 接口实现 + * + */ +public interface UserLevelService extends IService { + + /** + * 用户等级列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(PageParamRequest pageParamRequest); + + /** + * 经验升级 + * @param user 用户 + * @return Boolean + */ + Boolean upLevel(User user); + + /** + * 经验降级 + * @param user 用户 + * @return Boolean + */ + Boolean downLevel(User user); + + /** + * 删除(通过系统等级id) + * @param levelId 系统等级id + * @return Boolean + */ + Boolean deleteByLevelId(Integer levelId); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserLevelUpgradeAuditService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserLevelUpgradeAuditService.java new file mode 100644 index 0000000..ca89c39 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserLevelUpgradeAuditService.java @@ -0,0 +1,85 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserLevelUpgradeAudit; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserLevelUpgradeAuditQueryRequest; +import com.yzt.common.request.UserLevelUpgradeAuditRequest; +import com.yzt.common.response.UserLevelUpgradeAuditResponse; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/22 + * @Description: + */ +public interface UserLevelUpgradeAuditService extends IService { + /** + * 分页列表 + */ + List getList(PageParamRequest pageParamRequest, UserLevelUpgradeAuditQueryRequest request); + + /** + * 创建审核记录(支付成功后调用) + * @param uid 用户ID + * @param currentLevel 当前等级 + * @param targetLevel 目标等级 + * @param orderId 订单号 + * @return 是否创建成功 + */ + Boolean createAuditRecord(Integer uid, Integer currentLevel, Integer targetLevel, String orderId,Integer sourceType); + + /** + * 创建审核记录 + * @return 是否创建成功 + */ + boolean create(UserLevelUpgradeAudit request); + + /** + * 修改审核记录 + * @return 修改成功 + */ + boolean edit(UserLevelUpgradeAudit request); + + + /** + * 信息查询 + * @return UserLevelUpgradeAuditResponse 修改成功 + */ + UserLevelUpgradeAuditResponse getInfoById(Integer id); + + + /** + * 检查是否已存在待审核记录 + * @param uid 用户ID + * @param targetLevel 目标等级 + * @return 是否存在 + */ + Boolean hasPendingAudit(Integer uid, Integer targetLevel); + + /** + * 审核通过 + * @param request 审核请求 + * @param auditorId 审核人ID + * @return 是否成功 + */ + Boolean approve(UserLevelUpgradeAuditRequest request, Long auditorId); + + /** + * 审核拒绝 + * @param request 审核请求 + * @param auditorId 审核人ID + * @return 是否成功 + */ + Boolean reject(UserLevelUpgradeAuditRequest request, Long auditorId); + + /** + * 根据订单号标记待审核记录为拒绝(退款时调用) + * @param orderId 订单号 + * @param auditorId 审核人ID(系统操作) + * @return 是否成功 + */ + Boolean rejectByOrderIdForRefund(String orderId, Long auditorId); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeApplicationService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeApplicationService.java new file mode 100644 index 0000000..8c41fdd --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeApplicationService.java @@ -0,0 +1,35 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeApplicationRequest; +import com.yzt.common.request.UserRechargeApplicationSearchRequest; +import com.yzt.common.response.UserRechargeApplicationResponse; +import com.yzt.common.response.UserRechargeResponse; + +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/18 + * @Description: + */ +public interface UserRechargeApplicationService extends IService { + + PageInfo getList(UserRechargeApplicationSearchRequest request, PageParamRequest pageParamRequest); + + Boolean userRechargeApply(UserRechargeApplicationRequest request); + + List getUserApplications(Integer status,Integer uid); + +// Boolean approve(Integer status, Integer id); + + Boolean approve(UserRechargeApplicationRequest request); + + Boolean create(UserRechargeApplicationRequest request); + + + UserRechargeApplicationResponse info(Integer id); +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeService.java new file mode 100644 index 0000000..783dc0b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserRechargeService.java @@ -0,0 +1,87 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeSearchRequest; +import com.yzt.common.response.UserRechargeResponse; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; + +/** +* UserRechargeService 接口 +* fw_ +*/ +public interface UserRechargeService extends IService { + + /** + * 充值记录列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getList(UserRechargeSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 充值统计 + * @return HashMap + */ + HashMap getBalanceList(); + + UserRecharge getInfoByEntity(UserRecharge userRecharge); + + /** + * 根据日期获取充值订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + Integer getRechargeOrderNumByDate(String date); + + /** + * 根据日期获取充值订单金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + BigDecimal getRechargeOrderAmountByDate(String date); + + /** + * 获取总人数 + * @return Integer + */ + Integer getTotalPeople(); + + /** + * 获取总金额 + * @return BigDecimal + */ + BigDecimal getTotalPrice(); + + /** + * 根据时间获取充值用户数量 + * @param date 日期 + * @return Integer + */ + Integer getRechargeUserNumByDate(String date); + + /** + * 根据时间获取充值用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getRechargeUserNumByPeriod(String startDate, String endDate); + + /** + * 获取待上传微信发货管理订单 + */ + List findAwaitUploadWechatList(); + + /** + * 获取订单 + * @param outTradeNo 商户系统内部的订单号 + */ + UserRecharge getByOutTradeNo(String outTradeNo); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserService.java new file mode 100644 index 0000000..5f62c42 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserService.java @@ -0,0 +1,374 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.user.User; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.vo.MyRecord; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 用户表 服务类 + * + */ +public interface UserService extends IService { + + /** + * 用户分页列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getList(UserSearchRequest request, PageParamRequest pageParamRequest); + /** + * 用户分页列表 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + PageInfo getPromotedUserList(UserSearchRequest request, PageParamRequest pageParamRequest); + + /** + * 操作积分、余额 + */ + Boolean updateIntegralMoney(UserOperateIntegralMoneyRequest request); + + /** + * 更新余额 + * @param user 用户 + * @param price 金额 + * @param type 增加add、扣减sub + * @return 更新后的用户数据 + */ + Boolean updateNowMoney(User user, BigDecimal price, String type); + + /** + * 会员分组 + * @param id String id + * @param groupId Integer 分组Id + */ + Boolean group(String id, String groupId); + + /** + * 忘记密码 + * @param request 修改密码参数 + * @return Boolean + */ + Boolean password(PasswordRequest request); + + /** + * 修改密码 + * @param request 修改密码参数 + * @return Boolean + */ + Boolean updateLoginPassword(UserPasswordRequest request); + + /** + * 修改交易密码 + * @param request 修改密码参数 + * @return Boolean + */ + Boolean updateTradePassword(UserTradePasswordRequest request); + + User getInfo(); + + User getInfoException(); + + /** + * 根据参数类型查询会员对应的信息 + * @param userId Integer 会员id + * @param type int 类型 0=消费记录,1=积分明细,2=签到记录,3=持有优惠券,4=余额变动,5=好友关系 + * @param pageParamRequest PageParamRequest 分页 + */ + Object getInfoByCondition(Integer userId,Integer type,PageParamRequest pageParamRequest); + + Integer getUserIdException(); + + Integer getUserId(); + + Map getAddUserCountGroupDate(String date); + + /** + * 换绑手机号校验 + */ + Boolean updatePhoneVerify(UserBindingPhoneUpdateRequest request); + + /** + * 换绑手机号 + */ + Boolean updatePhone(UserBindingPhoneUpdateRequest request); + + /** + * 个人中心-用户信息 + * @return UserCenterResponse + */ + UserCenterResponse getUserCenter(); + + /** + * 根据用户id获取用户列表 map模式 + * @param uidList uidList + * @return HashMap + */ + HashMap getMapListInUid(List uidList); + + void repeatSignNum(Integer userId); + + /** + * 会员标签 + * + * @param id String id + * @param tagId Integer 标签Id + */ + Boolean tag(String id, String tagId); + + List getSpreadPeopleIdList(List userId); + + List getSpreadIdList(Integer uid); + + List getSpreadPeopleList(List userIdList, String keywords, String sortKey, String isAsc, PageParamRequest pageParamRequest); + + /** + * 会员详情页Top数据 + * @param userId 用户uid + * @return TopDetail + */ + TopDetail getTopDetail(Integer userId); + + User registerByThird(RegisterThirdUserRequest thirdUserRequest); + + String getValidateCodeRedisKey(String phone); + + PageInfo getUserListBySpreadLevel(RetailShopStairUserRequest request, PageParamRequest pageParamRequest); + + PageInfo getOrderListBySpreadLevel(RetailShopStairUserRequest request, PageParamRequest pageParamRequest); + + boolean clearSpread(Integer userId); + + /** + * 推广人排行榜 + * @param type String 时间范围(week-周,month-月) + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + List getTopSpreadPeopleListByDate(String type, PageParamRequest pageParamRequest); + + Integer getCountByPayCount(int minPayCount, int maxPayCount); + + /** + * 绑定推广关系(登录状态) + * @param spreadUid 推广人id + */ + void bindSpread(Integer spreadUid); + + /** + * 更新推广人 + * @param request 请求参数 + * @return Boolean + */ + Boolean editSpread(UserUpdateSpreadRequest request); + + /** + * 更新用户积分 + * @param user 用户 + * @param integral 积分 + * @param type 增加add、扣减sub + * @return 更新后的用户对象 + */ + Boolean updateIntegral(User user, java.math.BigDecimal integral, String type); + + /** + * 手机号注册用户 + * @param phone 手机号 + * @param spreadUid 推广人编号 + * @return User + */ + User registerPhone(String phone, Integer spreadUid); + + /** + * 检测能否绑定关系 + * @param user 当前用户 + * @param spreadUid 推广员Uid + * @param type 用户类型:new-新用户,old—老用户 + * @return Boolean + */ + Boolean checkBingSpread(User user, Integer spreadUid, String type); + + /** + * 更新推广员推广数 + * @param uid uid + * @param type add or sub + * @return Boolean + */ + Boolean updateSpreadCountByUid(Integer uid, String type); + + /** + * 添加/扣减佣金 + * @param uid 用户id + * @param price 金额 + * @param brokeragePrice 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationBrokerage(Integer uid, BigDecimal price, BigDecimal brokeragePrice, String type); + + /** + * 添加/扣减余额 + * @param uid 用户id + * @param price 金额 + * @param nowMoney 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal nowMoney, String type); + + /** + * 添加/扣减积分 + * @param uid 用户id + * @param integral 积分 + * @param nowIntegral 历史积分 + * @param type 类型:add—添加,sub—扣减 + */ + Boolean operationIntegral(Integer uid, java.math.BigDecimal integral, java.math.BigDecimal nowIntegral, String type); + + /** + * PC后台分销员列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + * @return + */ + PageInfo getAdminSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest); + + /** + * 清除User Group id + * @param groupId 待清除的GroupId + */ + void clearGroupByGroupId(String groupId); + + /** + * 更新用户 + * @param userRequest 用户参数 + */ + Boolean updateUser(UserUpdateRequest userRequest); + + /** + * 创建用户 + * @param userRequest 用户参数 + */ + Boolean createUser(UserCreateRequest userRequest); + + /** + * 根据手机号查询用户 + * @param phone 用户手机号 + * @return 用户信息 + */ + User getByPhone(String phone); + + /** + * 根据手机号查询用户 + * @param phone 用户手机号 + * @return 用户信息 + */ + UserCenterResponse getUserCenterResponseByPhone(String phone); + + /** + * 后台修改用户手机号 + * @param id 用户uid + * @param phone 手机号 + * @return Boolean + */ + Boolean updateUserPhone(Integer id, String phone); + + /** + * 根据昵称匹配用户,返回id集合 + * @param nikeName 需要匹配得昵称 + * @return List + */ + List findIdListLikeName(String nikeName); + + /** + * 清除对应的用户等级 + * @param levelId 等级id + */ + Boolean removeLevelByLevelId(Integer levelId); + + /** + * 更新用户会员等级 + * @param request request + * @return Boolean + */ + Boolean updateUserLevel(UpdateUserLevelRequest request); + + /** + * 获取用户总人数 + */ + Integer getTotalNum(); + + /** + * 根据日期获取注册用户数量 + * @param date 日期 + * @return Integer + */ + Integer getRegisterNumByDate(String date); + + /** + * 根据日期段获取注册用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return UserOverviewResponse + */ + Integer getRegisterNumByPeriod(String startDate, String endDate); + + /** + * 获取用户性别数据 + * @return List + */ + List getSexData(); + + /** + * 获取用户渠道数据 + * @return List + */ + List getChannelData(); + + /** + * 获取所有用户的id跟地址 + * @return List + */ + List findIdAndAddresList(); + + /** + * 修改个人资料 + * @param request 修改信息 + */ + Boolean editUser(UserEditRequest request); + + /** + * 获取用户详情 + * @param id 用户uid + */ + User getInfoByUid(Integer id); + + + /** + * 修改个人资料 + * @param phone 修改信息 + */ + Boolean updateSpreadUid(UpdateSpreadUserRequest phone); + + /** + * 拼团查询 + * @param request 修改信息 + */ + List getUserPink(PinkQueryRequest request); + + /** + * 获取上级信息 + */ + User getReferInfo(); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserSignService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserSignService.java new file mode 100644 index 0000000..845f6d8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserSignService.java @@ -0,0 +1,59 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserSign; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserSignInfoResponse; +import com.yzt.common.vo.SystemGroupDataSignConfigVo; +import com.yzt.common.vo.UserSignMonthVo; +import com.yzt.common.vo.UserSignVo; + +import java.util.HashMap; +import java.util.List; + +/** + * UserSignService 接口实现 + * + */ +public interface UserSignService extends IService { + + /** + * 用户积分列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(PageParamRequest pageParamRequest); + + List getListByCondition(UserSign sign, PageParamRequest pageParamRequest); + + /** + * 签到 + * @return SystemGroupDataSignConfigVo + */ + SystemGroupDataSignConfigVo sign(); + + /** + * 今日记录详情 + * @return HashMap + */ + HashMap get(); + + /** + * 签到配置 + * @return List + */ + List getSignConfig(); + + /** + * 积分月度列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getListGroupMonth(PageParamRequest pageParamRequest); + + /** + * 获取用户签到信息 + * @return UserSignInfoResponse + */ + UserSignInfoResponse getUserSignInfo(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserStatisticsService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserStatisticsService.java new file mode 100644 index 0000000..4547e8c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserStatisticsService.java @@ -0,0 +1,33 @@ +package com.yzt.service.service; + +import com.yzt.common.response.*; + +import java.util.List; + +/** + * UserStatisticsService 接口 + * + */ +public interface UserStatisticsService { + + /** + * 用户概览数据 + * @param dateLimit 时间参数 + * @return UserOverviewResponse + */ + UserOverviewResponse getOverview(String dateLimit); + + /** + * 获取用户渠道数据 + * @return List + */ + List getChannelData(); + + /** + * 用户概览数据列表(导出使用) + * @param dateLimit 时间参数 + * @return UserOverviewResponse + */ + List getOverviewList(String dateLimit); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserTagService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserTagService.java new file mode 100644 index 0000000..939dfef --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserTagService.java @@ -0,0 +1,43 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserTag; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserTagRequest; + +import java.util.List; + +/** + * UserTagService 接口实现 + * + */ +public interface UserTagService extends IService { + + /** + * 用户标签列表 + * @param pageParamRequest 分页参数 + * @return List + */ + List getList(PageParamRequest pageParamRequest); + + String getGroupNameInId(String tagIdValue); + + /** + * 新增用户标签 + * @param userTagRequest 标签参数 + */ + Boolean create(UserTagRequest userTagRequest); + + /** + * 删除用户标签 + * @param id 标签id + */ + Boolean delete(Integer id); + + /** + * 修改用户标签 + * @param id 标签id + * @param userTagRequest 标签参数 + */ + Boolean updateTag(Integer id, UserTagRequest userTagRequest); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserTokenService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserTokenService.java new file mode 100644 index 0000000..2cf2740 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserTokenService.java @@ -0,0 +1,24 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.user.UserToken; + +/** + * UserTokenService 接口实现 + * + */ +public interface UserTokenService extends IService { + + /** + * 获取UserToken + * @param token 微信为openid + * @param type 类型 + * @return UserToken + */ + UserToken getByOpenidAndType(String token, int type); + + void bind(String openId, int type, Integer uid); + + UserToken getTokenByUserId(Integer userId, int type); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/UserVisitRecordService.java b/fightwine-service/src/main/java/com/yzt/service/service/UserVisitRecordService.java new file mode 100644 index 0000000..6482cbf --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/UserVisitRecordService.java @@ -0,0 +1,41 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.record.UserVisitRecord; + +/** + * UserVisitRecordService 接口 + * + */ +public interface UserVisitRecordService extends IService { + + /** + * 通过日期获取浏览量 + * @param date 日期 + * @return Integer + */ + Integer getPageviewsByDate(String date); + + /** + * 通过时间段获取浏览量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getPageviewsByPeriod(String startDate, String endDate); + + /** + * 通过日期获取活跃用户数 + * @param date 日期 + * @return Integer + */ + Integer getActiveUserNumByDate(String date); + + /** + * 通过时间段获取活跃用户数 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + Integer getActiveUserNumByPeriod(String startDate, String endDate); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WeChatPayService.java b/fightwine-service/src/main/java/com/yzt/service/service/WeChatPayService.java new file mode 100644 index 0000000..460f154 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WeChatPayService.java @@ -0,0 +1,27 @@ +package com.yzt.service.service; + +import com.yzt.common.model.finance.UserRecharge; + +import java.util.Map; + +/** + * 微信支付 + * + */ +public interface WeChatPayService { + + /** + * 查询支付结果 + * @param orderNo 订单编号 + * @return + */ + Boolean queryPayResult(String orderNo); + + /** + * 微信充值预下单接口 + * @param userRecharge 充值订单 + * @param clientIp ip + * @return 获取wechat.requestPayment()参数 + */ + Map unifiedRecharge(UserRecharge userRecharge, String clientIp); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatCallbackService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatCallbackService.java new file mode 100644 index 0000000..200cfb0 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatCallbackService.java @@ -0,0 +1,18 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatCallback; + +/** + * 微信小程序回调Service + * + */ +public interface WechatCallbackService extends IService { + + /** + * 微信回调 + * @param request request + * @return String + */ + String callback(String request); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatExceptionsService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatExceptionsService.java new file mode 100644 index 0000000..d7271d3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatExceptionsService.java @@ -0,0 +1,16 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatExceptions; + +/** + * 微信异常服务类 + * fw_ + */ +public interface WechatExceptionsService extends IService { + + /** + * 自动删除日志 + */ + void autoDeleteLog(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatMediaService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatMediaService.java new file mode 100644 index 0000000..08ef51b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatMediaService.java @@ -0,0 +1,17 @@ +package com.yzt.service.service; + +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +public interface WechatMediaService { + + /** + * 微信上传素材 + * @param file 文件 + * @param type 类型 + * @return Map + * @throws Exception + */ + Map upload(MultipartFile file, String type); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatMerchantConfigService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatMerchantConfigService.java new file mode 100644 index 0000000..7f78745 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatMerchantConfigService.java @@ -0,0 +1,25 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatMerchantConfig; +import com.yzt.common.vo.WechatMerchantConfigVo; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +public interface WechatMerchantConfigService extends IService { + + /** + * 保存或更新微信商户配置(按当前租户) + */ + Boolean saveOrUpdateByTenant(WechatMerchantConfigVo vo, Long currentTenantId, Integer operatorId); + /** + * 获取当前租户的微信配置(脱敏) + */ + WechatMerchantConfigVo getByTenant(Long tenantId); + + + +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatNewService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatNewService.java new file mode 100644 index 0000000..0b0d81d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatNewService.java @@ -0,0 +1,182 @@ +package com.yzt.service.service; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.response.WeChatJsSdkConfigResponse; +import com.yzt.common.token.WeChatOauthToken; +import com.yzt.common.vo.*; + +import java.util.List; +import java.util.Map; + +/** + * 微信公用服务 + * fw_ + */ +public interface WechatNewService { + + /** + * 获取公众号accessToken + * @return 公众号accessToken + */ + String getPublicAccessToken(); + + /** + * 获取小程序accessToken + * @return 小程序accessToken + */ + String getMiniAccessToken(); + + /** + * 获取开放平台access_token + * 通过 code 获取 + * 公众号使用 + * @return 开放平台accessToken对象 + */ + WeChatOauthToken getOauth2AccessToken(String code); + + /** + * 获取开放平台用户信息 + * @param accessToken 调用凭证 + * @param openid 普通用户的标识,对当前开发者帐号唯一 + * 公众号使用 + * @return 开放平台用户信息对象 + */ + WeChatAuthorizeLoginUserInfoVo getSnsUserInfo(String accessToken, String openid); + + /** + * 小程序登录凭证校验 + * @return 小程序登录校验对象 + */ + WeChatMiniAuthorizeVo miniAuthCode(String code); + + /** + * 获取微信公众号js配置参数 + * @return WeChatJsSdkConfigResponse + */ + WeChatJsSdkConfigResponse getJsSdkConfig(String url); + + /** + * 生成小程序码 + * @param page 必须是已经发布的小程序存在的页面 + * @param scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符 + * @return 小程序码 + */ + String createQrCode(String page, String scene); + + + /** + * 生成小程序码 + * + * @param jsonObject + * @return 小程序码 + */ + String createQrCode(JSONObject jsonObject); + /** + * 微信预下单接口(统一下单) + * @param unifiedorderVo 预下单请求对象 + * @return 微信预下单返回对象 + */ + CreateOrderResponseVo payUnifiedorder(CreateOrderRequestVo unifiedorderVo); + + /** + * 微信支付查询订单 + * @return 支付订单查询结果 + */ + MyRecord payOrderQuery(Map payVo); + + /** + * 微信公众号发送模板消息 + * @param templateMessage 模板消息对象 + * @return 是否发送成功 + */ + Boolean sendPublicTemplateMessage(TemplateMessageVo templateMessage); + + /** + * 微信小程序发送订阅消息 + * @param templateMessage 消息对象 + * @return 是否发送成功 + */ + Boolean sendMiniSubscribeMessage(TemplateMessageVo templateMessage); + + /** + * 获取微信公众号自定义菜单配置 + * (使用本自定义菜单查询接口可以获取默认菜单和全部个性化菜单信息) + * @return 公众号自定义菜单 + */ + JSONObject getPublicCustomMenu(); + + /** + * 创建微信自定义菜单 + * @param data 菜单json字符串 + * @return 创建结果 + */ + Boolean createPublicCustomMenu(String data); + + /** + * 删除微信自定义菜单 + * @return 删除结果 + */ + Boolean deletePublicCustomMenu(); + + /** + * 企业号上传其他类型永久素材 + * 获取url + * @param type 素材类型:图片(image)、语音(voice)、视频(video),普通文件(file) + */ + String qyapiAddMaterialUrl(String type); + + /** + * 微信申请退款 + * @param wxRefundVo 微信申请退款对象 + * @param path 商户p12证书绝对路径 + * @return 申请退款结果对象 + */ + WxRefundResponseVo payRefund(WxRefundVo wxRefundVo, String path); + + /** + * 获取我的公众号模板消息列表 + * @return List + */ + List getPublicMyTemplateList(); + + /** + * 删除微信公众号模板消息 + * @return Boolean + */ + Boolean delPublicMyTemplate(String templateId); + + /** + * 添加公众号模板消息 + * @param templateIdShort 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 + * @return 公众号模板编号(自己的) + */ + String apiAddPublicTemplate(String templateIdShort); + + /** + * 获取当前帐号下的个人模板列表(订阅消息) + * @return List + */ + List getRoutineMyTemplateList(); + + /** + * 删除微信小程序订阅消息 + * @return Boolean + */ + Boolean delRoutineMyTemplate(String priTmplId); + + /** + * 获取小程序平台上的标准模板 + * @param tempKey 模板编号 + * @return List + */ + List getRoutineTemplateByWechat(String tempKey); + + /** + * 添加小程序订阅消息 + * @param tempKey 模板编号 + * @param kidList 小程序订阅消息模板kid数组 + * @return 小程序订阅消息模板编号(自己的) + */ + String apiAddRoutineTemplate(String tempKey, List kidList); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatPayInfoService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatPayInfoService.java new file mode 100644 index 0000000..0ea6832 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatPayInfoService.java @@ -0,0 +1,18 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatPayInfo; + +/** + * WechatPayInfoService 接口 + * fw_ + */ +public interface WechatPayInfoService extends IService { + + /** + * 获取详情(商户订单号) + * @param outTradeNo 商户订单号 + * @return WechatPayInfo + */ + WechatPayInfo getByNo(String outTradeNo); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatProgramMyTempService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatProgramMyTempService.java new file mode 100644 index 0000000..6ad6739 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatProgramMyTempService.java @@ -0,0 +1,21 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatProgramMyTemp; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.WechatProgramMyTempSearchRequest; + +import java.util.HashMap; +import java.util.List; + +/** + * WechatProgramMyTempService 接口 + * + */ +public interface WechatProgramMyTempService extends IService { + + List getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest); + + void push(int myTempId, HashMap map, Integer userId); + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatPublicService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatPublicService.java new file mode 100644 index 0000000..026f440 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatPublicService.java @@ -0,0 +1,26 @@ +package com.yzt.service.service; + +/** + * 微信公众号service + * + */ +public interface WechatPublicService { + + /** + * 获取公众号自定义菜单 + */ + Object getCustomizeMenus(); + + /** + * 保存自定义菜单 + * @param data 菜单json + * @return Boolean + */ + Boolean createMenus(String data); + + /** + * 删除自定义菜单 + * @return Boolean + */ + Boolean deleteMenus(); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatReplyService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatReplyService.java new file mode 100644 index 0000000..36fbbc7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatReplyService.java @@ -0,0 +1,56 @@ +package com.yzt.service.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yzt.common.model.wechat.WechatReply; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.WechatReplyRequest; +import com.yzt.common.request.WechatReplySearchRequest; + +import java.util.List; + +/** + * WechatReplyService 接口 + * + */ +public interface WechatReplyService extends IService { + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + List getList(WechatReplySearchRequest request, PageParamRequest pageParamRequest); + + /** + * 新增微信关键字回复表 + * @param wechatReply 新增参数 + */ + Boolean create(WechatReply wechatReply); + + /** + * 根据关键字查询数据 + * @param keywords 新增参数 + * @return WechatReply + */ + WechatReply getVoByKeywords(String keywords); + + /** + * 查询微信关键字回复表信息 + * @param id Integer + */ + WechatReply getInfo(Integer id); + + /** + * 修改微信关键字回复表 + * @param wechatReplyRequest 修改参数 + */ + Boolean updateReply(WechatReplyRequest wechatReplyRequest); + + /** + * 修改状态 + * @param id integer id + * @param status boolean 状态 + */ + Boolean updateStatus(Integer id, Boolean status); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/WechatUserService.java b/fightwine-service/src/main/java/com/yzt/service/service/WechatUserService.java new file mode 100644 index 0000000..de79ce6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/WechatUserService.java @@ -0,0 +1,9 @@ +package com.yzt.service.service; + +/** + * 微信用户表 服务类 + * + */ +public interface WechatUserService{ +// void push(String userId, Integer newsId); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/YlyPrintService.java b/fightwine-service/src/main/java/com/yzt/service/service/YlyPrintService.java new file mode 100644 index 0000000..06fce34 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/YlyPrintService.java @@ -0,0 +1,14 @@ +package com.yzt.service.service; + +/** + * 易联云打印订单 service + * + */ +public interface YlyPrintService { + /** + * 易联云打印商品信息 + * @param ordId 订单id + * @param isAuto 是否自动打印 + */ + void YlyPrint(String ordId,boolean isAuto); +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ActivityStyleServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ActivityStyleServiceImpl.java new file mode 100644 index 0000000..1af9646 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ActivityStyleServiceImpl.java @@ -0,0 +1,418 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.DateConstants; +import com.yzt.common.constants.ProductConstants; +import com.yzt.common.model.acticitystyle.ActivityStyle; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ActivityStyleSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityStyleResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.mapper.ActivityStyleMapper; +import com.yzt.service.service.ActivityStyleService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * 活动样式 + * + * @description ActivityStyleServiceImpl 接口实现 + * + */ +@Service +public class ActivityStyleServiceImpl extends ServiceImpl implements ActivityStyleService { + + private static final Logger logger = LoggerFactory.getLogger(ActivityStyleService.class); + + @Resource + private ActivityStyleMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private YztConfig yztConfig; + + /** + * 列表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + * @since 2023-01-05 + */ + @Override + public PageInfo getList(ActivityStyleSearchRequest request, PageParamRequest pageParamRequest) { + Page stylePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + Date currentDate = YztDateUtil.nowDateTime(); + + //带 ActivityStyle 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + // type 类型不能为空 bean中已经限制 + + lambdaQueryWrapper.eq(ActivityStyle::getType, request.getType()); + + if (ObjectUtil.isNotEmpty(request.getId()) && request.getId() > 0) { + lambdaQueryWrapper.eq(ActivityStyle::getId, request.getId()); + } + if (ObjectUtil.isNotEmpty(request.getName())) { + lambdaQueryWrapper.like(ActivityStyle::getName, URLUtil.decode(request.getName())); + } + + if (ObjectUtil.isNotEmpty(request.getStatus())) { + lambdaQueryWrapper.eq(ActivityStyle::getStatus, request.getStatus()); + } + if (ObjectUtil.isNotEmpty(request.getMethod())) { + lambdaQueryWrapper.eq(ActivityStyle::getMethod, request.getMethod()); + } + + // 时间区间 + if (ObjectUtil.isNotEmpty(request.getStarttime()) && ObjectUtil.isNotEmpty(request.getEndtime())) { +// lambdaQueryWrapper.ge(ActivityStyle::getStarttime, request.getStarttime()).le(ActivityStyle::getEndtime, request.getEndtime()); + lambdaQueryWrapper.between(ActivityStyle::getCreatetime, request.getStarttime(), request.getEndtime()); + } + // * -1 已结束 结束时间小于当前时间 + // * 1 进行中 结束时间大于当前时间 && 开始时间小于等于当前时间 + // * 0 未开始 开始时间大于当前时间 + if (ObjectUtil.isNotEmpty(request.getRunningStatus())) { + switch (request.getRunningStatus()) { + case -1: + lambdaQueryWrapper.lt(ActivityStyle::getEndtime, currentDate); + break; + case 0: + lambdaQueryWrapper.gt(ActivityStyle::getStarttime, currentDate); + break; + case 1: + lambdaQueryWrapper.ge(ActivityStyle::getEndtime, currentDate).le(ActivityStyle::getStarttime, currentDate); + break; + } + } + + lambdaQueryWrapper.orderByDesc(ActivityStyle::getCreatetime); + List activityStyles = mapper.selectList(lambdaQueryWrapper); + // 添加活动状态 + List activityStyleResponses = new ArrayList<>(); + + for (ActivityStyle activityStyle : activityStyles) { + ActivityStyleResponse activityStyleResponse = new ActivityStyleResponse(); + BeanUtils.copyProperties(activityStyle, activityStyleResponse); + activityStyleResponse.setRunningStatus(activityStyle.getStarttime(), activityStyle.getEndtime(), currentDate); + activityStyleResponses.add(activityStyleResponse); + } + return CommonPage.copyPageInfo(stylePage, activityStyleResponses); + } + + /** + * 更新 + * + * @param id id + * @param status 活动样式 状态 + * @return 更新状态结果 + */ + @Override + public boolean updateStatus(Integer id, boolean status) { + ActivityStyle activityStyle = new ActivityStyle(); + activityStyle.setId(id); + activityStyle.setStatus(status); + activityStyle.setUpdatetime(DateUtil.date()); + return updateById(activityStyle); + } + + /** + * 根据服务器时间查询正在进行和即将开始的活动边框配置 并缓存在redis中 + * 缓存时常5分钟 + * + * @param type 0边框 1背景 + * @return 正在进行和未开始的活动边框配置数据 + */ + @Override + public List getListBeforeBeginTime(boolean type) { + if (!type && redisUtil.exists(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER)) { + Object o = redisUtil.get(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER); + String s = JSON.toJSONString(o); + logger.info("已经存在的缓存活动边框:${}", s); + return JSON.parseArray(s, ActivityStyle.class); + } + if (type && redisUtil.exists(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND)) { + Object o = redisUtil.get(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND); + String s = JSON.toJSONString(o); + logger.info("已经存在的缓存活动背景:${}", s); + return JSON.parseArray(s, ActivityStyle.class); + } + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(ActivityStyle::getType, type); + lambdaQueryWrapper.eq(ActivityStyle::getStatus, Boolean.TRUE); + lambdaQueryWrapper.le(ActivityStyle::getStarttime, YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT)); + lambdaQueryWrapper.ge(ActivityStyle::getEndtime, YztDateUtil.nowDateTime(DateConstants.DATE_FORMAT)); + List activityStyles = mapper.selectList(lambdaQueryWrapper); + if (activityStyles.size() == 0) { + return new ArrayList<>(); + } + if (!type) { + redisUtil.set(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER, activityStyles, + Long.parseLong(yztConfig.getActivityStyleCachedTime().toString()), TimeUnit.SECONDS); + logger.info("新增缓存活动边框:${}", JSON.toJSONString(activityStyles)); + } else { + redisUtil.set(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND, activityStyles, + Long.parseLong(yztConfig.getActivityStyleCachedTime().toString()), TimeUnit.SECONDS); + logger.info("新增缓存活动背景:${}", JSON.toJSONString(activityStyles)); + } + + return activityStyles; + } + + /** + * 填补活动边框 + * method 0=商品参与类型 ,1=指定商品参与,2=指定品牌参与,3=指定商品分类参与, 4=指定商户产品 + * + * @param productList 待添加商品数据 + * @return 添加边框之后的商品数据 + */ + @Override + public List makeActivityBorderStyle(List productList) { + List listBeforeBeginTime = getListBeforeBeginTime(Boolean.FALSE); + if (ObjectUtil.isNotNull(listBeforeBeginTime) && listBeforeBeginTime.size() > 0) { + // 根据现有生效配置 权限最大 0=全部商品参与 过滤重复配置 并且根据更新时间倒序,仅仅第一条生效 + List activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 0).collect(Collectors.toList()); + // 如果是全部生效其他逻辑都会失效 + if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) { + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + // 全部商品生效规则下只有最后更新的生效 + ActivityStyle activityStyleCurrentAll = activityStyleAllBeforeCompare.get(0); + productList.forEach(product -> product.setActivityStyle(activityStyleCurrentAll.getStyle())); + } else { + makeActivityBorderStyleNonGlobal(productList, listBeforeBeginTime); + } + } + return productList; + } + + /** + * 填补活动边框非全局 + * method 1=指定商品参与,2=指定品牌参与,3=指定商品分类参与, 4=指定商户产品 + * + * @param productList 待添加商品数据 + * @return 添加边框之后的商品数据 + */ + private void makeActivityBorderStyleNonGlobal(List productList, List listBeforeBeginTime) { + // 过滤指定商品逻辑 1=指定商品参与 + List activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 1).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) { + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] activityBorderStyleProducts = StrUtil.split(activityStyle.getProducts(), ","); + productList.forEach(product -> { + for (String activityBorderStyleProduct : activityBorderStyleProducts) { + if (activityBorderStyleProduct.equals(product.getId().toString())) { + product.setActivityStyle(activityStyle.getStyle()); + } + } + }); + } + } + // 判断是否还有剩余商品没有指定活动边框 + long productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count(); + if (productSurplusNum <= 0L) { + return; + } + // 根据品牌过滤 2=指定品牌参与 TODO 预留 +// activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 2).collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) { +// sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); +// for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { +// if (activityStyle.getProducts().length() == 0) { +// break; +// } +// String[] activityBorderStyleBands = StrUtil.split(activityStyle.getProducts(), ","); +// productList.forEach(product -> { +// if (StrUtil.isBlank(product.getActivityStyle())) { +// for (String activityBorderStyleBand : activityBorderStyleBands) { +// if (ObjectUtil.isNotEmpty(product.getBrandId()) && product.getBrandId() > 0 && activityBorderStyleBand.equals(product.getBrandId().toString())) { +// product.setActivityStyle(activityStyle.getStyle()); +// } +// } +// } +// }); +// } +// } + productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count(); + if (productSurplusNum <= 0L) { + return; + } + // 根据分类过滤 3=指定商品分类参与 + activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 3).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) { + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] platCategoryIds = StrUtil.split(activityStyle.getProducts(), ","); + productList.forEach(product -> { + if (StrUtil.isBlank(product.getActivityStyle())) { + for (String pcid : platCategoryIds) { + if (ObjectUtil.isNotEmpty(product.getCateId())) { + List proCateIdList = YztUtil.stringToArray(product.getCateId()); + if (proCateIdList.contains(Integer.valueOf(pcid))) { + product.setActivityStyle(activityStyle.getStyle()); + } + } + } + } + }); + } + } + productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count(); + if (productSurplusNum <= 0L) { + return; + } + // 根据山谷过滤 4=包含的商户所有商品参与 + activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 4).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) { + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] merIds = StrUtil.split(activityStyle.getProducts(), ","); + productList.forEach(product -> { + if (StrUtil.isBlank(product.getActivityStyle())) { + for (String merid : merIds) { + if (merid.equals(product.getMerId().toString())) { + product.setActivityStyle(activityStyle.getStyle()); + } + } + } + }); + } + } + } + + /** + * 填补活动背景 用于商品详情 + * + * @param product 待添加活动背景的商品 + * @return 已经添加活动背景的商品 + */ + @Override + public String makeActivityBackgroundStyle(StoreProduct product) { + List listBeforeBeginTime = getListBeforeBeginTime(Boolean.TRUE); + // 根据现有生效配置 权限最大 0=全部商品参与 过滤重复配置 并且根据更新时间倒序,仅仅第一条生效 + List activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 0).collect(Collectors.toList()); + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + // 如果是全部生效其他逻辑都会失效 + if (activityStyleAllBeforeCompare.size() > 0) { + // 全部商品生效规则下只有最后更新的生效 + ActivityStyle activityStyleCurrentAll = activityStyleAllBeforeCompare.get(0); +// product.setActivityStyle(activityStyleCurrentAll.getStyle()); + return activityStyleCurrentAll.getStyle(); + } else { + // 过滤指定商品逻辑 1=指定商品参与 + activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 1).collect(Collectors.toList()); + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] activityBorderStyleProducts = StrUtil.split(activityStyle.getProducts(), ","); + for (String activityBorderStyleProduct : activityBorderStyleProducts) { + if (activityBorderStyleProduct.equals(product.getId().toString())) { +// product.setActivityStyle(activityStyle.getStyle()); + return activityStyle.getStyle(); + } + } + } +// // 根据品牌过滤 2=指定品牌参与 TODO 预留 +// activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 2).collect(Collectors.toList()); +// sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); +// for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { +// if (activityStyle.getProducts().length() == 0) { +// break; +// } +// String[] activityBorderStyleBands = StrUtil.split(activityStyle.getProducts(), ","); +// for (String activityBorderStyleBand : activityBorderStyleBands) { +// if (ObjectUtil.isNotEmpty(product.getBrandId()) && activityBorderStyleBand.equals(product.getBrandId().toString())) { +//// product.setActivityStyle(activityStyle.getStyle()); +// return activityStyle.getStyle(); +// } +// } +// } + // 根据分类过滤 3=指定商品分类参与 + activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 3).collect(Collectors.toList()); + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] platCategoryIds = StrUtil.split(activityStyle.getProducts(), ","); + for (String pcid : platCategoryIds) { + if (pcid.equals(product.getCateId().toString())) { +// product.setActivityStyle(activityStyle.getStyle()); + return activityStyle.getStyle(); + } + } + } + // 根据山谷过滤 4=包含的商户所有商品参与 + activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 4).collect(Collectors.toList()); + sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare); + for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) { + if (activityStyle.getProducts().length() == 0) { + break; + } + String[] merIds = StrUtil.split(activityStyle.getProducts(), ","); + for (String merid : merIds) { + if (merid.equals(product.getMerId().toString())) { +// product.setActivityStyle(activityStyle.getStyle()); + return activityStyle.getStyle(); + } + } + } + } + return null; + } + + /** + * 根据更新时间倒序排序活动数据 + * + * @param toSortActivityStyleByUpdateTime 待排序活动对象集合 + */ + private void sortByActivityStyleByUpdateTime(List toSortActivityStyleByUpdateTime) { + Collections.sort(toSortActivityStyleByUpdateTime, new Comparator() { + @Override + public int compare(ActivityStyle o1, ActivityStyle o2) { + return YztDateUtil.compareDate( + YztDateUtil.dateToStr(o2.getUpdatetime(), DateConstants.DATE_FORMAT), + YztDateUtil.dateToStr(o1.getUpdatetime(), DateConstants.DATE_FORMAT), DateConstants.DATE_FORMAT); + } + }); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ArticleServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..24fe303 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ArticleServiceImpl.java @@ -0,0 +1,265 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.article.Article; +import com.yzt.common.model.category.Category; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ArticleRequest; +import com.yzt.common.request.ArticleSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ArticleResponse; +import com.yzt.common.vo.ArticleVo; +import com.yzt.service.mapper.ArticleMapper; +import com.yzt.service.service.ArticleService; +import com.yzt.service.service.CategoryService; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemConfigService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** +* ArticleServiceImpl 接口实现 +* fw_ +*/ +@Service +public class ArticleServiceImpl extends ServiceImpl implements ArticleService { + + private Logger logger = LoggerFactory.getLogger(ArticleServiceImpl.class); + + @Resource + private ArticleMapper mapper; + + @Autowired + private CategoryService categoryService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 列表 + * @param cid 文章分类id + * @param pageParamRequest 分页类参数 + * @return PageInfo
+ */ + @Override + public PageInfo getList(String cid, PageParamRequest pageParamRequest) { + Page
articlePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + LambdaQueryWrapper
lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(Article::getCid, cid); + lambdaQueryWrapper.eq(Article::getHide, false); + lambdaQueryWrapper.eq(Article::getStatus, false); + lambdaQueryWrapper.orderByDesc(Article::getSort).orderByDesc(Article::getVisit).orderByDesc(Article::getCreateTime); + List
articleList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(articleList)) { + return CommonPage.copyPageInfo(articlePage, CollUtil.newArrayList()); + } + List responseList = articleList.stream().map(e -> { + ArticleResponse articleResponse = new ArticleResponse(); + BeanUtils.copyProperties(e, articleResponse); + return articleResponse; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(articlePage, responseList); + } + + /** + * 获取文章列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getAdminList(ArticleSearchRequest request, PageParamRequest pageParamRequest) { + Page
articlePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + LambdaQueryWrapper
lambdaQueryWrapper = Wrappers.lambdaQuery(); + if (StringUtils.isNotBlank(request.getCid())) { + lambdaQueryWrapper.eq(Article::getCid, request.getCid()); + } + if (!StringUtils.isBlank(request.getKeywords())) { + lambdaQueryWrapper.and(i -> i.or().like(Article::getTitle, request.getKeywords()) + .or().like(Article::getAuthor, request.getKeywords()) + .or().like(Article::getSynopsis, request.getKeywords())); + } + lambdaQueryWrapper.orderByDesc(Article::getVisit).orderByDesc(Article::getId); + List
articleList = mapper.selectList(lambdaQueryWrapper); + + ArrayList articleVoArrayList = new ArrayList<>(); + if (articleList.size() < 1) { + return CommonPage.copyPageInfo(articlePage, articleVoArrayList); + } + for (Article article : articleList) { + ArticleVo articleVo = new ArticleVo(); + BeanUtils.copyProperties(article, articleVo); + if (!StrUtil.isBlank(article.getImageInput()) ) { + articleVo.setImageInput(article.getImageInput()); + } + articleVoArrayList.add(articleVo); + } + return CommonPage.copyPageInfo(articlePage, articleVoArrayList); + } + + /** + * 查询文章详情 + * @param id Integer + * @return ArticleVo + */ + @Override + public ArticleResponse getVoByFront(Integer id) { + Article article = getById(id); + if (ObjectUtil.isNull(article)) { + throw new YztException("文章不存在"); + } + + if (article.getStatus()) { + throw new YztException("文章不存在"); + } + + ArticleResponse articleResponse = new ArticleResponse(); + BeanUtils.copyProperties(article, articleResponse); + + String visit = StrUtil.isNotBlank(article.getVisit()) ? article.getVisit() : "0"; + int num = Integer.parseInt(visit) + 1; + article.setVisit(String.valueOf(num)); + article.setUpdateTime(DateUtil.date()); + mapper.updateById(article); + return articleResponse; + } + + /** + * 获取移动端banner列表 + * @return List
+ */ + @Override + public List
getBannerList() { + // 根据配置控制banner的数量 + String articleBannerLimitString = systemConfigService.getValueByKey(Constants.ARTICLE_BANNER_LIMIT); + int articleBannerLimit = Integer.parseInt(articleBannerLimitString); + + LambdaQueryWrapper
lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(Article::getId, Article::getImageInput); + lambdaQueryWrapper.eq(Article::getIsBanner, true); + lambdaQueryWrapper.eq(Article::getHide, false); + lambdaQueryWrapper.eq(Article::getStatus, false); + lambdaQueryWrapper.orderByDesc(Article::getSort); + lambdaQueryWrapper.last(" limit " + articleBannerLimit); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取移动端热门列表 + * @return List + */ + @Override + public List getHotList() { + LambdaQueryWrapper
lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(Article::getId, Article::getImageInput, Article::getTitle, Article::getCreateTime); + lambdaQueryWrapper.eq(Article::getIsHot, true); + lambdaQueryWrapper.eq(Article::getHide, false); + lambdaQueryWrapper.eq(Article::getStatus, false); + lambdaQueryWrapper.orderByDesc(Article::getSort); + lambdaQueryWrapper.last(" limit 20"); + List
articleList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(articleList)) { + return CollUtil.newArrayList(); + } + List responseList = articleList.stream().map(e -> { + ArticleResponse articleResponse = new ArticleResponse(); + BeanUtils.copyProperties(e, articleResponse); + return articleResponse; + }).collect(Collectors.toList()); + return responseList; + } + + /** + * 获取文章分类列表(移动端) + * @return List + */ + @Override + public List getCategoryList() { + return categoryService.findArticleCategoryList(); + } + + /** + * 文章新增 + * @param articleRequest 文章新增参数 + * @return Boolean + */ + @Override + public Boolean create(ArticleRequest articleRequest) { + Article article = new Article(); + BeanUtils.copyProperties(articleRequest, article); + article.setImageInput(systemAttachmentService.clearPrefix(article.getImageInput())); + article.setContent(systemAttachmentService.clearPrefix(article.getContent())); + article.setVisit("0"); + return save(article); + } + + /** + * 文章删除 + * @param id 文章id + * @return Boolean + */ + @Override + public Boolean deleteById(Integer id) { + Article article = getById(id); + if (ObjectUtil.isNull(article)) { + throw new YztException("文章已删除"); + } + return removeById(id); + } + + /** + * 文章修改 + * @param id 文章id + * @param articleRequest 文章修改参数 + */ + @Override + public Boolean updateArticle(Integer id, ArticleRequest articleRequest) { + Article article = new Article(); + BeanUtils.copyProperties(articleRequest, article); + article.setId(id); + article.setImageInput(systemAttachmentService.clearPrefix(article.getImageInput())); + article.setContent(systemAttachmentService.clearPrefix(article.getContent())); + article.setUpdateTime(DateUtil.date()); + return updateById(article); + } + + /** + * 获取文章详情 + * @param id 文章id + * @return Article + */ + @Override + public Article getDetail(Integer id) { + Article article = getById(id); + if (ObjectUtil.isNull(article)) { + throw new YztException("文章不存在"); + } + return article; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/CallbackServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/CallbackServiceImpl.java new file mode 100644 index 0000000..74ec57f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/CallbackServiceImpl.java @@ -0,0 +1,437 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.TaskConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.user.User; +import com.yzt.common.model.wechat.WechatPayInfo; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.WxPayUtil; +import com.yzt.common.vo.AttachVo; +import com.yzt.common.vo.CallbackVo; +import com.yzt.common.vo.MyRecord; +import com.yzt.service.service.*; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yzt.common.model.product.StoreProductAttr; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.http.HttpServletRequest; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.*; + + +/** + * 订单支付回调 CallbackService 实现类 + * + */ +@Service +public class CallbackServiceImpl implements CallbackService { + + private static final Logger logger = LoggerFactory.getLogger(CallbackServiceImpl.class); + + @Autowired + private RechargePayService rechargePayService; + + @Lazy + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private UserService userService; + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Lazy + @Autowired + private StoreCombinationService storeCombinationService; + + @Lazy + @Autowired + private StorePinkService storePinkService; + + @Autowired + private com.yzt.service.service.StoreProductAttrService storeProductAttrService; + + @Autowired + private WechatPayInfoService wechatPayInfoService; + + /** + * 微信支付回调 + */ + @Override + public String weChat(String xmlInfo) { + StringBuffer sb = new StringBuffer(); + sb.append(""); + if(StrUtil.isBlank(xmlInfo)){ + sb.append(""); + sb.append(""); + sb.append(""); + logger.error("wechat callback error : " + sb.toString()); + return sb.toString(); + } + + try{ + HashMap map = WxPayUtil.processResponseXml(xmlInfo); + // 通信是否成功 + String returnCode = (String) map.get("return_code"); + if (!returnCode.equals(Constants.SUCCESS)) { + sb.append(""); + sb.append(""); + sb.append(""); + logger.error("wechat callback error : wx pay return code is fail returnMsg : " + map.get("return_msg")); + return sb.toString(); + } + // 交易是否成功 + String resultCode = (String) map.get("result_code"); + if (!resultCode.equals(Constants.SUCCESS)) { + sb.append(""); + sb.append(""); + sb.append(""); + logger.error("wechat callback error : wx pay result code is fail"); + return sb.toString(); + } + + //解析xml + CallbackVo callbackVo = YztUtil.mapToObj(map, CallbackVo.class); + AttachVo attachVo = JSONObject.toJavaObject(JSONObject.parseObject(callbackVo.getAttach()), AttachVo.class); + + //判断openid + User user = userService.getById(attachVo.getUserId()); + if (ObjectUtil.isNull(user)) { + //用户信息错误 + throw new YztException("用户信息错误!"); + } + + //根据类型判断是订单或者充值 + if (!Constants.SERVICE_PAY_TYPE_ORDER.equals(attachVo.getType()) && !Constants.SERVICE_PAY_TYPE_RECHARGE.equals(attachVo.getType())) { + logger.error("wechat pay err : 未知的支付类型==》" + callbackVo.getOutTradeNo()); + throw new YztException("未知的支付类型!"); + } + // 订单 + if (Constants.SERVICE_PAY_TYPE_ORDER.equals(attachVo.getType())) { + StoreOrder orderParam = new StoreOrder(); + orderParam.setOutTradeNo(callbackVo.getOutTradeNo()); + orderParam.setUid(attachVo.getUserId()); + + StoreOrder storeOrder = storeOrderService.getInfoByEntity(orderParam); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("wechat pay error : 订单信息不存在==》" + callbackVo.getOutTradeNo()); + throw new YztException("wechat pay error : 订单信息不存在==》" + callbackVo.getOutTradeNo()); + } + if (storeOrder.getPaid()) { + logger.error("wechat pay error : 订单已处理==》" + callbackVo.getOutTradeNo()); + sb.append(""); + sb.append(""); + sb.append(""); + return sb.toString(); + } + WechatPayInfo wechatPayInfo = wechatPayInfoService.getByNo(storeOrder.getOutTradeNo()); + if (ObjectUtil.isNull(wechatPayInfo)) { + logger.error("wechat pay error : 微信订单信息不存在==》" + callbackVo.getOutTradeNo()); + throw new YztException("wechat pay error : 微信订单信息不存在==》" + callbackVo.getOutTradeNo()); + } + wechatPayInfo.setIsSubscribe(callbackVo.getIsSubscribe()); + wechatPayInfo.setBankType(callbackVo.getBankType()); + wechatPayInfo.setCashFee(callbackVo.getCashFee()); + wechatPayInfo.setCouponFee(callbackVo.getCouponFee()); + wechatPayInfo.setTransactionId(callbackVo.getTransactionId()); + wechatPayInfo.setTimeEnd(callbackVo.getTimeEnd()); + + // 添加支付成功redis队列 + Boolean execute = transactionTemplate.execute(e -> { + storeOrder.setPaid(true); + storeOrder.setPayTime(YztDateUtil.nowDateTime()); + storeOrder.setUpdateTime(DateUtil.date()); + storeOrderService.updateById(storeOrder); + // ==================== 扣除积分逻辑已禁用 ==================== + /* 原扣除积分逻辑已注释 + if (storeOrder.getUseIntegral() > 0) { + userService.updateIntegral(user, java.math.BigDecimal.valueOf(storeOrder.getUseIntegral()), "sub"); + } + */ + // ==================== 扣除积分逻辑已禁用 ==================== + wechatPayInfoService.updateById(wechatPayInfo); + + // 拼团逻辑已移除:StorePink 记录的创建统一由 handlePostPay->processQueueLogic 处理 + + return Boolean.TRUE; + }); + if (!execute) { + logger.error("wechat pay error : 订单更新失败==》" + callbackVo.getOutTradeNo()); + sb.append(""); + sb.append(""); + sb.append(""); + return sb.toString(); + } + redisUtil.lPush(TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER, storeOrder.getOrderId()); + } + // 充值 + if (Constants.SERVICE_PAY_TYPE_RECHARGE.equals(attachVo.getType())) { + UserRecharge userRecharge = userRechargeService.getByOutTradeNo(callbackVo.getOutTradeNo()); + if(ObjectUtil.isNull(userRecharge)){ + throw new YztException("没有找到订单信息"); + } + if(userRecharge.getPaid()){ + sb.append(""); + sb.append(""); + sb.append(""); + return sb.toString(); + } + // 支付成功处理 + Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge); + if (!rechargePayAfter) { + logger.error("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); + throw new YztException("wechat pay error : 数据保存失败==》" + callbackVo.getOutTradeNo()); + } + } + sb.append(""); + sb.append(""); + }catch (Exception e){ + sb.append(""); + sb.append(""); + logger.error("wechat pay error : 业务异常==》" + e.getMessage()); + } + sb.append(""); + logger.error("wechat callback response : " + sb.toString()); + return sb.toString(); + } + + + /** + * 将request中的参数转换成Map + * @param request + * @return + */ + private Map convertRequestParamsToMap(HttpServletRequest request) { + Map retMap = new HashMap(); + Map requestParams = request.getParameterMap(); + for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { + String name = (String) iter.next(); + String[] values = (String[]) requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] + : valueStr + values[i] + ","; + } + //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 + //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); + retMap.put(name, valueStr); + } + return retMap; + } + + /** + * 微信退款回调 + * @param xmlInfo 微信回调json + * @return MyRecord + */ + @Override + public String weChatRefund(String xmlInfo) { + MyRecord notifyRecord = new MyRecord(); + MyRecord refundRecord = refundNotify(xmlInfo, notifyRecord); + if (refundRecord.getStr("status").equals("fail")) { + logger.error("微信退款回调失败==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord); + return refundRecord.getStr("returnXml"); + } + + if (!refundRecord.getBoolean("isRefund")) { + logger.error("微信退款回调失败==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord); + return refundRecord.getStr("returnXml"); + } + String outRefundNo = notifyRecord.getStr("out_refund_no"); + StoreOrder storeOrder = storeOrderService.getByOderId(outRefundNo); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("微信退款订单查询失败==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord); + return refundRecord.getStr("returnXml"); + } + if (storeOrder.getRefundStatus() == 2) { + logger.warn("微信退款订单已确认成功==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord); + return refundRecord.getStr("returnXml"); + } + storeOrder.setRefundStatus(2); + storeOrder.setUpdateTime(DateUtil.date()); + boolean update = storeOrderService.updateById(storeOrder); + if (update) { + // 退款task + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, storeOrder.getId()); + } else { + logger.warn("微信退款订单更新失败==>" + refundRecord.getColumns() + ", rawData==>" + xmlInfo + ", data==>" + notifyRecord); + } + return refundRecord.getStr("returnXml"); + } + + /** + * 支付订单回调通知 + * @return MyRecord + */ + private MyRecord refundNotify(String xmlInfo, MyRecord notifyRecord) { + MyRecord refundRecord = new MyRecord(); + refundRecord.set("status", "fail"); + StringBuilder sb = new StringBuilder(); + sb.append(""); + if(StrUtil.isBlank(xmlInfo)){ + sb.append(""); + sb.append(""); + sb.append(""); + logger.error("wechat refund callback error : " + sb.toString()); + return refundRecord.set("returnXml", sb.toString()).set("errMsg", "xmlInfo is blank"); + } + + Map respMap; + try { + respMap = WxPayUtil.xmlToMap(xmlInfo); + } catch (Exception e) { + sb.append(""); + sb.append(""); + sb.append(""); + logger.error("wechat refund callback error : " + e.getMessage()); + return refundRecord.set("returnXml", sb.toString()).set("errMsg", e.getMessage()); + } + + notifyRecord.setColums(_strMap2ObjMap(respMap)); + // 这里的可以应该根据小程序还是公众号区分 + String return_code = respMap.get("return_code"); + if (return_code.equals(Constants.SUCCESS)) { + String appid = respMap.get("appid"); + String signKey = getSignKey(appid); + // 解码加密信息 + String reqInfo = respMap.get("req_info"); + System.out.println("encodeReqInfo==>" + reqInfo); + try { + String decodeInfo = decryptToStr(reqInfo, signKey); + Map infoMap = WxPayUtil.xmlToMap(decodeInfo); + notifyRecord.setColums(_strMap2ObjMap(infoMap)); + + String refund_status = infoMap.get("refund_status"); + refundRecord.set("isRefund", refund_status.equals(Constants.SUCCESS)); + } catch (Exception e) { + refundRecord.set("isRefund", false); + logger.error("微信退款回调异常,e==》" + e.getMessage()); + } + } else { + notifyRecord.set("return_msg", respMap.get("return_msg")); + refundRecord.set("isRefund", false); + } + sb.append(""); + sb.append(""); + sb.append(""); + return refundRecord.set("returnXml", sb.toString()).set("status", "ok"); + } + + private String getSignKey(String appid) { + String publicAppid = systemConfigService.getValueByKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + String miniAppid = systemConfigService.getValueByKey(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + String appAppid = systemConfigService.getValueByKey(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_APP_ID); + String signKey = ""; + if (StrUtil.isBlank(publicAppid) && StrUtil.isBlank(miniAppid) && StrUtil.isBlank(appAppid)) { + throw new YztException("pay_weixin_appid或pay_routine_appid不能都为空"); + } + if (StrUtil.isNotBlank(publicAppid) && appid.equals(publicAppid)) { + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (StrUtil.isNotBlank(miniAppid) && appid.equals(miniAppid)) { + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + if (StrUtil.isNotBlank(appAppid) && appid.equals(appAppid)) { + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_APP_KEY); + } + return signKey; + } + + /** + * java自带的是PKCS5Padding填充,不支持PKCS7Padding填充。 + * 通过BouncyCastle组件来让java里面支持PKCS7Padding填充 + * 在加解密之前加上:Security.addProvider(new BouncyCastleProvider()), + * 并给Cipher.getInstance方法传入参数来指定Java使用这个库里的加/解密算法。 + */ + public static String decryptToStr(String reqInfo, String signKey) throws Exception { + Security.addProvider(new BouncyCastleProvider()); +// byte[] decodeReqInfo = Base64.decode(reqInfo); + byte[] decodeReqInfo = base64DecodeJustForWxPay(reqInfo).getBytes(StandardCharsets.ISO_8859_1); + SecretKeySpec key = new SecretKeySpec(SecureUtil.md5(signKey).toLowerCase().getBytes(), "AES"); + Cipher cipher; + cipher = Cipher.getInstance("AES/ECB/PKCS7Padding"); + cipher.init(Cipher.DECRYPT_MODE, key); + return new String(cipher.doFinal(decodeReqInfo), StandardCharsets.UTF_8); + } + + private static final List list = new ArrayList<>(); + static { + list.add("total_fee"); + list.add("cash_fee"); + list.add("coupon_fee"); + list.add("coupon_count"); + list.add("refund_fee"); + list.add("settlement_refund_fee"); + list.add("settlement_total_fee"); + list.add("cash_refund_fee"); + list.add("coupon_refund_fee"); + list.add("coupon_refund_count"); + } + + private Map _strMap2ObjMap(Map params) { + Map map = new HashMap<>(); + for (Map.Entry entry : params.entrySet()) { + if (list.contains(entry.getKey())) { + try { + map.put(entry.getKey(), Integer.parseInt(entry.getValue())); + } catch (NumberFormatException e) { + map.put(entry.getKey(), 0); + logger.error("字段格式错误,key==》" + entry.getKey() + ", value==》" + entry.getValue()); + } + continue; + } + + map.put(entry.getKey(), entry.getValue()); + } + return map; + } + + /** + * 仅仅为微信解析密文使用 + * @param source 待解析密文 + * @return 结果 + */ + public static String base64DecodeJustForWxPay(final String source) { + String result = ""; + final Base64.Decoder decoder = Base64.getDecoder(); + try { + result = new String(decoder.decode(source), "ISO-8859-1"); + } catch (final UnsupportedEncodingException e) { + e.printStackTrace(); + } + return result; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/CategoryServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..aac9087 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/CategoryServiceImpl.java @@ -0,0 +1,437 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.CategoryConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.category.Category; +import com.yzt.common.request.CategoryRequest; +import com.yzt.common.request.CategorySearchRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.CategoryTreeVo; +import com.yzt.service.mapper.CategoryMapper; +import com.yzt.service.service.CategoryService; +import com.yzt.service.service.SystemAttachmentService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * CategoryServiceImpl 接口实现 +* fw_ +*/ +@Service +public class CategoryServiceImpl extends ServiceImpl implements CategoryService { + + @Resource + private CategoryMapper mapper; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + + /** + * 获取分类下子类的数量 + * @param request 请求参数 + * @return List + */ + @Override + public List getList(CategorySearchRequest request) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(null != request.getPid()){ + lambdaQueryWrapper.eq(Category::getPid, request.getPid()); + } + if(null != request.getType()){ + lambdaQueryWrapper.eq(Category::getType, request.getType()); + } + if(ObjectUtil.isNotNull(request.getStatus()) && request.getStatus() >= 0){ + lambdaQueryWrapper.eq(Category::getStatus, request.getStatus().equals(CategoryConstants.CATEGORY_STATUS_NORMAL)); + } + if(null != request.getName()){ + lambdaQueryWrapper.like(Category::getName, request.getName()); + } + lambdaQueryWrapper.orderByDesc(Category::getSort).orderByDesc(Category::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 通过id集合获取列表 + * @param idList List id集合 + * @return List + */ + @Override + public List getByIds(List idList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(Category::getId, idList); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 通过name获取列表 + * @param name String id集合 + * @return List + */ + public List getByName(String name) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(Category::getName, name); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取父级id集合 + * @param idList + * @return + */ + @Override + public List getByPIds(List idList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(Category::getPid, idList); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 通过id集合获取列表 id => name + * @param cateIdList List id集合 + * @return HashMap + */ + @Override + public HashMap getListInId(List cateIdList) { + HashMap map = new HashMap<>(); + List list = getByIds(cateIdList); + for (Category category : list){ + map.put(category.getId(), category.getName()); + } + + return map; + } + + /** + * 查询id和url是否存在 + * @return Boolean + */ + @Override + public Boolean checkAuth(List pathIdList, String uri) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(Category::getId, pathIdList).eq(Category::getUrl, uri); + List categoryList = mapper.selectList(lambdaQueryWrapper); + if(categoryList.size() < 1){ + return false; + } + + return true; + } + + /** + * 修改 + * @param request CategoryRequest + * @param id Integer + * @return bool + */ + @Override + public boolean update(CategoryRequest request, Integer id) { + try{ + //修改分类信息 + Category category = new Category(); + BeanUtils.copyProperties(request, category); + category.setId(id); + category.setPath(getPathByPId(category.getPid())); + + category.setUpdateTime(DateUtil.date()); + updateById(category); + + //如状态为关闭,那么所以子集的状态都关闭 + if(!request.getStatus()){ + updateStatusByPid(id, false); + }else{ + //如是开启,则父类的状态为开启 + updatePidStatusById(id); + } + + return true; + }catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 开启父级状态 + * @param id Integer + + */ + private void updatePidStatusById(Integer id) { + Category category = getById(id); + List categoryIdList = YztUtil.stringToArrayByRegex(category.getPath(), "/"); + categoryIdList.removeIf(i -> i.equals(0)); + ArrayList categoryArrayList = new ArrayList<>(); + if(categoryIdList.size() < 1){ + return; + } + for (Integer categoryId: categoryIdList) { + Category categoryVo = new Category(); + categoryVo.setId(categoryId); + categoryVo.setStatus(true); + categoryVo.setUpdateTime(DateUtil.date()); + categoryArrayList.add(categoryVo); + } + updateBatchById(categoryArrayList); + } + + /** + * 获取分类下子类的数量 + * @param pid Integer + + * @return bool + */ + private int getChildCountByPid(Integer pid) { + //查看是否有子类 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.like("path", "/"+pid+"/"); + return mapper.selectCount(objectQueryWrapper).intValue(); + } + + /** + * 修改分类以及子类的状态 + * @param pid Integer + + * @return bool + */ + private int updateStatusByPid(Integer pid, boolean status) { + //查看是否有子类 + Category category = new Category(); + category.setStatus(status); + + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.like("path", "/"+pid+"/"); + return mapper.update(category, objectQueryWrapper); + } + + private String getPathByPId(Integer pid) { + Category category = getById(pid); + if(null != category){ + return category.getPath() + pid + "/"; + } + return "/0/"; + } + + /** + * 带结构的无线级分类 + */ + @Override + public List getListTree(Integer type, Integer status, String name) { + return getTree(type, status,name,null); + } + + /** + * 带权限的属性结构 + */ + @Override + public List getListTree(Integer type, Integer status, List categoryIdList) { + System.out.println("菜单列表:getListTree: type:" + type + "| status:" + status + "| categoryIdList:" + JSON.toJSONString(categoryIdList)); + return getTree(type, status,null,categoryIdList); + } + + /** + * 带结构的无线级分类 + + */ + private List getTree(Integer type, Integer status,String name, List categoryIdList) { + //循环数据,把数据对象变成带list结构的vo + List treeList = new ArrayList<>(); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(Category::getType, type); + + if(null != categoryIdList && categoryIdList.size() > 0){ + lambdaQueryWrapper.in(Category::getId, categoryIdList); + } + + if(status >= 0){ + lambdaQueryWrapper.eq(Category::getStatus, status); + } + if(StringUtils.isNotEmpty(name)){ // 根据名称模糊搜索 + lambdaQueryWrapper.like(Category::getName,name); + } + + lambdaQueryWrapper.orderByDesc(Category::getSort); + lambdaQueryWrapper.orderByAsc(Category::getId); + List allTree = mapper.selectList(lambdaQueryWrapper); + if(allTree == null){ + return null; + } + // 根据名称搜索特殊处理 这里仅仅处理两层搜索后有子父级关系的数据 + if(StringUtils.isNotEmpty(name) && allTree.size() >0){ + List searchCategory = new ArrayList<>(); + List categoryIds = allTree.stream().map(Category::getId).collect(Collectors.toList()); + + List pidList = allTree.stream().filter(c -> c.getPid() > 0 && !categoryIds.contains(c.getPid())) + .map(Category::getPid).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(pidList)) { + pidList.forEach(pid -> { + searchCategory.add(mapper.selectById(pid)); + }); + } + allTree.addAll(searchCategory); + } + + for (Category category: allTree) { + CategoryTreeVo categoryTreeVo = new CategoryTreeVo(); + BeanUtils.copyProperties(category, categoryTreeVo); + treeList.add(categoryTreeVo); + } + + + //返回 + Map map = new HashMap<>(); + //ID 为 key 存储到map 中 + for (CategoryTreeVo categoryTreeVo1 : treeList) { + map.put(categoryTreeVo1.getId(), categoryTreeVo1); + } + + List list = new ArrayList<>(); + for (CategoryTreeVo tree : treeList) { + //子集ID返回对象,有则添加。 + CategoryTreeVo tree1 = map.get(tree.getPid()); + if(tree1 != null){ + tree1.getChild().add(tree); + }else { + list.add(tree); + } + } + System.out.println("无限极分类 : getTree:" + JSON.toJSONString(list)); + return list; + } + + /** + * 删除分类表 + * @param id Integer + + * @return bool + */ + @Override + public int delete(Integer id) { + //查看是否有子类, 物理删除 + if(getChildCountByPid(id) > 0){ + throw new YztException("当前分类下有子类,请先删除子类!"); + } + + return mapper.deleteById(id); + } + + /** + * 获取分类下子类 + * @param pid Integer + + * @return List + */ + @Override + public List getChildVoListByPid(Integer pid) { + //查看是否有子类 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("status", CategoryConstants.CATEGORY_STATUS_NORMAL); + objectQueryWrapper.like("path", "/"+pid+"/"); + return mapper.selectList(objectQueryWrapper); + } + + /** + * 获取分类下子类时判断当前分类有效 + */ + @Override + public List getChildVoStatusOnListByPid(Integer pid) { + Category category = mapper.selectById(pid); + if(ObjectUtil.isNull(category) || !category.getStatus()) return new ArrayList<>(); + //查看是否有子类 + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); + objectQueryWrapper.eq("status", CategoryConstants.CATEGORY_STATUS_NORMAL); + objectQueryWrapper.eq("pid", pid); + objectQueryWrapper.like("path", "/"+pid+"/"); + return mapper.selectList(objectQueryWrapper); + } + + /** + * 检测分类名称是否存在 + * @param name String 分类名 + * @param type int 类型 + * @param path String 路径 + + * @return int + */ + private int checkName(String name, Integer type,String path) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(Category::getName, name); + if (ObjectUtil.isNotNull(type)) { + lambdaQueryWrapper.eq(Category::getType, type); + lambdaQueryWrapper.eq(Category::getPath, path); + } + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 检测url是否存在 + * @param uri String url + + * @return int + */ + @Override + public boolean checkUrl(String uri) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(Category::getUrl, uri); + return mapper.selectCount(lambdaQueryWrapper).intValue() > 0; + } + + @Override + public boolean updateStatus(Integer id) { + Category category = getById(id); + category.setStatus(!category.getStatus()); + category.setUpdateTime(DateUtil.date()); + return updateById(category); + } + + /** + * 新增分类 + * @param categoryRequest + */ + @Override + public Boolean create(CategoryRequest categoryRequest) { + //检测标题是否存在 + if(checkName(categoryRequest.getName(), categoryRequest.getType(),getPathByPId(categoryRequest.getPid())) > 0){ + throw new YztException("此分类已存在"); + } + Category category = new Category(); + BeanUtils.copyProperties(categoryRequest, category); + category.setPath(getPathByPId(category.getPid())); + category.setExtra(systemAttachmentService.clearPrefix(category.getExtra())); + return save(category); + } + + /** + * 获取文章分类列表 + * @return List + */ + @Override + public List findArticleCategoryList() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(Category::getId, Category::getName); + lambdaQueryWrapper.eq(Category::getType, Constants.CATEGORY_TYPE_ARTICLE); + lambdaQueryWrapper.eq(Category::getStatus, true); + lambdaQueryWrapper.orderByDesc(Category::getSort); + lambdaQueryWrapper.orderByAsc(Category::getId); + return mapper.selectList(lambdaQueryWrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/CosServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/CosServiceImpl.java new file mode 100644 index 0000000..435844d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/CosServiceImpl.java @@ -0,0 +1,98 @@ +package com.yzt.service.service.impl; + +import com.qcloud.cos.COSClient; +import com.qcloud.cos.exception.CosClientException; +import com.qcloud.cos.model.CannedAccessControlList; +import com.qcloud.cos.model.CreateBucketRequest; +import com.qcloud.cos.model.PutObjectRequest; +import com.qcloud.cos.model.PutObjectResult; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.CloudVo; +import com.yzt.service.service.CosService; +import com.yzt.service.service.SystemAttachmentService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.io.File; + + +/** + * CosServiceImpl 同步到云服务 + * + */ +@Service +public class CosServiceImpl implements CosService { + + private static final Logger logger = LoggerFactory.getLogger(CosServiceImpl.class); + + @Lazy + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Override + public void uploadFile(CloudVo cloudVo, String webPth, String localFile, Integer id, COSClient cosClient) { + + logger.info("上传文件{}开始:{}", id, localFile); + try { + File file = new File(localFile); + if(!file.exists()){ + logger.info("上传文件"+ id + localFile + "不存在:"); + return; + } + + if(!cosClient.doesBucketExist(cloudVo.getBucketName())){ + CreateBucketRequest createBucketRequest = new CreateBucketRequest(cloudVo.getBucketName()); + // 设置 bucket 的权限为 Private(私有读写), 其他可选有公有读私有写, 公有读写 + createBucketRequest.setCannedAcl(CannedAccessControlList.Private); + + try{ + cosClient.createBucket(createBucketRequest); + } catch (CosClientException serverException) { + serverException.printStackTrace(); + } + } + + PutObjectRequest putObjectRequest = new PutObjectRequest(cloudVo.getBucketName(), webPth, file); + PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); + + logger.info("上传文件{} -- 结束:{}", id, putObjectResult.getETag()); + } catch (Exception e) { + logger.error("上传文件{}失败:", id, e); + throw new YztException("腾讯云OSS上传失败," + e.getMessage()); + } + } + + @Override + public void uploadFile(CloudVo cloudVo, String webPth, String localFile, File file, COSClient cosClient) { + logger.info("上传文件开始:{}", localFile); + try { + if(!file.exists()){ + logger.info("上传文件" + localFile + "不存在:"); + return; + } + + if(!cosClient.doesBucketExist(cloudVo.getBucketName())){ + CreateBucketRequest createBucketRequest = new CreateBucketRequest(cloudVo.getBucketName()); + // 设置 bucket 的权限为 Private(私有读写), 其他可选有公有读私有写, 公有读写 + createBucketRequest.setCannedAcl(CannedAccessControlList.PublicReadWrite); + + try{ + cosClient.createBucket(createBucketRequest); + } catch (CosClientException serverException) { + serverException.printStackTrace(); + } + } + + PutObjectRequest putObjectRequest = new PutObjectRequest(cloudVo.getBucketName(), webPth, file); + PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest); + + logger.info("上传文件 -- 结束:{}", putObjectResult.getETag()); + } catch (Exception e) { + throw new YztException(e.getMessage()); + } + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ExcelServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExcelServiceImpl.java new file mode 100644 index 0000000..452f434 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExcelServiceImpl.java @@ -0,0 +1,330 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.github.pagehelper.PageInfo; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.StoreBargainResponse; +import com.yzt.common.response.StoreCombinationResponse; +import com.yzt.common.response.StoreOrderDetailResponse; +import com.yzt.common.response.StoreProductResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.ExportUtil; +import com.yzt.common.vo.*; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** +* ExcelServiceImpl 接口实现 +* fw_ +*/ +@Service +public class ExcelServiceImpl implements ExcelService { + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private YztConfig yztConfig; + + + @Autowired + StoreOrderInfoService storeOrderInfoService; + + /** + * 导出砍价商品 + * @param request 请求参数 + * @return 导出地址 + */ + @Override + public String exportBargainProduct(StoreBargainSearchRequest request) { + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setPage(Constants.DEFAULT_PAGE); + pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT); + PageInfo page = storeBargainService.getList(request, pageParamRequest); + if (CollUtil.isEmpty(page.getList())) throw new YztException("没有可导出的数据!"); + List list = page.getList(); + List voList = list.stream().map(temp -> { + BargainProductExcelVo vo = new BargainProductExcelVo(); + BeanUtils.copyProperties(temp, vo); + vo.setPrice("¥".concat(temp.getPrice().toString())); + vo.setStatus(temp.getStatus() ? "开启" : "关闭"); + vo.setStartTime(temp.getStartTime()); + vo.setStopTime(temp.getStopTime()); + vo.setAddTime(temp.getAddTime()); + return vo; + }).collect(Collectors.toList()); + + // 上传设置 + ExportUtil.setUpload(yztConfig.getImagePath(), Constants.UPLOAD_MODEL_PATH_EXCEL, UploadConstants.DOWNLOAD_FILE_KEYWORD); + + // 文件名 + String fileName = "砍价".concat(YztDateUtil.nowDateTime(Constants.DATE_TIME_FORMAT_NUM)).concat(YztUtil.randomCount(111111111, 999999999).toString()).concat(".xlsx"); + + //自定义标题别名 + LinkedHashMap aliasMap = new LinkedHashMap<>(); + aliasMap.put("title", "砍价活动名称"); +// aliasMap.put("info", "砍价活动简介"); + aliasMap.put("price", "砍价金额"); + aliasMap.put("bargainNum", "用户每次砍价的次数"); + aliasMap.put("status", "砍价状态"); + aliasMap.put("startTime", "砍价开启时间"); + aliasMap.put("stopTime", "砍价结束时间"); + aliasMap.put("sales", "销量"); + aliasMap.put("quotaShow", "库存"); + aliasMap.put("giveIntegral", "返多少积分"); + aliasMap.put("addTime", "添加时间"); + + return ExportUtil.exportExecl(fileName, "砍价商品导出", voList, aliasMap); + } + + /** + * 导出拼团商品 + * @param request 请求参数 + * @return 导出地址 + */ + @Override + public String exportCombinationProduct(StoreCombinationSearchRequest request) { + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setPage(Constants.DEFAULT_PAGE); + pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT); + PageInfo page = storeCombinationService.getList(request, pageParamRequest); + if (CollUtil.isEmpty(page.getList())) throw new YztException("没有可导出的数据!"); + List list = page.getList(); + List voList = list.stream().map(temp -> { + CombinationProductExcelVo vo = new CombinationProductExcelVo(); + BeanUtils.copyProperties(temp, vo); + vo.setIsShow(temp.getIsShow() ? "开启" : "关闭"); + vo.setStopTime(YztDateUtil.timestamp2DateStr(temp.getStopTime(), Constants.DATE_FORMAT_DATE)); + return vo; + }).collect(Collectors.toList()); + + // 上传设置 + ExportUtil.setUpload(yztConfig.getImagePath(), Constants.UPLOAD_MODEL_PATH_EXCEL, UploadConstants.DOWNLOAD_FILE_KEYWORD); + + // 文件名 + String fileName = "拼团".concat(YztDateUtil.nowDateTime(Constants.DATE_TIME_FORMAT_NUM)).concat(YztUtil.randomCount(111111111, 999999999).toString()).concat(".xlsx"); + + //自定义标题别名 + LinkedHashMap aliasMap = new LinkedHashMap<>(); + aliasMap.put("id", "编号"); + aliasMap.put("title", "拼团名称"); + aliasMap.put("otPrice", "原价"); + aliasMap.put("price", "拼团价"); + aliasMap.put("quotaShow", "库存"); + aliasMap.put("countPeople", "拼团人数"); + aliasMap.put("countPeopleAll", "参与人数"); + aliasMap.put("countPeoplePink", "成团数量"); + aliasMap.put("sales", "销量"); + aliasMap.put("isShow", "商品状态"); + aliasMap.put("stopTime", "拼团结束时间"); + + return ExportUtil.exportExecl(fileName, "拼团商品导出", voList, aliasMap); + } + + /** + * 商品导出 + * @param request 请求参数 + * @return 导出地址 + */ + @Override + public String exportProduct(StoreProductSearchRequest request) { + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setPage(Constants.DEFAULT_PAGE); + pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT); + PageInfo storeProductResponsePageInfo = storeProductService.getAdminList(request, pageParamRequest); + List list = storeProductResponsePageInfo.getList(); + if(list.size() < 1){ + throw new YztException("没有可导出的数据!"); + } + + //产品分类id + List cateIdListStr = list.stream().map(StoreProductResponse::getCateId).distinct().collect(Collectors.toList()); + + HashMap categoryNameList = new HashMap(); + if(cateIdListStr.size() > 0){ + String join = StringUtils.join(cateIdListStr, ","); + List cateIdList = YztUtil.stringToArray(join); + categoryNameList = categoryService.getListInId(cateIdList); + } + List voList = CollUtil.newArrayList(); + for (StoreProductResponse product : list ) { + ProductExcelVo vo = new ProductExcelVo(); + vo.setStoreName(product.getStoreName()); +// vo.setStoreInfo(product.getStoreInfo()); + vo.setCateName(YztUtil.getValueByIndex(categoryNameList, product.getCateId())); + vo.setPrice("¥" + product.getPrice()); + vo.setStock(product.getStock().toString()); + vo.setSales(product.getSales().toString()); + vo.setBrowse(product.getBrowse().toString()); + voList.add(vo); + } + + /** + * =============================== + * 以下为存储部分 + * =============================== + */ + // 上传设置 + ExportUtil.setUpload(yztConfig.getImagePath(), Constants.UPLOAD_MODEL_PATH_EXCEL, UploadConstants.DOWNLOAD_FILE_KEYWORD); + + // 文件名 + String fileName = "商品导出_".concat(YztDateUtil.nowDateTime(Constants.DATE_TIME_FORMAT_NUM)).concat(YztUtil.randomCount(111111111, 999999999).toString()).concat(".xlsx"); + + //自定义标题别名 + LinkedHashMap aliasMap = new LinkedHashMap<>(); + aliasMap.put("storeName", "商品名称"); +// aliasMap.put("storeInfo", "商品简介"); + aliasMap.put("cateName", "商品分类"); + aliasMap.put("price", "价格"); + aliasMap.put("stock", "库存"); + aliasMap.put("sales", "销量"); + aliasMap.put("browse", "浏览量"); + + return ExportUtil.exportExecl(fileName, "商品导出", voList, aliasMap); + } + + /** + * 订单导出 + * + * @param request 查询条件 + * @return 文件名称 + */ + @Override + public String exportOrder(StoreOrderSearchRequest request) { + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setPage(Constants.DEFAULT_PAGE); + pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT); + CommonPage adminList = storeOrderService.getAdminList(request, pageParamRequest); + List list = adminList.getList(); + if(list.size() < 1){ + throw new YztException("没有可导出的数据!"); + } + + List voList = CollUtil.newArrayList(); + for (StoreOrderDetailResponse order: list ) { + OrderExcelVo vo = new OrderExcelVo(); + vo.setCreateTime(YztDateUtil.dateToStr(order.getCreateTime(), "yyyy-MM-dd HH:mm:ss")); + vo.setOrderId(order.getOrderId()); + vo.setOrderType(order.getOrderType()); + vo.setPayPrice(order.getPayPrice().toString()); + vo.setPayTypeStr(order.getPayTypeStr()); + vo.setProductName(order.getProductList().stream().map(item-> item.getInfo().getProductName()).collect(Collectors.joining(","))); + vo.setRealName(order.getRealName()); + vo.setStatusStr(order.getStatusStr().get("value")); + voList.add(vo); + } + + /* + =============================== + 以下为存储部分 + =============================== + */ + // 上传设置 + ExportUtil.setUpload(yztConfig.getImagePath(), Constants.UPLOAD_MODEL_PATH_EXCEL, UploadConstants.DOWNLOAD_FILE_KEYWORD); + + // 文件名 + String fileName = "订单导出_".concat(YztDateUtil.nowDateTime(Constants.DATE_TIME_FORMAT_NUM)).concat(YztUtil.randomCount(111111111, 999999999).toString()).concat(".xlsx"); + + //自定义标题别名 + LinkedHashMap aliasMap = new LinkedHashMap<>(); + aliasMap.put("orderId", "订单号"); + aliasMap.put("payPrice", "实际支付金额"); +// aliasMap.put("payType", "支付方式"); + aliasMap.put("createTime", "创建时间"); +// aliasMap.put("status", "订单状态"); + aliasMap.put("productName", "商品信息"); + aliasMap.put("statusStr", "订单状态"); + aliasMap.put("payTypeStr", "支付方式"); +// aliasMap.put("isDel", "是否删除"); +// aliasMap.put("refundReasonWapImg", "退款图片"); +// aliasMap.put("refundReasonWapExplain", "退款用户说明"); +// aliasMap.put("refundReasonTime", "退款时间"); +// aliasMap.put("refundReasonWap", "前台退款原因"); +// aliasMap.put("refundReason", "不退款的理由"); +// aliasMap.put("refundPrice", "退款金额"); +// aliasMap.put("refundStatus", "退款状态状态,0 未退款 1 申请中 2 已退款"); +// aliasMap.put("verifyCode", "核销码"); + aliasMap.put("orderType", "订单类型"); +// aliasMap.put("remark", "订单管理员备注"); + aliasMap.put("realName", "用户姓名"); +// aliasMap.put("paid", "支付状态"); +// aliasMap.put("type", "订单类型:0-普通订单,1-视频号订单"); +// aliasMap.put("isAlterPrice", "是否改价,0-否,1-是"); + + return ExportUtil.exportExecl(fileName, "订单导出", voList, aliasMap); + + } + + @Override + public String exportCustomer(Integer id) { + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setPage(Constants.DEFAULT_PAGE); + pageParamRequest.setLimit(Constants.EXPORT_MAX_LIMIT); + PageInfo enrollmentList = storeOrderInfoService.getEnrollmentListByActivity(id, pageParamRequest); + List list = enrollmentList.getList(); + if(list.size() < 1){ + throw new YztException("没有可导出的数据!"); + } + + List voList = CollUtil.newArrayList(); + for (VirtualRemarkVo virtualRemarkVo: list ) { + CustomerExcelVo vo = new CustomerExcelVo(); + vo.setId(virtualRemarkVo.getId()); + vo.setPhone(virtualRemarkVo.getPhone()); + vo.setType(virtualRemarkVo.getType()); + vo.setRealName(virtualRemarkVo.getRealName()); +// vo.setSku() + voList.add(vo); + } + /* + =============================== + 以下为存储部分 + =============================== + */ + // 上传设置 + ExportUtil.setUpload(yztConfig.getImagePath(), Constants.UPLOAD_MODEL_PATH_EXCEL, UploadConstants.DOWNLOAD_FILE_KEYWORD); + + // 文件名 + String fileName = "客户导出_".concat(YztDateUtil.nowDateTime(Constants.DATE_TIME_FORMAT_NUM)).concat(YztUtil.randomCount(111111111, 999999999).toString()).concat(".xlsx"); + //自定义标题别名 + LinkedHashMap aliasMap = new LinkedHashMap<>(); + aliasMap.put("id","ID"); + aliasMap.put("realName","客户名称"); + aliasMap.put("type","客户类型"); + aliasMap.put("phone","手机号码"); + aliasMap.put("sku","购买规格"); + + + return ExportUtil.exportExecl(fileName, "客户导出", voList, aliasMap); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ExceptionLogServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExceptionLogServiceImpl.java new file mode 100644 index 0000000..ceb60b1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExceptionLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.exception.ExceptionLog; +import com.yzt.service.mapper.ExceptionLogMapper; +import com.yzt.service.service.ExceptionLogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * ExceptionLogServiceImpl 接口实现 + * + */ +@Service +public class ExceptionLogServiceImpl extends ServiceImpl implements ExceptionLogService { + + @Resource + private ExceptionLogMapper mapper; + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ExpressServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExpressServiceImpl.java new file mode 100644 index 0000000..51fffe9 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ExpressServiceImpl.java @@ -0,0 +1,259 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.OnePassConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.express.Express; +import com.yzt.common.request.ExpressSearchRequest; +import com.yzt.common.request.ExpressUpdateRequest; +import com.yzt.common.request.ExpressUpdateShowRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.mapper.ExpressMapper; +import com.yzt.service.service.ExpressService; +import com.yzt.service.util.OnePassUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * ExpressServiceImpl 接口实现 + * fw_ +*/ +@Service +public class ExpressServiceImpl extends ServiceImpl implements ExpressService { + + @Resource + private ExpressMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private OnePassUtil onePassUtil; + + /** + * 分页显示快递公司表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @Override + public List getList(ExpressSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.like(Express::getCode, request.getKeywords()).or().like(Express::getName, request.getKeywords()); + } + // 排序:sort字段倒序,正常id正序,方便展示常用物流公司 + lambdaQueryWrapper.orderByDesc(Express::getSort); + lambdaQueryWrapper.orderByAsc(Express::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 编辑 + */ + @Override + public Boolean updateExpress(ExpressUpdateRequest expressRequest) { + Express temp = getById(expressRequest.getId()); + if (ObjectUtil.isNull(temp)) throw new YztException("快递公司不存在!"); + + if (StrUtil.isBlank(expressRequest.getAccount()) && temp.getPartnerId().equals(true)) { + throw new YztException("请输入月结账号"); + } + if (StrUtil.isBlank(expressRequest.getPassword()) && temp.getPartnerKey().equals(true)) { + throw new YztException("请输入月结密码"); + } + if (StrUtil.isBlank(expressRequest.getNetName()) && temp.getNet().equals(true)) { + throw new YztException("请输入取件网点"); + } + Express express = new Express(); + BeanUtils.copyProperties(expressRequest, express); + + return updateById(express); + } + + /** + * 修改显示状态 + */ + @Override + public Boolean updateExpressShow(ExpressUpdateShowRequest expressRequest) { + Express temp = getById(expressRequest.getId()); + if (ObjectUtil.isNull(temp)) throw new YztException("编辑的记录不存在!"); + if (temp.getIsShow().equals(expressRequest.getIsShow())) { + return Boolean.TRUE; + } + Express express = new Express(); + BeanUtils.copyProperties(expressRequest, express); + return updateById(express); + } + + /** + * 同步物流公司 + */ + @Override + public Boolean syncExpress() { + if (redisUtil.exists(OnePassConstants.ONE_PASS_EXPRESS_CACHE_KEY)) { + return Boolean.TRUE; + } + getExpressList(); + + redisUtil.set(OnePassConstants.ONE_PASS_EXPRESS_CACHE_KEY, 1, 3600L, TimeUnit.SECONDS); + return Boolean.TRUE; + } + + /** + * 查询全部物流公司 + * @param type 类型:normal-普通,elec-电子面单 + */ + @Override + public List findAll(String type) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(Express::getIsShow, true); + if (type.equals("elec")) { + lqw.eq(Express::getStatus, true); + } + lqw.orderByDesc(Express::getSort); + lqw.orderByAsc(Express::getId); + return mapper.selectList(lqw); + } + + /** + * 查询物流公司面单模板 + * @param com 快递公司编号 + */ + @Override + public JSONObject template(String com) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + return onePassUtil.getData(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_TEMP_URI + +"?com="+com+"&is_shipment=1", header); + } + + @Override + public JSONObject templateFor(String com, String type, String is_shipment, String page, String limit) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + return onePassUtil.getData(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_DUMP_RECORD_URI +"?com="+com+"&type="+type+"&is_shipment="+is_shipment+"&page="+page+"&limit="+limit, header); + } + + /** + * 查询快递公司 + * @param code 快递公司编号 + */ + @Override + public Express getByCode(String code) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(Express::getCode, code); + return mapper.selectOne(lqw); + } + + /** + * 通过物流公司名称获取 + * @param name 物流公司名称 + */ + @Override + public Express getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(Express::getName, name); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 获取快递公司详情 + * @param id 快递公司id + */ + @Override + public Express getInfo(Integer id) { + Express express = getById(id); + if (ObjectUtil.isNull(express)) { + throw new YztException("快递公司不存在"); + } + return express; + } + + /** + * 从平台获取物流公司 + * 并存入数据库 + */ + private void getExpressList() { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + MultiValueMap param = new LinkedMultiValueMap<>(); + // param.add("type", 1);// 快递类型:1,国内运输商;2,国际运输商;3,国际邮政 不传获取全部 + param.add("page", 0); + param.add("limit", 9999); + + JSONObject post = onePassUtil.getFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_URI, param, header); + System.out.println("OnePass Express ALL post = " + post); + JSONObject jsonObject = post.getJSONObject("data"); + JSONArray jsonArray = jsonObject.getJSONArray("data"); + if (CollUtil.isEmpty(jsonArray)) return; + + List expressList = CollUtil.newArrayList(); + List codeList = getAllCode(); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject object = jsonArray.getJSONObject(i); + if (StrUtil.isNotBlank(object.getString("code")) && !codeList.contains(object.getString("code"))) { + Express express = new Express(); + express.setName(Optional.ofNullable(object.getString("name")).orElse("")); + express.setCode(Optional.ofNullable(object.getString("code")).orElse("")); + express.setPartnerId(false); + express.setPartnerKey(false); + express.setNet(false); + if (ObjectUtil.isNotNull(object.getInteger("partner_id"))) { + express.setPartnerId(object.getInteger("partner_id") == 1); + } + if (ObjectUtil.isNotNull(object.getInteger("partner_key"))) { + express.setPartnerKey(object.getInteger("partner_key") == 1); + } + if (ObjectUtil.isNotNull(object.getInteger("net"))) { + express.setNet(object.getInteger("net") == 1); + } + express.setIsShow(true); + express.setStatus(false); + if (!express.getPartnerId() && !express.getPartnerKey() && !express.getNet()) { + express.setStatus(true); + } + expressList.add(express); + } + } + + + if (CollUtil.isNotEmpty(expressList)) { + boolean saveBatch = saveBatch(expressList); + if (!saveBatch) throw new YztException("同步物流公司失败"); + } + } + + /** + * 获取所有物流公司code + */ + private List getAllCode() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(Express::getCode); + List expressList = mapper.selectList(lqw); + if (CollUtil.isEmpty(expressList)) { + return CollUtil.newArrayList(); + } + return expressList.stream().map(Express::getCode).collect(Collectors.toList()); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/HomeServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/HomeServiceImpl.java new file mode 100644 index 0000000..7e40890 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/HomeServiceImpl.java @@ -0,0 +1,347 @@ +package com.yzt.service.service.impl; + +import com.yzt.common.constants.Constants; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.response.HomeOperatingDataResponse; +import com.yzt.common.response.HomeRateResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; + +/** + * 用户表 服务实现类 + * + */ +@Service +public class HomeServiceImpl implements HomeService { + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private UserService userService; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserBrokerageRecordService brokerageRecordService; + + @Autowired + private UserExtractService userExtractService; + + /** + * 用户曲线图 + * + */ + @Override + public Map chartUser() { + return dataFormat(userService.getAddUserCountGroupDate(Constants.SEARCH_DATE_LATELY_30), Constants.SEARCH_DATE_LATELY_30); + } + + /** + * 订单量趋势 + * + */ + @Override + public Map chartOrder() { + Map map = new HashMap<>(); + + List list = storeOrderService.getOrderGroupByDate(Constants.SEARCH_DATE_LATELY_30, Constants.NUM_TEN); + + map.put("quality", + dataFormat(getOrderCountGroupByDate(list), Constants.SEARCH_DATE_LATELY_30) + ); + map.put("price", + dataFormat(getOrderPriceGroupByDate(list), Constants.SEARCH_DATE_LATELY_30) + ); + return map; + } + + /** + * 按开始结束时间查询每日新增订单数量 + * @param list List 时间范围 + * + * @return HashMap + */ + private Map getOrderCountGroupByDate(List list) { + Map map = new HashMap<>(); + + if (list.size() < 1) { + return map; + } + + for (StoreOrder storeOrder : list) { + map.put(storeOrder.getOrderId(), storeOrder.getId()); + } + + return map; + } + + /** + * 按开始结束时间查询每日新增订单销售额 + * @param list List 时间范围 + * + * @return HashMap + */ + private Map getOrderPriceGroupByDate(List list) { + Map map = new HashMap<>(); + + if (list.size() < 1) { + return map; + } + + for (StoreOrder storeOrder : list) { + map.put(storeOrder.getOrderId(), storeOrder.getPayPrice()); + } + + return map; + } + + /** + * 日期和数量格式化 + * + * @return Map + */ + private Map dataFormat(Map countGroupDate, String dateLimit) { + Map map = new LinkedHashMap<>(); + List listDate = YztDateUtil.getListDate(dateLimit); + + String[] weekList = new String[]{"周一", "周二", "周三", "周四", "周五", "周六", "周日"}; + + int i = 0; + for (String date : listDate) { + Object count = 0; + if (countGroupDate.containsKey(date)) { + count = countGroupDate.get(date); + } + String key; + + //周格式化 + switch(dateLimit) { + //格式化周 + case Constants.SEARCH_DATE_WEEK: + case Constants.SEARCH_DATE_PRE_WEEK: + key = weekList[i]; + break; + //格式化月 + case Constants.SEARCH_DATE_PRE_MONTH: + case Constants.SEARCH_DATE_MONTH: + key = i + 1 + ""; + break; + //默认显示两位日期 + default: + key = date.substring(5, 10); + } + map.put(key, count); + i++; + } + return map; + } + + /** + * 日期和数量格式化 + * + * @return Map + */ + private Map dataFormatYear(Map countGroupDate, String dateLimit) { + Map map = new LinkedHashMap<>(); + List listDate = new ArrayList<>(); + String year = ""; + if (dateLimit.equals(Constants.SEARCH_DATE_YEAR)) { + year = YztDateUtil.nowYear(); + } + + if (dateLimit.equals(Constants.SEARCH_DATE_PRE_YEAR)) { + year = YztDateUtil.lastYear(); + } + + //处理年 + //12个月份数据 + for (int i = 1; i <= 12; i++) { + String month = i + ""; + if (i < 10) { + month = "0" + i; + } + listDate.add(year + "-" + month); + } + + String[] monthList = new String[]{"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月" , "十一月", "十二月" }; + + int i = 0; + for (Object date : listDate) { + Object count = 0; + if (countGroupDate.containsKey(date)) { + count = countGroupDate.get(date); + } + map.put(monthList[i], count); + i++; + } + return map; + } + + /** + * 用户购买统计 + * + */ + @Override + public Map chartUserBuy() { + Map map = new HashMap<>(); + //未消费用户 + map.put("zero", userService.getCountByPayCount(Constants.NUM_ZERO, Constants.NUM_ZERO)); + + //消费一次用户 + map.put("one", userService.getCountByPayCount(Constants.NUM_ONE, Constants.NUM_ONE)); + + //留存客户 + map.put("history", userService.getCountByPayCount(Constants.NUM_TWO, Constants.NUM_THREE)); + + //回流客户 + map.put("back", userService.getCountByPayCount(Constants.NUM_ONE, Constants.EXPORT_MAX_LIMIT)); + + return map; + } + + /** + * 周订单量趋势 + * + * @return Map + */ + @Override + public Map chartOrderInWeek() { + return returnOrderDate(Constants.SEARCH_DATE_WEEK, Constants.SEARCH_DATE_PRE_WEEK, Constants.NUM_TEN); + + + } + + /** + * 月订单量趋势 + * + * @return Map + */ + @Override + public Map chartOrderInMonth() { + return returnOrderDate(Constants.SEARCH_DATE_MONTH, Constants.SEARCH_DATE_PRE_MONTH, Constants.NUM_TEN); + } + + /** + * 年订单量趋势 + * + * @return Map + */ + @Override + public Map chartOrderInYear() { + Map map = new HashMap<>(); + + //查询本年订单量 + List list = storeOrderService.getOrderGroupByDate(Constants.SEARCH_DATE_YEAR, Constants.NUM_SEVEN); + + map.put("quality", + dataFormatYear(getOrderCountGroupByDate(list), Constants.SEARCH_DATE_YEAR) + ); + map.put("price", + dataFormatYear(getOrderPriceGroupByDate(list), Constants.SEARCH_DATE_YEAR) + ); + + //查询上年订单量 + List preList = storeOrderService.getOrderGroupByDate(Constants.SEARCH_DATE_PRE_YEAR, Constants.NUM_SEVEN); + + map.put("preQuality", + dataFormatYear(getOrderCountGroupByDate(preList), Constants.SEARCH_DATE_PRE_YEAR) + ); + map.put("prePrice", + dataFormatYear(getOrderPriceGroupByDate(preList), Constants.SEARCH_DATE_PRE_YEAR) + ); + + return map; + } + + /** + * 首页数据 + * 今日/昨日 + * 销售额 + * 用户访问量 + * 订单量 + * 新增用户 + * @return HomeRateResponse + */ + @Override + public HomeRateResponse indexDate() { + String today = cn.hutool.core.date.DateUtil.date().toString("yyyy-MM-dd"); + String yesterday = cn.hutool.core.date.DateUtil.yesterday().toString("yyyy-MM-dd"); + HomeRateResponse response = new HomeRateResponse(); + response.setSales(storeOrderService.getPayOrderAmountByDate(today)); + response.setYesterdaySales(storeOrderService.getPayOrderAmountByDate(yesterday)); + response.setPageviews(userVisitRecordService.getPageviewsByDate(today)); + response.setYesterdayPageviews(userVisitRecordService.getPageviewsByDate(yesterday)); + response.setOrderNum(storeOrderService.getOrderNumByDate(today)); + response.setYesterdayOrderNum(storeOrderService.getOrderNumByDate(yesterday)); + response.setNewUserNum(userService.getRegisterNumByDate(today)); + response.setYesterdayNewUserNum(userService.getRegisterNumByDate(yesterday)); + return response; + } + + /** + * 经营数据: + * 1.待发货订单,2.退款中订单,3.待核销订单,4.库存预警 + * 5.上架商品数,6.库存中商品数,7.提现待审核,8.账户充值 + * @return HomeOperatingDataResponse + */ + @Override + public HomeOperatingDataResponse operatingData() { + HomeOperatingDataResponse response = new HomeOperatingDataResponse(); + response.setNotShippingOrderNum(storeOrderService.getNotShippingNum()); + response.setRefundingOrderNum(storeOrderService.getRefundingNum()); + response.setNotWriteOffOrderNum(storeOrderService.getNotWriteOffNum()); + response.setVigilanceInventoryNum(storeProductService.getVigilanceInventoryNum()); + response.setOnSaleProductNum(storeProductService.getOnSaleNum()); + response.setNotSaleProductNum(storeProductService.getNotSaleNum()); + response.setNotAuditNum(userExtractService.getNotAuditNum()); + BigDecimal totalRechargeAmount = userRechargeService.getTotalPrice(); + BigDecimal BrokerageToYueAmount = brokerageRecordService.getTotalYuePrice(); + response.setTotalRechargeAmount(totalRechargeAmount.add(BrokerageToYueAmount)); + return response; + } + + /** + * 组装订单统计返回数据 + * + * @return Map + */ + private Map returnOrderDate(String dateLimit, String preDateLimit, int leftTime) { + Map map = new HashMap<>(); + + //查询本周周订单量 + List list = storeOrderService.getOrderGroupByDate(dateLimit, leftTime); + + map.put("quality", + dataFormat(getOrderCountGroupByDate(list), dateLimit) + ); + map.put("price", + dataFormat(getOrderPriceGroupByDate(list), dateLimit) + ); + + //查询上周周订单量 + List preList = storeOrderService.getOrderGroupByDate(preDateLimit, leftTime); + + map.put("preQuality", + dataFormat(getOrderCountGroupByDate(preList), preDateLimit) + ); + map.put("prePrice", + dataFormat(getOrderPriceGroupByDate(preList), preDateLimit) + ); + + return map; + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/JdCloudServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/JdCloudServiceImpl.java new file mode 100644 index 0000000..1b57a03 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/JdCloudServiceImpl.java @@ -0,0 +1,133 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.amazonaws.AmazonServiceException; +import com.amazonaws.ClientConfiguration; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSCredentialsProvider; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.PutObjectResult; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.exception.YztException; +import com.yzt.service.service.JdCloudService; +import com.yzt.service.service.SystemConfigService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.net.URL; + +/** + * JdCloudServiceImpl 接口实现 + * + */ +@Slf4j +@Service +public class JdCloudServiceImpl implements JdCloudService { + + @Autowired + private SystemConfigService systemConfigService; + + /** + * 文件上传 + * @param fileName 文件名称 + * @param localFilePath 本地文件地址 + * @param bucket 存储桶名称 + */ + @Override + public void uploadFile(String fileName, String localFilePath, String bucket) { + File file = new File(localFilePath); + if(!file.exists()){ + log.error("京东云存储上传文件,不存在,fileName = {}, localFilePath = {}", fileName, localFilePath); + return; + } + AmazonS3 s3 = getAmazonS3Client(); + try { + if (!s3.doesBucketExistV2(bucket)) { + s3.createBucket(bucket); + } + + PutObjectResult putObjectResult = s3.putObject(bucket, fileName, file); + log.info("京东云存储上传文件结束:{}", putObjectResult.getETag()); + } catch (Exception e) { + log.error("upload JD OSS file error : ", e); + throw new YztException(e.getMessage()); + } finally { + s3.shutdown(); + } + + } + + /** + * 创建新的存储空间 + */ + @Override + public void createBucket(String bucketName) { + if (StrUtil.isBlank(bucketName)) { + return; + } + AmazonS3 s3 = getAmazonS3Client(); + + try { + s3.createBucket(bucketName); + log.info("create JD OSS bucket {} ", bucketName); + } catch (AmazonServiceException e) { + log.error("create JD OSS bucket err : ", e); + throw new YztException("京东云存储创建存储空间失败:" + e.getMessage()); + } finally { + s3.shutdown(); + } + } + + /** + * 获取文件URL + * eg: https://yzt-ceshi.s3.cn-north-1.jdcloud-oss.com/w5.webp + * @param bucket 存储桶名称 + * @param fileName 文件名称 + */ + @Override + public String getUrl(String bucket, String fileName) { + AmazonS3 s3 = getAmazonS3Client(); + String urlPath = ""; + try { + URL url = s3.getUrl(bucket, "w5.webp"); + urlPath = url.toString(); + } catch (Exception e) { + log.error("get JD OSS file url err : ", e); + throw new YztException("京东云获取文件地址失败:" + e.getMessage()); + } finally { + s3.shutdown(); + } + return urlPath; + } + + private AmazonS3 getAmazonS3Client() { + String endpoint = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_CLOUD_ENDPOINT); + String accessKey = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_ACCESS_KEY); + String secretKey = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_SECRET_KEY); + String signingRegion = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_CLOUD_SIGNING_REGION); + + ClientConfiguration config = new ClientConfiguration(); + + AwsClientBuilder.EndpointConfiguration endpointConfig = + new AwsClientBuilder.EndpointConfiguration(endpoint, signingRegion); + + AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey,secretKey); + AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials); + + AmazonS3 s3 = AmazonS3Client.builder() + .withEndpointConfiguration(endpointConfig) + .withClientConfiguration(config) + .withCredentials(awsCredentialsProvider) + .disableChunkedEncoding() + .build(); + + return s3; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/LogisticsServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/LogisticsServiceImpl.java new file mode 100644 index 0000000..cb94472 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/LogisticsServiceImpl.java @@ -0,0 +1,162 @@ +package com.yzt.service.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.vo.LogisticsResultListVo; +import com.yzt.common.vo.LogisticsResultVo; +import com.yzt.common.vo.OnePassLogisticsQueryVo; +import com.yzt.service.service.LogisticService; +import com.yzt.service.service.OnePassService; +import com.yzt.service.service.SystemConfigService; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.TimeUnit; + + +/** +* ExpressServiceImpl 接口实现 +* fw_ +*/ +@Data +@Service +public class LogisticsServiceImpl implements LogisticService { + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private RestTemplateUtil restTemplateUtil; + + @Autowired + private RedisUtil redisUtil; + + @Lazy + @Autowired + private OnePassService onePassService; + + private String redisKey = Constants.LOGISTICS_KEY; + private Long redisCacheSeconds = 1800L; + + private String expressNo; + + + /** 快递 + * @param expressNo String 物流单号 + * @param type String 快递公司字母简写:不知道可不填 95%能自动识别,填写查询速度会更快 https://market.aliyun.com/products/56928004/cmapi021863.html#sku=yuncode15863000015 + * @param com 快递公司编号 + * @return Express + */ + @Override + public LogisticsResultVo info(String expressNo, String type, String com, String phone) { + LogisticsResultVo resultVo = new LogisticsResultVo(); + setExpressNo(expressNo); + JSONObject result = getCache(); + if (ObjectUtil.isNotNull(result)) { + return JSONObject.toJavaObject(result, LogisticsResultVo.class); + } + String logisticsType = systemConfigService.getValueByKeyException("logistics_type"); + if (logisticsType.equals("1")) {// 平台查询 + OnePassLogisticsQueryVo queryVo = onePassService.exprQuery(expressNo, com); + if (ObjectUtil.isNull(queryVo)) { + return resultVo; + } + // 一号通vo转公共返回vo + resultVo = queryToResultVo(queryVo); + String jsonString = JSONObject.toJSONString(resultVo); + saveCache(JSONObject.parseObject(jsonString)); + } + if (logisticsType.equals("2")) {// 阿里云查询 + String appCode = systemConfigService.getValueByKey(Constants.CONFIG_KEY_LOGISTICS_APP_CODE); + + // 顺丰请输入单号 : 收件人或寄件人手机号后四位。例如:123456789:1234 + if (StrUtil.isNotBlank(com) && com.equals("shunfengkuaiyun")) { + expressNo = expressNo.concat(":").concat(StrUtil.sub(phone, 7, -1)); + } + String url = Constants.LOGISTICS_API_URL + "?no=" + expressNo; + if(StringUtils.isNotBlank(type)){ + url += "&type=" + type; + } + + HashMap header = new HashMap<>(); + header.put("Authorization", "APPCODE " + appCode); + + JSONObject data = restTemplateUtil.getData(url, header); + checkResult(data); + //把数据解析成对象返回到前端 + result = data.getJSONObject("result"); + saveCache(result); + resultVo = JSONObject.toJavaObject(result, LogisticsResultVo.class); + } + return resultVo; + } + + /** + * 一号通vo转公共返回vo + */ + private LogisticsResultVo queryToResultVo(OnePassLogisticsQueryVo queryVo) { + LogisticsResultVo resultVo = new LogisticsResultVo(); + resultVo.setNumber(queryVo.getNum()); + resultVo.setExpName(queryVo.getCom()); + resultVo.setIsSign(queryVo.getIscheck()); + resultVo.setDeliveryStatus(queryVo.getStatus()); + + if (CollUtil.isNotEmpty(queryVo.getContent())) { + List list = CollUtil.newArrayList(); + queryVo.getContent().forEach(i -> { + LogisticsResultListVo listVo = new LogisticsResultListVo(); + listVo.setTime(i.getTime()); + listVo.setStatus(i.getStatus()); + list.add(listVo); + }); + resultVo.setList(list); + } + return resultVo; + } + + /** 获取快递缓存 + * + * @since 2020-07-06 + * @return JSONObject + */ + private JSONObject getCache() { + Object data = redisUtil.get(getRedisKey() + getExpressNo()); + if(null != data){ + return JSONObject.parseObject(data.toString()); + } + return null; + } + + /** 获取快递缓存 + * @param data JSONObject 需要保存的数据 + * + * @since 2020-07-06 + */ + private void saveCache(JSONObject data) { + redisUtil.set(getRedisKey() + getExpressNo(), data.toJSONString(), getRedisCacheSeconds(), TimeUnit.SECONDS); + } + + /** 获取快递缓存 + * @param data JSONObject 检测返回的结果 + * + * @since 2020-07-06 + */ + private void checkResult(JSONObject data) { + if (!data.getString("status").equals("0")){ + throw new YztException(data.getString("msg")); + } + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/OnePassServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/OnePassServiceImpl.java new file mode 100644 index 0000000..6455ace --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/OnePassServiceImpl.java @@ -0,0 +1,499 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.OnePassConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.express.Express; +import com.yzt.common.request.*; +import com.yzt.common.request.onepass.OnePassLoginRequest; +import com.yzt.common.request.onepass.OnePassShipmentCancelOrderRequest; +import com.yzt.common.request.onepass.OnePassShipmentCreateOrderRequest; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.ValidateFormUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.OnePassLoginVo; +import com.yzt.common.vo.OnePassLogisticsQueryVo; +import com.yzt.service.service.ExpressService; +import com.yzt.service.service.OnePassService; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.util.OnePassUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * OnePassService 接口实现 + * 一号通 + * + */ +@Service +public class OnePassServiceImpl implements OnePassService { + + private final Logger logger = LoggerFactory.getLogger(OnePassServiceImpl.class); + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private OnePassUtil onePassUtil; + + @Autowired + private ExpressService expressService; + + @Autowired + private StoreOrderService storeOrderService; + + /** + * 保存一号通应用信息 + * + * @param request 一号通服务中申请的应用信息 + * @return 保存结果 + */ + @Override + public Boolean saveOnePassApplicationInfo(OnePassLoginRequest request) { + setConfigSmsInfo(request.getAccessKey(), request.getSecretKey()); + return Boolean.TRUE; + } + + /** + * 获取一号通应用信息 + * + * @return 一号通应用信息 + */ + @Override + public OnePassLoginRequest getOnePassApplicationInfo() { + return getConfigSmsInfo(); + } + + /** + * 商家寄件 + * + * @param request 寄件请求对象 + * @return 寄件返回数据 + */ + @Override + public JSONObject shipmentCreateOrder(OnePassShipmentCreateOrderRequest request) { + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + String accessToken = onePassUtil.getToken(loginVo); + HashMap header = onePassUtil.getCommonHeader(accessToken); + setOnePassShipmentCallbackURL(request); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("kuaidicom", request.getKuaidicom()); + param.add("man_name", request.getManName()); + param.add("phone",request.getPhone()); + param.add("address",request.getAddress()); + param.add("send_real_name",request.getSendRealName()); + param.add("send_phone",request.getSendPhone()); + param.add("send_address",request.getSendAddress()); + param.add("call_back_url",request.getCallBackUrl()); + param.add("cargo",request.getCargo()); + param.add("service_type",request.getServiceType()); + param.add("payment",request.getPayment()); + param.add("weight",request.getWeight()); + param.add("remark",request.getRemark()); + param.add("day_type",request.getDayType()); + param.add("pickup_start_time",request.getPickupStartTime()); + param.add("pickup_end_time",request.getPickupEndTime()); + param.add("channel_sw",request.getChannelSw()); + param.add("valins_pay",request.getValinsPay()); + param.add("real_name",request.getRealName()); + param.add("send_id_card_type",request.getSendIdCardType()); + param.add("send_id_card",request.getSendIdCard()); + param.add("password_signing",request.getPasswordSigning()); + param.add("op",request.getOp()); + param.add("return_type",request.getReturnType()); + param.add("siid",request.getSiid()); + param.add("tempid",request.getTempid()); + logger.info("一号通-商家寄件:参数:{}", param); + JSONObject jsonObject = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SHIPMENT_CREATE_ORDER_URI, param, header); + logger.info("一号通-商家寄件:结果:{}", jsonObject); + return jsonObject.getJSONObject("data"); + } + + /** + * 取消商家寄件 + * + * @param request 取消商家寄件请求对象 + * @return 取消寄件返回对象 + */ + @Override + public JSONObject shipmentCancelOrder(OnePassShipmentCancelOrderRequest request) { + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + String accessToken = onePassUtil.getToken(loginVo); + HashMap header = onePassUtil.getCommonHeader(accessToken); + + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("task_id", request.getTaskId()); + param.add("order_id", request.getOrderId()); + param.add("cancel_msg",request.getCancelMsg()); + JSONObject jsonObject = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SHIPMENT_CANCEL_ORDER_URI, param, header); + logger.info("一号通-商家取消寄件 :{}", jsonObject); + return jsonObject.getJSONObject("data"); + } + + /** + * 获取商家寄件所需的快递公司列表 + * + * @return 商家寄件功能对应的快递公司列表 + */ + @Override + public JSONObject shipmentComs() { + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + String accessToken = onePassUtil.getToken(loginVo); + HashMap header = onePassUtil.getCommonHeader(accessToken); + JSONObject jsonObject = onePassUtil.getData(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SHIPMENT_GET_KUAIDI_COMS_URI, header); + logger.info("一号通-商家寄件-物流地址 :{}", jsonObject); + return jsonObject; + } + + /** + * 商家寄件功能对应的回调 + * order_success 下单成功回调 + * order_take 取件回调 + * order_cancel 用户主动取消回调 + * order_fail 下单失败回调 + * order_receipt 快递签收回调 + * @return 回调数据 + */ + @Override + public Boolean shipmentCallBackMethod(String type, String data) { + logger.info("一号通-商家寄件-回调:type:{}", type); + logger.info("一号通-商家寄件-回调:data:{}", data); + JSONObject jsonObject = new JSONObject(); + try { + jsonObject = JSON.parseObject(com.yzt.common.utils.OnePassUtil.decrypt(data)); + } catch (Exception e) { + e.printStackTrace(); + logger.error("一号通商家寄件 解密数据失败:{}", e.getMessage()); + } + switch (type){ + case "order_success": + break; + case "order_take": // 取件回调 + storeOrderService.expressForOnePassShipmentTakeCallBack(jsonObject); + break; + case "order_cancel": + case "order_fail": // 下单失败回调 清理掉所有商家寄件的数据 + storeOrderService.expressForOnePassShipmentCancelCallBack(jsonObject); + break; + case "order_receipt": // todo 一号通新增接口,后期可以规划和订单签收结果合并 + break; + + } + + return Boolean.TRUE; + } + + /** + * 用户登录 + */ + @Override + public Boolean login(OnePassLoginRequest request) { + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add(OnePassConstants.ONE_PASS_ACCESS_KEY, request.getAccessKey()); + param.add(OnePassConstants.ONE_PASS_SECRET_KEY, request.getSecretKey()); + JSONObject jsonObject = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.USER_LOGIN_URI, param, null); + + String accessToken = OnePassConstants.ONE_PASS_USER_TOKEN_PREFIX.concat(jsonObject.getJSONObject("data").getString("access_token")); + Long expiresIn = jsonObject.getJSONObject("data").getLong("expires_in"); + expiresIn = expiresIn - YztDateUtil.getTime(); + redisUtil.set(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, request.getAccessKey()), accessToken, expiresIn, TimeUnit.SECONDS); + return true; + } + + /** + * 一号通用户信息 + */ + @Override + public JSONObject info() { + JSONObject info = getInfo(); + // 判断是否开通电子面单 + JSONObject dump = info.getJSONObject("dump"); + Integer open = dump.getInteger("open"); +// if (open.equals(1)) { +// String exportSiid = systemConfigService.getValueByKey("config_export_siid");// 打印机编号 +// if (StrUtil.isBlank(exportSiid)) { +// dump.put("open", 0); +// info.put("dump", dump); +// } +// } + return info; + } + + private JSONObject getInfo() { + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + String accessToken = onePassUtil.getToken(loginVo); + HashMap header = onePassUtil.getCommonHeader(accessToken); + JSONObject jsonObject = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.USER_INFO_URI, null, header); + JSONObject data = jsonObject.getJSONObject("data"); + data.put("account", loginVo.getAccessKey()); + return data; + } + + + /** + * 服务开通 + * + * @param request 服务开通参数 + */ + @Override + public Boolean serviceOpen(ServiceOpenRequest request) { + if (!validateMealType(request.getType())) throw new YztException("请选择正确的服务类型"); + Boolean open = false; + switch (request.getType()) { + case OnePassConstants.ONE_PASS_MEAL_TYPE_SMS:// 短信开通 + if (StrUtil.isBlank(request.getSign())) throw new YztException("签名不能为空"); + open = smsOpen(request); + break; + case OnePassConstants.ONE_PASS_MEAL_TYPE_EXPR:// 物流开通 + open = expressOpen(request); + break; + case OnePassConstants.ONE_PASS_MEAL_TYPE_DUMP:// 电子面单开通 + expressOpenValidate(request); + open = expressOpen(request); + break; + case OnePassConstants.ONE_PASS_MEAL_TYPE_COPY:// 产品复制开通 + open = copyOpen(); + break; + } + return open; + } + + + @Override + public JSONObject copyGoods(String url) { + HashMap header = onePassUtil.getCommonHeader(onePassUtil.getToken()); + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("url", url); + JSONObject jsonObject = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_COPY_GOODS_URI, params, header); + System.out.println("one pass copy product = " + jsonObject); + return jsonObject.getJSONObject("data"); + } + + /** + * 电子面单 + * @param record 电子面单参数 + * @return + */ + @Override + public MyRecord expressDump(MyRecord record) { + HashMap header = onePassUtil.getCommonHeader(onePassUtil.getToken()); + MultiValueMap params = new LinkedMultiValueMap<>(); + Map columns = record.getColumns(); + columns.forEach(params::add); + JSONObject post = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_DUMP_URI, params, header); + MyRecord myRecord = new MyRecord(); + JSONObject jsonObject = post.getJSONObject("data"); + return myRecord.setColums(jsonObject); + } + + /** + * 物流追踪 + * @param expressNo 快递单号 + * @param com 快递公司简写 + * @return OnePassLogisticsQueryVo + */ + @Override + public OnePassLogisticsQueryVo exprQuery(String expressNo, String com) { + HashMap header = onePassUtil.getCommonHeader(onePassUtil.getToken()); + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("com", com); + params.add("num", expressNo); + JSONObject post = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_EXPRESS_QUEARY_URI, params, header); + String dataStr = post.getString("data"); + if (StrUtil.isBlank(dataStr) || dataStr.equals("[]")) { + return null; + } + JSONObject jsonObject = post.getJSONObject("data"); + return JSONObject.toJavaObject(jsonObject, OnePassLogisticsQueryVo.class); + } + + + /** + * 校验一号通账号是否配置 + */ + @Override + public Boolean checkAccount() { + String account = systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_ACCESS_KEY);// 获取配置账号 + if (StrUtil.isBlank(account)) { + return Boolean.FALSE; + } + String token = systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_SECRET_KEY); //获取配置密码 + if (StrUtil.isBlank(token)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + + + + + + + + + ///////////////////////////////////////////////////// 工具方法 + + /** + * 物流、电子面单开通参数校验 + */ + private void expressOpenValidate(ServiceOpenRequest request) { + if (StrUtil.isBlank(request.getCom())) { + throw new YztException("请选择快递公司"); + } + if (StrUtil.isBlank(request.getTempId())) { + throw new YztException("请选择快递模板"); + } + if (StrUtil.isBlank(request.getToName())) { + throw new YztException("请填写寄件人姓名"); + } + if (StrUtil.isBlank(request.getToTel())) { + throw new YztException("请输入寄件人手机号码"); + } + if (StrUtil.isBlank(request.getToAddress())) { + throw new YztException("请填写寄件人详细地址"); + } + if (StrUtil.isBlank(request.getSiid())) { + throw new YztException("请填写云打印机编号"); + } + ValidateFormUtil.isPhoneException(request.getToTel()); + } + + /** + * 商品复制开通 + */ + private Boolean copyOpen() { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_COPY_OPEN_URI, null, header); + return Boolean.TRUE; + } + + /** + * 物流开通 + * 保存平台电子面单打印信息 + */ + private Boolean expressOpen(ServiceOpenRequest request) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + if (request.getType().equals(OnePassConstants.ONE_PASS_MEAL_TYPE_EXPR)) {// 物流 + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_EXPRESS_OPEN_URI, null, header); + return Boolean.TRUE; + } + + // 电子面单 + Express express = expressService.getByCode(request.getCom()); + if (ObjectUtil.isNull(express)) throw new YztException("没有找到对应的快递公司"); + + // 保存平台电子面单打印信息 + Boolean execute = transactionTemplate.execute(e -> { + // 快递公司id + systemConfigService.updateOrSaveValueByName("config_export_id", express.getId().toString()); + // 快递公司模板id + systemConfigService.updateOrSaveValueByName("config_export_temp_id", request.getTempId()); + // 快递公司编码 + systemConfigService.updateOrSaveValueByName("config_export_com", request.getCom()); + // 发货人姓名 + systemConfigService.updateOrSaveValueByName("config_export_to_name", request.getToName()); + // 发货人电话 + systemConfigService.updateOrSaveValueByName("config_export_to_tel", request.getToTel()); + // 发货人详细地址 + systemConfigService.updateOrSaveValueByName("config_export_to_address", request.getToAddress()); + // 电子面单打印机编号 + systemConfigService.updateOrSaveValueByName("config_export_siid", request.getSiid()); + return Boolean.TRUE; + }); + if (Boolean.FALSE.equals(execute)) throw new YztException("保存平台电子面单打印信息失败"); + + // 查询是否已经开通 + JSONObject info = info(); + JSONObject dump = info.getJSONObject("dump"); + if (dump.getInteger("open").equals(1)) { + return Boolean.TRUE; + } + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_EXPRESS_OPEN_URI, null, header); + return Boolean.TRUE; + } + + /** + * 短信开通 + */ + private Boolean smsOpen(ServiceOpenRequest request) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + MultiValueMap params = new LinkedMultiValueMap<>(); + params.add("sign", request.getSign()); + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_SMS_OPEN_URI, params, header); + return Boolean.TRUE; + } + + /** + * 校验套餐类型 + */ + private Boolean validateMealType(String type) { + List list = CollUtil.newArrayList(); + list.add(OnePassConstants.ONE_PASS_MEAL_TYPE_SMS); + list.add(OnePassConstants.ONE_PASS_MEAL_TYPE_EXPR); + list.add(OnePassConstants.ONE_PASS_MEAL_TYPE_DUMP); + list.add(OnePassConstants.ONE_PASS_MEAL_TYPE_COPY); + return list.contains(type); + } + + /** + * 配置一号通应用 appid 和 密钥信息 + * + * @param accessKey 账号 + * @param secretKey 密码 + */ + private void setConfigSmsInfo(String accessKey, String secretKey) { + boolean accountResult = systemConfigService.updateOrSaveValueByName(OnePassConstants.ONE_PASS_ACCESS_KEY, accessKey); + boolean tokenResult = systemConfigService.updateOrSaveValueByName(OnePassConstants.ONE_PASS_SECRET_KEY, secretKey); + + if (!accountResult || !tokenResult) { + throw new YztException("数据更新失败!"); + } + } + + + /** + * 获取一号通 应用配置信息 + * @return 应用配置 + */ + private OnePassLoginRequest getConfigSmsInfo() { + OnePassLoginRequest onePassLoginRequest = new OnePassLoginRequest(); + onePassLoginRequest.setAccessKey(systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_ACCESS_KEY)); + onePassLoginRequest.setSecretKey(systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_SECRET_KEY)); + return onePassLoginRequest; + } + + /** + * 一号通 商家发货 获取预置好的回调地址 + */ + private void setOnePassShipmentCallbackURL(OnePassShipmentCreateOrderRequest request){ + request.setCallBackUrl(systemConfigService.getValueByKey(Constants.CONFIG_KEY_API_URL) + OnePassConstants.ONE_PASS_API_SHIPMENT_CALLBACK_URI); + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderPayServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderPayServiceImpl.java new file mode 100644 index 0000000..deba2a0 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderPayServiceImpl.java @@ -0,0 +1,1199 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.product.StoreProductCoupon; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.user.*; +import com.yzt.common.request.OrderPayRequest; +import com.yzt.common.response.OrderPayResultResponse; +import com.yzt.common.response.PayConfigResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.WxPayUtil; +import com.yzt.common.vo.*; +import com.yzt.service.delete.OrderUtils; +import com.yzt.service.service.*; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yzt.common.model.product.StoreProductAttr; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; +import java.util.*; + + +/** + * OrderPayService 实现类 + * + */ +@Data +@Service +public class OrderPayServiceImpl implements OrderPayService { + private static final Logger logger = LoggerFactory.getLogger(OrderPayServiceImpl.class); + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Lazy + @Autowired + private WeChatPayService weChatPayService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private UserBillService userBillService; + + @Lazy + @Autowired + private SmsService smsService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductCouponService storeProductCouponService; + + @Autowired + private StoreCouponUserService storeCouponUserService; + + @Autowired + private OrderUtils orderUtils; + + //订单类 + private StoreOrder order; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private com.yzt.service.service.StoreProductAttrService storeProductAttrService; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private com.yzt.service.service.impl.OrderServiceImpl orderServiceImpl; + + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private WechatNewService wechatNewService; + + @Autowired + private UserExperienceRecordService userExperienceRecordService; + + @Autowired + private YlyPrintService ylyPrintService; + + @Autowired + private SystemNotificationService systemNotificationService; + + @Autowired + private SmsTemplateService smsTemplateService; + + @Autowired + private UserLevelUpgradeAuditService userLevelUpgradeAuditService; + + /** + * 获取支付配置 + */ + @Override + public PayConfigResponse getPayConfig() { + String payWxOpen = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN); + String yuePayStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS); + PayConfigResponse response = new PayConfigResponse(); + response.setYuePayStatus(Constants.CONFIG_FORM_SWITCH_OPEN.equals(yuePayStatus)); + response.setPayWechatOpen(Constants.CONFIG_FORM_SWITCH_OPEN.equals(payWxOpen)); + if (Constants.CONFIG_FORM_SWITCH_OPEN.equals(yuePayStatus)) { + User user = userService.getInfo(); + response.setUserBalance(user.getNowMoney()); + } + return response; + } + + /** + * 支付成功处理 + * @param storeOrder 订单 + */ + @Override + public Boolean paySuccess(StoreOrder storeOrder) { + User user = userService.getById(storeOrder.getUid()); + + List billList = CollUtil.newArrayList(); + List integralList = CollUtil.newArrayList(); + + // 订单支付记录 + UserBill userBill = userBillInit(storeOrder, user); + billList.add(userBill); + + // 积分抵扣记录 + if (storeOrder.getUseIntegral() > 0) { + UserIntegralRecord integralRecordSub = integralRecordSubInit(storeOrder, user); + integralList.add(integralRecordSub); + } + + // 经验处理:1.经验添加,2.等级计算 + Integer experience; + experience = storeOrder.getPayPrice().setScale(0, BigDecimal.ROUND_DOWN).intValue(); + user.setExperience(user.getExperience() + experience); + // 经验添加记录 + UserExperienceRecord experienceRecord = experienceRecordInit(storeOrder, user.getExperience(), experience); + + + // 积分处理:1.下单赠送积分,2.商品赠送积分 + // 已注释:下单不再自动添加积分。 + /* + int integral; + // 下单赠送积分 + //赠送积分比例 + String integralStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE); + if (StrUtil.isNotBlank(integralStr) && storeOrder.getPayPrice().compareTo(BigDecimal.ZERO) > 0) { + BigDecimal integralBig = new BigDecimal(integralStr); + integral = integralBig.multiply(storeOrder.getPayPrice()).setScale(0, BigDecimal.ROUND_DOWN).intValue(); + if (integral > 0) { + // 生成积分记录 + UserIntegralRecord integralRecord = integralRecordInit(storeOrder, user.getIntegral(), java.math.BigDecimal.valueOf(integral), "order"); + integralList.add(integralRecord); + } + } + + // 商品赠送积分 + // 查询订单详情 + // 获取商品额外赠送积分 + List orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + if (orderInfoList.get(0).getProductType().equals(0)) { + int sumIntegral = 0; + for (StoreOrderInfo orderInfo : orderInfoList) { + StoreProduct product = storeProductService.getById(orderInfo.getProductId()); + sumIntegral += product.getGiveIntegral() * orderInfo.getPayNum(); + } + if (sumIntegral > 0) { + // 生成积分记录 + UserIntegralRecord integralRecord = integralRecordInit(storeOrder, user.getIntegral(), java.math.BigDecimal.valueOf(sumIntegral), "product"); + integralList.add(integralRecord); + } + } + */ + + // 更新用户下单数量 + user.setPayCount(user.getPayCount() + 1); + + /** + * 计算佣金,生成佣金记录 + */ + List recordList = assignCommission(storeOrder); + + // 分销员逻辑 + if (!user.getIsPromoter()) { + String funcStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_BROKERAGE_FUNC_STATUS); + if (funcStatus.equals("1")) { + String broQuota = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_BROKERAGE_QUOTA); + if (!broQuota.equals("-1") && storeOrder.getPayPrice().compareTo(new BigDecimal(broQuota)) >= 0) {// -1 不成为分销员 + user.setIsPromoter(true); + user.setPromoterTime(DateUtil.date()); + } + } + } + + Boolean execute = transactionTemplate.execute(e -> { + //订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_PAY_SUCCESS, Constants.ORDER_LOG_MESSAGE_PAY_SUCCESS); + + // 用户信息变更 + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + + //资金变动 + userBillService.saveBatch(billList); + + // 积分记录 + userIntegralRecordService.saveBatch(integralList); + + // 经验记录 + userExperienceRecordService.save(experienceRecord); + + //经验升级(已禁用:改为仅根据购买商品类型升级) + // userLevelService.upLevel(user); + + // 根据购买商品类型处理等级升级/审核 + handleLevelUpgradeByProduct(storeOrder, user); + + // 佣金记录 + if (CollUtil.isNotEmpty(recordList)) { + recordList.forEach(temp -> { + temp.setLinkId(storeOrder.getOrderId()); + }); + userBrokerageRecordService.saveBatch(recordList); + } + + // 如果是拼团订单进行拼团后置处理 + if (storeOrder.getCombinationId() > 0) { + pinkProcessing(storeOrder); + } + return Boolean.TRUE; + }); + + if (execute) { + try { + SystemNotification payNotification = systemNotificationService.getByMark(NotifyConstants.PAY_SUCCESS_MARK); + // 发送短信 + if (StrUtil.isNotBlank(user.getPhone()) && payNotification.getIsSms().equals(1)) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(payNotification.getSmsId()); + smsService.sendPaySuccess(user.getPhone(), storeOrder.getOrderId(), storeOrder.getPayPrice(), Integer.valueOf(smsTemplate.getTempId())); + } + + // 发送用户支付成功管理员提醒短信 + SystemNotification payAdminNotification = systemNotificationService.getByMark(NotifyConstants.PAY_SUCCESS_ADMIN_MARK); + if (payAdminNotification.getIsSms().equals(1)) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(payAdminNotification.getSmsId()); + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderPaySuccessNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName(), Integer.valueOf(smsTemplate.getTempId())); + }); + } + } + + if (payNotification.getIsWechat().equals(1) || payNotification.getIsRoutine().equals(1)) { + //下发模板通知 + pushMessageOrder(storeOrder, user, payNotification); + } + + // 购买成功后根据配置送优惠券 + autoSendCoupons(storeOrder); + + // 根据配置 打印小票 + ylyPrintService.YlyPrint(storeOrder.getOrderId(),true); + + } catch (Exception e) { + e.printStackTrace(); + logger.error("短信、模板通知、优惠券或打印小票异常"); + } + // 注意:支付成功后的排队与奖励逻辑已统一由 handlePostPay 方法处理(见下方第648行调用) + // 此处原有的 processQueueLogic 和 settleProductReward 调用已被移除,避免重复执行导致生成双倍排队记录 + + // 【CRITICAL】定时任务触发的 paySuccess 不应该再调用 handlePostPay! + logger.warn("===== paySuccess COMPLETED for orderNo={}, NO handlePostPay should be called here =====", storeOrder.getOrderId()); + } + return execute; + } + + // 支持成功拼团后置处理 + private Boolean pinkProcessing(StoreOrder storeOrder) { + // 判断拼团是否成功 + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (storePink.getKId() <= 0) { + return true; + } + + List pinkList = storePinkService.getListByCidAndKid(storePink.getCid(), storePink.getKId()); + StorePink tempPink = storePinkService.getById(storePink.getKId()); + pinkList.add(tempPink); + if (pinkList.size() < storePink.getPeople()) {// 还未拼团成功 + return true; + } + // 1.修改拼团状态 + // 2.给所有拼团人员发送拼团成功通知 + pinkList.forEach(e -> { + e.setStatus(2); + }); + boolean update = storePinkService.updateBatchById(pinkList); + if (!update) { + logger.error("拼团订单支付成功后更新拼团状态失败,orderNo = " + storeOrder.getOrderId()); + return false; + } + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.GROUP_SUCCESS_MARK); + if (notification.getIsWechat().equals(1) || notification.getIsRoutine().equals(1)) { + pinkList.forEach(i -> { + StoreOrder order = storeOrderService.getByOderId(i.getOrderId()); + StoreCombination storeCombination = storeCombinationService.getById(i.getCid()); + User tempUser = userService.getById(i.getUid()); + // 发送微信模板消息 + MyRecord record = new MyRecord(); + record.set("orderNo", order.getOrderId()); + record.set("proName", storeCombination.getTitle()); + record.set("payType", order.getPayType()); + record.set("isChannel", order.getIsChannel()); + pushMessagePink(record, tempUser, notification); + }); + } + return true; + } + + /** + * 发送拼团成功通知 + * @param record 信息参数 + * @param user 用户 + */ + private void pushMessagePink(MyRecord record, User user, SystemNotification notification) { + if (!record.getStr("payType").equals(Constants.PAY_TYPE_WE_CHAT)) { + return ; + } + if (record.getInt("isChannel").equals(2)) { + return ; + } + + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (record.getInt("isChannel").equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); + temMap.put("keyword1", record.getStr("orderNo")); + temMap.put("keyword2", record.getStr("proName")); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); + templateMessageService.pushTemplateMessage(notification.getWechatId(), temMap, userToken.getToken()); + } else if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 +// temMap.put("character_string1", record.getStr("orderNo")); +// temMap.put("thing2", record.getStr("proName")); +// temMap.put("thing5", "恭喜您拼团成功!我们将尽快为您发货。"); + temMap.put("character_string10", record.getStr("orderNo")); + temMap.put("thing7", record.getStr("proName")); + temMap.put("thing9", "恭喜您拼团成功!我们将尽快为您发货。"); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), temMap, userToken.getToken()); + } + + } + + /** + * 分配佣金 + * @param storeOrder 订单 + * @return List + */ + private List assignCommission(StoreOrder storeOrder) { + // 禁用:不再生成订单类型的佣金记录 + return CollUtil.newArrayList(); + + // 检测商城是否开启分销功能 +// String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_IS_OPEN); +// if(StrUtil.isBlank(isOpen) || isOpen.equals("0")){ +// return CollUtil.newArrayList(); +// } +// // 营销产品不参与 +// if(storeOrder.getCombinationId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getBargainId() > 0){ +// return CollUtil.newArrayList(); +// } +// // 查找订单所属人信息 +// User user = userService.getById(storeOrder.getUid()); +// // 当前用户不存在 没有上级 或者 当用用户上级时自己 直接返回 +// if(null == user.getSpreadUid() || user.getSpreadUid() < 1 || user.getSpreadUid().equals(storeOrder.getUid())){ +// return CollUtil.newArrayList(); +// } +// // 获取参与分佣的人(两级) +// List spreadRecordList = getSpreadRecordList(user.getSpreadUid()); +// if (CollUtil.isEmpty(spreadRecordList)) { +// return CollUtil.newArrayList(); +// } +// // 获取佣金冻结期 +// String fronzenTime = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_EXTRACT_TIME); +// +// // 生成佣金记录 +// List brokerageRecordList = spreadRecordList.stream().map(record -> { +// BigDecimal brokerage = calculateCommission(record, storeOrder.getId()); +// UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); +// brokerageRecord.setUid(record.getInt("spreadUid")); +// brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); +// brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); +// brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_ORDER); +// brokerageRecord.setPrice(brokerage); +// brokerageRecord.setMark(StrUtil.format("获得推广佣金,分佣{}", brokerage)); +// brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE); +// brokerageRecord.setFrozenTime(Integer.valueOf(Optional.ofNullable(fronzenTime).orElse("0"))); +// brokerageRecord.setCreateTime(YztDateUtil.nowDateTime()); +// brokerageRecord.setBrokerageLevel(record.getInt("index")); +// return brokerageRecord; +// }).collect(Collectors.toList()); +// +// return brokerageRecordList; + } + + /** + * 计算佣金 + * @param record index-分销级数,spreadUid-分销人 + * @param orderId 订单id + * @return BigDecimal + */ + private BigDecimal calculateCommission(MyRecord record, Integer orderId) { + BigDecimal brokeragePrice = BigDecimal.ZERO; + // 查询订单详情 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(orderId); + if (CollUtil.isEmpty(orderInfoVoList)) { + return brokeragePrice; + } + BigDecimal totalBrokerPrice = BigDecimal.ZERO; + //查询对应等级的分销比例 + Integer index = record.getInt("index"); + String key = ""; + if (index == 1) { + key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_ONE; + } + if (index == 2) { + key = Constants.CONFIG_KEY_STORE_BROKERAGE_RATE_TWO; + } + String rate = systemConfigService.getValueByKey(key); + if(StringUtils.isBlank(rate)){ + rate = "1"; + } + //佣金比例整数存储, 例如80, 所以计算的时候要除以 10*10 + BigDecimal rateBigDecimal = brokeragePrice; + if(StringUtils.isNotBlank(rate)){ + rateBigDecimal = new BigDecimal(rate).divide(BigDecimal.TEN.multiply(BigDecimal.TEN)); + } + + for (StoreOrderInfoOldVo orderInfoVo : orderInfoVoList) { + // 先看商品是否有固定分佣 + StoreProductAttrValue attrValue = storeProductAttrValueService.getById(orderInfoVo.getInfo().getAttrValueId()); + if (orderInfoVo.getInfo().getIsSub()) {// 有固定分佣 + if(index == 1){ + brokeragePrice = Optional.ofNullable(attrValue.getBrokerage()).orElse(BigDecimal.ZERO); + } + if(index == 2){ + brokeragePrice = Optional.ofNullable(attrValue.getBrokerageTwo()).orElse(BigDecimal.ZERO); + } + } else {// 系统分佣 + if(!rateBigDecimal.equals(BigDecimal.ZERO)){ + // 商品没有分销金额, 并且有设置对应等级的分佣比例 + // 舍入模式向零舍入。 + if (ObjectUtil.isNotNull(orderInfoVo.getInfo().getVipPrice())) { + brokeragePrice = orderInfoVo.getInfo().getVipPrice().multiply(rateBigDecimal).setScale(2, BigDecimal.ROUND_DOWN); + } else { + brokeragePrice = orderInfoVo.getInfo().getPrice().multiply(rateBigDecimal).setScale(2, BigDecimal.ROUND_DOWN); + } + } else { + brokeragePrice = BigDecimal.ZERO; + } + } + // 同规格商品可能有多件 + if (brokeragePrice.compareTo(BigDecimal.ZERO) > 0 && orderInfoVo.getInfo().getPayNum() > 1) { + brokeragePrice = brokeragePrice.multiply(new BigDecimal(orderInfoVo.getInfo().getPayNum())); + } + totalBrokerPrice = totalBrokerPrice.add(brokeragePrice); + } + + return totalBrokerPrice; + } + + /** + * 获取参与分佣人员(两级) + * @param spreadUid 一级分佣人Uid + * @return List + */ + private List getSpreadRecordList(Integer spreadUid) { + List recordList = CollUtil.newArrayList(); + + // 第一级 + User spreadUser = userService.getById(spreadUid); + if (ObjectUtil.isNull(spreadUser)) { + return recordList; + } + // 判断分销模式 + String model = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_MODEL); + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord firstRecord = new MyRecord(); + firstRecord.set("index", 1); + firstRecord.set("spreadUid", spreadUid); + recordList.add(firstRecord); + + // 第二级 + User spreadSpreadUser = userService.getById(spreadUser.getSpreadUid()); + if (ObjectUtil.isNull(spreadSpreadUser)) { + return recordList; + } + if (StrUtil.isNotBlank(model) && model.equals("1") && !spreadSpreadUser.getIsPromoter()) { + // 指定分销模式下:不是推广员不参与分销 + return recordList; + } + MyRecord secondRecord = new MyRecord(); + secondRecord.set("index", 2); + secondRecord.set("spreadUid", spreadSpreadUser.getUid()); + recordList.add(secondRecord); + return recordList; + } + + /** + * 余额支付 + * @param storeOrder 订单 + * @return Boolean Boolean + */ + private Boolean yuePay(StoreOrder storeOrder) { + + // 用户余额扣除 + User user = userService.getById(storeOrder.getUid()); + if (ObjectUtil.isNull(user)) throw new YztException("用户不存在"); + if (user.getNowMoney().compareTo(storeOrder.getPayPrice()) < 0) { + throw new YztException("用户余额不足"); + } + if (user.getIntegral().compareTo(java.math.BigDecimal.valueOf(storeOrder.getUseIntegral())) < 0) { + throw new YztException("用户积分不足"); + } + storeOrder.setPaid(true); + storeOrder.setPayTime(YztDateUtil.nowDateTime()); + storeOrder.setUpdateTime(DateUtil.date()); + //活动商品直接完成订单 + if(Objects.equals(2,storeOrder.getType())){ + storeOrder.setStatus(3); + storeOrder.setFinishTime(DateUtil.date()); + } + + Boolean execute = transactionTemplate.execute(e -> { + // 订单修改 + storeOrderService.updateById(storeOrder); + // 这里只扣除金额,账单记录在task中处理 + userService.updateNowMoney(user, storeOrder.getPayPrice(), "sub"); + // ==================== 扣除积分逻辑已启用 ==================== + // 扣除积分 + if (storeOrder.getUseIntegral() > 0) { + userService.updateIntegral(user, java.math.BigDecimal.valueOf(storeOrder.getUseIntegral()), "sub"); + } + + // ==================== 扣除积分逻辑已禁用 ==================== + + // 【重要】余额支付不推送到Redis队列,因为下面会同步调用 handlePostPay 和 paySuccess + // 如果推送到队列,定时任务会再次调用 paySuccess,可能导致重复处理 + // redisUtil.lPush(TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER, storeOrder.getOrderId()); + + // 拼团逻辑已移除:StorePink 记录的创建统一由 handlePostPay->processQueueLogic 处理 + + return Boolean.TRUE; + }); + if (!execute) throw new YztException("余额支付订单失败"); + + // 同步调用支付成功逻辑(账单、积分、经验、佣金等) + if (execute) { + try { + logger.info("===== yuePay calling paySuccess for orderNo={} =====", storeOrder.getOrderId()); + paySuccess(storeOrder); + } catch (Exception e) { + logger.error("yuePay paySuccess failed for orderNo=" + storeOrder.getOrderId(), e); + } + + // 同步调用支付后处理(排队/奖励逻辑) + try { + logger.info("===== yuePay calling handlePostPay for orderNo={} =====", storeOrder.getOrderId()); + orderServiceImpl.handlePostPay(storeOrder); + } catch (Exception e) { + logger.error("yuePay handlePostPay failed for orderNo=" + storeOrder.getOrderId(), e); + } + } + return execute; + } + + /** + * 订单支付 + * @param orderPayRequest 支付参数 + * @param ip ip + * @return OrderPayResultResponse + * 1.微信支付拉起微信预支付,返回前端调用微信支付参数,在之后需要调用微信支付查询接口 + * 2.余额支付,更改对应信息后,加入支付成功处理task + */ + @Override + public OrderPayResultResponse payment(OrderPayRequest orderPayRequest, String ip) { + StoreOrder storeOrder = storeOrderService.getByOderId(orderPayRequest.getOrderNo()); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("订单不存在"); + } + if (storeOrder.getIsDel()) { + throw new YztException("订单已被删除"); + } + if (storeOrder.getPaid()) { + throw new YztException("订单已支付"); + } + User user = userService.getById(storeOrder.getUid()); + if (ObjectUtil.isNull(user)) throw new YztException("用户不存在"); + + // 根据支付类型进行校验,更换支付类型 + storeOrder.setPayType(orderPayRequest.getPayType()); + // 余额支付 + if (orderPayRequest.getPayType().equals(PayConstants.PAY_TYPE_YUE)) { + if (user.getNowMoney().compareTo(storeOrder.getPayPrice()) < 0) { + throw new YztException("用户余额不足"); + } + storeOrder.setPayType(PayConstants.PAY_TYPE_YUE); + storeOrder.setIsChannel(3); + } + if (orderPayRequest.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { + switch (orderPayRequest.getPayChannel()){ + case PayConstants.PAY_CHANNEL_WE_CHAT_H5:// H5 + storeOrder.setIsChannel(2); + break; + case PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC:// 公众号 + storeOrder.setIsChannel(0); + break; + case PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM:// 小程序 + storeOrder.setIsChannel(1); + break; + } + storeOrder.setPayType(PayConstants.PAY_TYPE_WE_CHAT); + } + storeOrder.setUpdateTime(DateUtil.date()); + boolean changePayType = storeOrderService.updateById(storeOrder); + if (!changePayType) { + throw new YztException("变更订单支付类型失败!"); + } + + if (user.getIntegral().compareTo(java.math.BigDecimal.valueOf(storeOrder.getUseIntegral())) < 0) { + throw new YztException("用户积分不足"); + } + + OrderPayResultResponse response = new OrderPayResultResponse(); + response.setOrderNo(storeOrder.getOrderId()); + response.setPayType(storeOrder.getPayType()); + // 0元付 + if (storeOrder.getPayPrice().compareTo(BigDecimal.ZERO) <= 0) { + Boolean aBoolean = yuePay(storeOrder); + response.setPayType(PayConstants.PAY_TYPE_YUE); + response.setStatus(aBoolean); + return response; + } + + // 微信支付,调用微信预下单,返回拉起微信支付需要的信息 + if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { + // 预下单 + Map unifiedorder = unifiedorder(storeOrder, ip); + response.setStatus(true); + + WxPayJsResultVo vo = new WxPayJsResultVo(); + vo.setAppId(unifiedorder.get("appId")); + vo.setNonceStr(unifiedorder.get("nonceStr")); + vo.setPackages(unifiedorder.get("package")); + vo.setSignType(unifiedorder.get("signType")); + vo.setTimeStamp(unifiedorder.get("timeStamp")); + vo.setPaySign(unifiedorder.get("paySign")); + if (storeOrder.getIsChannel() == 2) { + vo.setMwebUrl(unifiedorder.get("mweb_url")); + response.setPayType(PayConstants.PAY_CHANNEL_WE_CHAT_H5); + } + if (storeOrder.getIsChannel() == 4 || storeOrder.getIsChannel() == 5) { + vo.setPartnerid(unifiedorder.get("partnerid")); + } + // 更新商户订单号 + storeOrder.setOutTradeNo(unifiedorder.get("outTradeNo")); + storeOrder.setUpdateTime(DateUtil.date()); + storeOrderService.updateById(storeOrder); + response.setJsConfig(vo); + + return response; + } + // 余额支付 + if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_YUE)) { + Boolean yueBoolean = yuePay(storeOrder); + response.setStatus(yueBoolean); + return response; + } + + if (storeOrder.getPayType().equals(PayConstants.PAY_TYPE_OFFLINE)) { + throw new YztException("暂时不支持线下支付"); + } + response.setStatus(false); + return response; + } + + /** + * 预下单 + * @param storeOrder 订单 + * @param ip ip + * @return 预下单返回对象 + */ + private Map unifiedorder(StoreOrder storeOrder, String ip) { + // 获取用户openId + // 根据订单支付类型来判断获取公众号openId还是小程序openId + UserToken userToken = new UserToken(); + if (storeOrder.getIsChannel() == 0) {// 公众号 + userToken = userTokenService.getTokenByUserId(storeOrder.getUid(), 1); + } + if (storeOrder.getIsChannel() == 1) {// 小程序 + userToken = userTokenService.getTokenByUserId(storeOrder.getUid(), 2); + } + // H5 + if (storeOrder.getIsChannel() == 2) { + userToken.setToken(""); + } + + if (ObjectUtil.isNull(userToken)) { + throw new YztException("该用户没有openId"); + } + + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (storeOrder.getIsChannel() == 0) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (storeOrder.getIsChannel() == 1) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + if (storeOrder.getIsChannel() == 2) {// H5,使用公众号的 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + // 获取微信预下单对象 + CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(storeOrder, userToken.getToken(), ip, appId, mchId, signKey); + // 预下单(统一下单) + CreateOrderResponseVo responseVo = wechatNewService.payUnifiedorder(unifiedorderVo); + // 组装前端预下单参数 + Map map = new HashMap<>(); + map.put("appId", unifiedorderVo.getAppid()); + map.put("nonceStr", unifiedorderVo.getAppid()); + map.put("package", "prepay_id=".concat(responseVo.getPrepayId())); + map.put("signType", unifiedorderVo.getSign_type()); + Long currentTimestamp = WxPayUtil.getCurrentTimestamp(); + map.put("timeStamp", Long.toString(currentTimestamp)); + String paySign = WxPayUtil.getSign(map, signKey); + map.put("paySign", paySign); + map.put("prepayId", responseVo.getPrepayId()); + map.put("prepayTime", YztDateUtil.nowDateTimeStr()); + map.put("outTradeNo", unifiedorderVo.getOut_trade_no()); + if (storeOrder.getIsChannel() == 2) { + map.put("mweb_url", responseVo.getMWebUrl()); + } + return map; + } + + /** + * 获取微信预下单对象 + * @return 微信预下单对象 + */ + private CreateOrderRequestVo getUnifiedorderVo(StoreOrder storeOrder, String openid, String ip, String appId, String mchId, String signKey) { + // 获取域名 + String domain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_URL); + String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL); + + AttachVo attachVo = new AttachVo(Constants.SERVICE_PAY_TYPE_ORDER, storeOrder.getUid()); + CreateOrderRequestVo vo = new CreateOrderRequestVo(); + + vo.setAppid(appId); + vo.setMch_id(mchId); + vo.setNonce_str(WxPayUtil.getNonceStr()); + vo.setSign_type(PayConstants.WX_PAY_SIGN_TYPE_MD5); + String siteName = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME); + // 因商品名称在微信侧超长更换为网站名称 + vo.setBody(siteName); + vo.setAttach(JSONObject.toJSONString(attachVo)); + vo.setOut_trade_no(YztUtil.getOrderNo("wxNo")); + // 订单中使用的是BigDecimal,这里要转为Integer类型 + vo.setTotal_fee(storeOrder.getPayPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); + vo.setSpbill_create_ip(ip); + vo.setNotify_url(apiDomain + PayConstants.WX_PAY_NOTIFY_API_URI); + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS); + vo.setOpenid(openid); + if (storeOrder.getIsChannel() == 2){// H5 + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_H5); + vo.setOpenid(null); + } + if (storeOrder.getIsChannel() == 4 || storeOrder.getIsChannel() == 5) { + vo.setTrade_type("APP"); + vo.setOpenid(null); + } + CreateOrderH5SceneInfoVo createOrderH5SceneInfoVo = new CreateOrderH5SceneInfoVo( + new CreateOrderH5SceneInfoDetailVo( + domain, + systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME) + ) + ); + vo.setScene_info(JSONObject.toJSONString(createOrderH5SceneInfoVo)); + String sign = WxPayUtil.getSign(vo, signKey); + vo.setSign(sign); + return vo; + } + + private UserIntegralRecord integralRecordSubInit(StoreOrder storeOrder, User user) { + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(storeOrder.getUid()); + integralRecord.setLinkId(storeOrder.getOrderId()); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ACTIVITY_DEDUCTION); + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_SUB); + integralRecord.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_ORDER); + integralRecord.setIntegral(java.math.BigDecimal.valueOf(storeOrder.getUseIntegral())); + integralRecord.setBalance(user.getIntegral()); + integralRecord.setMark(StrUtil.format("活动商品订单支付抵扣{}积分购买商品", storeOrder.getUseIntegral())); + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + return integralRecord; + } + + private UserBill userBillInit(StoreOrder order, User user) { + UserBill userBill = new UserBill(); + userBill.setPm(0); + userBill.setUid(order.getUid()); + userBill.setLinkId(order.getId().toString()); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_ORDER_PAY); + userBill.setTitle("购买商品"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_PAY_ORDER); + userBill.setNumber(order.getPayPrice()); + userBill.setBalance(user.getNowMoney()); + userBill.setMark("支付" + order.getPayPrice() + "元购买商品"); + return userBill; + } + + /** + * 经验添加记录 + */ + private UserExperienceRecord experienceRecordInit(StoreOrder storeOrder, Integer balance, Integer experience) { + UserExperienceRecord record = new UserExperienceRecord(); + record.setUid(storeOrder.getUid()); + record.setLinkId(storeOrder.getOrderId()); + record.setLinkType(ExperienceRecordConstants.EXPERIENCE_RECORD_LINK_TYPE_ORDER); + record.setType(ExperienceRecordConstants.EXPERIENCE_RECORD_TYPE_ADD); + record.setTitle(ExperienceRecordConstants.EXPERIENCE_RECORD_TITLE_ORDER); + record.setExperience(experience); + record.setBalance(balance); + record.setMark("用户付款成功增加" + experience + "经验"); + record.setCreateTime(DateUtil.date()); + return record; + } + + /** + * 积分添加记录 + * @return UserIntegralRecord + */ + private UserIntegralRecord integralRecordInit(StoreOrder storeOrder, Integer balance, Integer integral, String type) { + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(storeOrder.getUid()); + integralRecord.setLinkId(storeOrder.getOrderId()); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ORDER); + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + integralRecord.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_ORDER); + integralRecord.setIntegral(java.math.BigDecimal.valueOf(integral)); + integralRecord.setBalance(java.math.BigDecimal.valueOf(balance)); + if (type.equals("order")){ + integralRecord.setMark(StrUtil.format("用户付款成功,订单增加{}积分", integral)); + } + if (type.equals("product")) { + integralRecord.setMark(StrUtil.format("用户付款成功,商品增加{}积分", integral)); + } + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE); + // 获取积分冻结期 + String fronzenTime = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_INTEGRAL_EXTRACT_TIME); + integralRecord.setFrozenTime(Integer.valueOf(Optional.ofNullable(fronzenTime).orElse("0"))); + integralRecord.setCreateTime(YztDateUtil.nowDateTime()); + return integralRecord; + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageOrder(StoreOrder storeOrder, User user, SystemNotification payNotification) { + if (storeOrder.getIsChannel().equals(2)) {// H5 + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + if (!storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT)) { + return; + } + // 公众号 + if (storeOrder.getIsChannel().equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && payNotification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您的订单已支付成功!"); + temMap.put("keyword1", storeOrder.getPayPrice().toString()); + temMap.put("keyword2", storeOrder.getOrderId()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎下次再来!"); + templateMessageService.pushTemplateMessage(payNotification.getWechatId(), temMap, userToken.getToken()); + return; + } + if (storeOrder.getIsChannel().equals(Constants.ORDER_PAY_CHANNEL_PROGRAM) && payNotification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + temMap.put("character_string3", storeOrder.getOrderId()); + temMap.put("amount9", storeOrder.getPayPrice().toString() + "元"); + temMap.put("thing6", "您的订单已支付成功"); + templateMessageService.pushMiniTemplateMessage(payNotification.getRoutineId(), temMap, userToken.getToken()); + } + } + + /** + * 商品购买后根据配置送券 + */ + private void autoSendCoupons(StoreOrder storeOrder){ + // 根据订单详情获取商品信息 + List orders = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + if(null == orders){ + return; + } + List couponUserList = CollUtil.newArrayList(); + Map couponMap = CollUtil.newHashMap(); + for (StoreOrderInfoOldVo order : orders) { + List couponsForGiveUser = storeProductCouponService.getListByProductId(order.getProductId()); + for (int i = 0; i < couponsForGiveUser.size();) { + StoreProductCoupon storeProductCoupon = couponsForGiveUser.get(i); + MyRecord record = storeCouponUserService.paySuccessGiveAway(storeProductCoupon.getIssueCouponId(), storeOrder.getUid()); + if (record.getStr("status").equals("fail")) { + logger.error(StrUtil.format("支付成功领取优惠券失败,失败原因:{}", record.getStr("errMsg"))); + couponsForGiveUser.remove(i); + continue; + } + + StoreCouponUser storeCouponUser = record.get("storeCouponUser"); + couponUserList.add(storeCouponUser); + couponMap.put(storeCouponUser.getCouponId(), record.getBoolean("isLimited")); + i++; + } + } + + Boolean execute = transactionTemplate.execute(e -> { + if (CollUtil.isNotEmpty(couponUserList)) { + storeCouponUserService.saveBatch(couponUserList); + couponUserList.forEach(i -> storeCouponService.deduction(i.getCouponId(), 1, couponMap.get(i.getCouponId()))); + } + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("支付成功领取优惠券,更新数据库失败,订单编号:{}", storeOrder.getOrderId())); + } + } + + /** + * 根据购买商品类型处理等级升级/审核 + * @param storeOrder 订单 + * @param user 用户(可能已经升级过等级) + */ + private void handleLevelUpgradeByProduct(StoreOrder storeOrder, User user) { + try { + // 1. 获取订单商品列表 + List orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + if (CollUtil.isEmpty(orderInfoList)) { + return; + } + + // 2. 获取订单中的最高商品类型(attr_values) + Integer maxAttrValue = getMaxAttrValueFromOrder(orderInfoList); + + // 3. 刷新用户信息(可能在upLevel中已经升级过) + User currentUser = userService.getById(user.getUid()); + if (currentUser == null) { + return; + } + + Integer currentLevel = currentUser.getLevel(); + if (currentLevel == null) { + currentLevel = 1; // 默认普通会员 + } + + // 4. 步骤A:如果是普通会员,直接升级为拼团会员 + if (currentLevel == 1) { + upgradeToLevel2(currentUser, storeOrder.getOrderId()); + currentLevel = 2; // 更新当前等级,用于后续判断 + } + + // 5. 步骤B:根据商品类型判断是否需要生成审核记录 + if (maxAttrValue != null && maxAttrValue > 0) { + createUpgradeAuditIfNeeded(currentUser.getUid(), currentLevel, maxAttrValue, storeOrder.getOrderId()); + } + + } catch (Exception e) { + logger.error("处理等级升级/审核失败,订单号:{}", storeOrder.getOrderId(), e); + } + } + + /** + * 获取订单中的最高商品类型(attr_values) + * @param orderInfoList 订单商品列表 + * @return 最高的attr_values(0/1/2),null表示都是0 + */ + private Integer getMaxAttrValueFromOrder(List orderInfoList) { + Integer maxAttrValue = 0; + + for (StoreOrderInfo orderInfo : orderInfoList) { + Integer productId = orderInfo.getProductId(); + if (productId == null) { + continue; + } + + // 查询商品属性表 + LambdaQueryWrapper attrWrapper = new LambdaQueryWrapper<>(); + attrWrapper.eq(StoreProductAttr::getProductId, productId) + .eq(StoreProductAttr::getType, Constants.PRODUCT_TYPE_NORMAL) + .eq(StoreProductAttr::getIsDel, false) + .last("limit 1"); + + StoreProductAttr productAttr = storeProductAttrService.getOne(attrWrapper); + if (productAttr != null && StrUtil.isNotBlank(productAttr.getAttrValues())) { + String attrValues = productAttr.getAttrValues().trim(); + + // attr_values: "0"=会员, "1"=加盟店, "2"=会馆 + if ("2".equals(attrValues)) { + maxAttrValue = 2; + break; // 已经是最高等级,无需继续 + } else if ("1".equals(attrValues) && maxAttrValue < 1) { + maxAttrValue = 1; + } + } + } + + return maxAttrValue == 0 ? null : maxAttrValue; + } + + /** + * 普通会员直接升级为拼团会员 + * @param user 用户 + * @param orderId 订单号 + */ + private void upgradeToLevel2(User user, String orderId) { + try { + // 创建等级记录 + UserLevel newLevel = new UserLevel(); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(2); + newLevel.setGrade(2); + newLevel.setStatus(true); + newLevel.setIsDel(false); + newLevel.setDiscount(100); + newLevel.setCreateTime(DateUtil.date()); + + // 在mark中记录订单号 + String mark = StrUtil.format("尊敬的用户【{}】,在{}支付订单{}成功,升级为拼团会员", + user.getNickname(), + YztDateUtil.nowDateTimeStr(), + orderId); + newLevel.setMark(mark); + + userLevelService.save(newLevel); + + // 更新用户等级 + user.setLevel(2); + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + + logger.info("用户{}从普通会员升级为拼团会员,订单号:{}", user.getUid(), orderId); + } catch (Exception e) { + logger.error("用户{}升级为拼团会员失败,订单号:{}", user.getUid(), orderId, e); + } + } + + /** + * 根据商品类型创建升级审核记录(如果需要) + * @param uid 用户ID + * @param currentLevel 当前等级 + * @param maxAttrValue 商品最高类型(1=加盟店, 2=会馆) + * @param orderId 订单号 + */ + private void createUpgradeAuditIfNeeded(Integer uid, Integer currentLevel, Integer maxAttrValue, String orderId) { + Integer targetLevel = null; + + // 判断目标等级 + if (currentLevel == 2) { // 拼团会员 + if (maxAttrValue == 2) { + targetLevel = 4; // 升级到会馆 + } else if (maxAttrValue == 1) { + targetLevel = 3; // 升级到加盟店 + } + } else if (currentLevel == 3) { // 加盟店 + if (maxAttrValue == 2) { + targetLevel = 4; // 升级到会馆 + } + } + + // 如果有目标等级,且目标等级大于当前等级,创建审核记录 + if (targetLevel != null && targetLevel > currentLevel) { + try { + boolean created = userLevelUpgradeAuditService.createAuditRecord(uid, currentLevel, targetLevel, orderId,1); + if (created) { + logger.info("为用户{}创建等级升级审核记录,当前等级:{},目标等级:{},订单号:{}", + uid, currentLevel, targetLevel, orderId); + } else { + logger.info("用户{}已存在相同目标等级的待审核记录,跳过创建,订单号:{}", uid, orderId); + } + } catch (Exception e) { + logger.error("为用户{}创建升级审核记录失败,订单号:{}", uid, orderId, e); + } + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..c18ce20 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderServiceImpl.java @@ -0,0 +1,3155 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.bargain.StoreBargainUser; +import com.yzt.common.model.cat.StoreCart; +import com.yzt.common.model.category.Category; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.express.Express; +import com.yzt.common.model.express.ShippingTemplates; +import com.yzt.common.model.express.ShippingTemplatesFree; +import com.yzt.common.model.express.ShippingTemplatesRegion; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.model.order.StoreOrderStatus; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.seckill.StoreSeckill; +import com.yzt.common.model.seckill.StoreSeckillManger; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserAddress; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.*; +import com.yzt.service.delete.OrderUtils; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * H5端订单操作 + * + */ +@Service +public class OrderServiceImpl implements OrderService { + + private final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); + + @Autowired + private UserService userService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private StoreCartService storeCartService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private ShippingTemplatesService shippingTemplatesService; + + @Autowired + private UserAddressService userAddressService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreProductReplyService storeProductReplyService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SystemStoreService systemStoreService; + + @Autowired + private OrderUtils orderUtils; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private LogisticService logisticsService; + + @Autowired + private StoreSeckillService storeSeckillService; + + @Lazy + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private SmsService smsService; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private StoreProductAttrService storeProductAttrService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreProductAttrValueService attrValueService; + + @Autowired + private ShippingTemplatesFreeService shippingTemplatesFreeService; + + @Autowired + private StoreOrderInvoiceService storeOrderInvoiceService; + + @Autowired + private ShippingTemplatesRegionService shippingTemplatesRegionService; + + @Autowired + private StoreCouponUserService storeCouponUserService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Autowired + private StoreSeckillMangerService storeSeckillMangerService; + + @Autowired + private ExpressService expressService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Autowired + private SystemNotificationService systemNotificationService; + + @Autowired + private SmsTemplateService smsTemplateService; + + @Autowired + private CategoryService categoryService; + + @Autowired + private UserBillService userBillService; + + /** + * 发送后台管理员下单提醒通知短信 + * + * @param orderNo 订单编号 + */ + @Async + public void sendAdminOrderNotice(String orderNo) { + // 系统是否开启用户下单管理员提醒开关 + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.PLACE_AN_ORDER_ADMIN_MARK); + if (!notification.getIsSms().equals(1)) { + return; + } + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isEmpty(systemAdminList)) { + return; + } + // 发送短信 + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + Integer tempId = Integer.valueOf(smsTemplate.getTempId()); + systemAdminList.forEach(admin -> smsService.sendCreateOrderNotice(admin.getPhone(), orderNo, admin.getRealName(), tempId)); + } + + /** + * 删除已完成订单 + * + * @param id Integer 订单id + * @return 删除结果 + */ + @Override + public Boolean delete(Integer id) { + StoreOrder storeOrder = storeOrderService.getById(id); + Integer userId = userService.getUserIdException(); + if (ObjectUtil.isNull(storeOrder) || !userId.equals(storeOrder.getUid())) { + throw new YztException("没有找到相关订单信息!"); + } + if (storeOrder.getIsDel() || storeOrder.getIsSystemDel()) { + throw new YztException("订单已删除!"); + } + if (storeOrder.getPaid()) { + if (storeOrder.getRefundStatus() > 0 && !storeOrder.getRefundStatus().equals(2)) { + throw new YztException("订单在退款流程中无法删除!"); + } + if (storeOrder.getRefundStatus().equals(0) && !storeOrder.getStatus().equals(3)) { + throw new YztException("只能删除已完成订单!"); + } + } else { + throw new YztException("未支付订单无法删除!"); + } + + //可以删除 + storeOrder.setIsDel(true); + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(e -> { + storeOrderService.updateById(storeOrder); + //日志 + storeOrderStatusService.createLog(storeOrder.getId(), "remove_order", "删除订单"); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 创建订单商品评价 + * + * @param request 请求参数 + * @return Boolean + */ + @Override + public Boolean reply(StoreProductReplyAddRequest request) { + if (StrUtil.isBlank(request.getOrderNo())) { + throw new YztException("订单号参数不能为空"); + } + return storeProductReplyService.create(request); + } + + /** + * 订单收货 + * + * @param id Integer 订单id + */ + @Override + public Boolean take(Integer id) { + StoreOrder storeOrder = orderUtils.getInfoById(id); + if (!storeOrder.getStatus().equals(Constants.ORDER_STATUS_INT_SPIKE)) { + throw new YztException("订单状态错误"); + } + +// //已收货,待评价 +// storeOrder.setStatus(Constants.ORDER_STATUS_INT_BARGAIN); + //已完成 + storeOrder.setStatus(Constants.ORDER_STATUS_INT_COMPLETE); + storeOrder.setUpdateTime(DateUtil.date()); + storeOrder.setFinishTime(DateUtil.date()); + boolean result = storeOrderService.updateById(storeOrder); + if (result) { + //后续操作放入redis + redisUtil.lPush(TaskConstants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER, id); + } + return result; + } + + /** + * 订单取消 + * + * @param id Integer 订单id + */ + @Override + public Boolean cancel(Integer id) { + StoreOrder storeOrder = orderUtils.getInfoById(id); + //已收货,待评价 + storeOrder.setIsDel(true); + storeOrder.setIsSystemDel(true); + storeOrder.setUpdateTime(DateUtil.date()); + boolean result = storeOrderService.updateById(storeOrder); + + //后续操作放入redis + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_CANCEL_BY_USER, id); + return result; + } + + /** + * 订单退款申请 + * + * @param request OrderRefundApplyRequest 退款参数 + */ + @Override + public Boolean refundApply(OrderRefundApplyRequest request) { + StoreOrder storeOrderPram = new StoreOrder(); + storeOrderPram.setOrderId(request.getUni()); + storeOrderPram.setIsDel(false); + storeOrderPram.setPaid(true); + StoreOrder existStoreOrder = storeOrderService.getByEntityOne(storeOrderPram); + if (null == existStoreOrder) throw new YztException("支付订单不存在"); + if (existStoreOrder.getRefundStatus() == 1) { + throw new YztException("正在申请退款中"); + } + + if (existStoreOrder.getRefundStatus() == 2) { + throw new YztException("订单已退款"); + } + + if (existStoreOrder.getRefundStatus() == 3) { + throw new YztException("订单退款中"); + } + + existStoreOrder.setRefundStatus(1); + existStoreOrder.setRefundReasonTime(YztDateUtil.nowDateTime()); + existStoreOrder.setRefundReasonWap(request.getText()); + existStoreOrder.setRefundReasonWapExplain(request.getExplain()); + existStoreOrder.setRefundReasonWapImg(systemAttachmentService.clearPrefix(request.getReasonImage())); + existStoreOrder.setRefundPrice(BigDecimal.ZERO); + // 退款类型与货物状态处理:仅退款使用前端传入的货物状态;退货退款强制为已收到货(1) + if (ObjectUtil.isNotNull(request.getRefundType()) && request.getRefundType().equals(1)) { + existStoreOrder.setRefundType(request.getRefundType()); + existStoreOrder.setRefundGoodsStatus(1); + } else { + // 仅退款场景,货物状态必须由前端提供 + if (ObjectUtil.isNull(request.getGoodsStatus())) { + throw new YztException("货物状态不能为空"); + } + existStoreOrder.setRefundType(request.getRefundType()); + existStoreOrder.setRefundGoodsStatus(request.getGoodsStatus()); + } + + existStoreOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(e -> { + storeOrderService.updateById(existStoreOrder); + storeOrderStatusService.createLog(existStoreOrder.getId(), Constants.ORDER_LOG_REFUND_APPLY, "用户申请退款原因:" + request.getExplain()); + return Boolean.TRUE; + }); + + if (execute) { + // 发送用户退款管理员提醒短信 + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.APPLY_ORDER_REFUND_ADMIN_MARK); + if (notification.getIsSms().equals(1)) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + Integer tempId = Integer.valueOf(smsTemplate.getTempId()); + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderRefundApplyNotice(admin.getPhone(), existStoreOrder.getOrderId(), admin.getRealName(), tempId); + }); + } + } + } + if (!execute) throw new YztException("申请退款失败"); + return execute; + } + + /** + * 订单退款申请Task使用 + * + * @param applyList OrderRefundApplyRequest 退款参数 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean refundApplyTask(List applyList) { + if (CollUtil.isEmpty(applyList)) { + return false; + } + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.APPLY_ORDER_REFUND_ADMIN_MARK); + List systemAdminList = systemAdminService.findIsSmsList(); + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + Integer tempId = Integer.valueOf(smsTemplate.getTempId()); + List orderList = CollUtil.newArrayList(); + for (OrderRefundApplyRequest request : applyList) { + StoreOrder storeOrder = storeOrderService.getById(request.getId()); + if (ObjectUtil.isNull(storeOrder)) { + //订单号错误 + logger.error("拼团自动处理订单申请退款:没有找到相关订单信息!"); + continue; + } + if (storeOrder.getRefundStatus() == 1) { + logger.error("拼团自动处理订单申请退款:正在申请退款中!"); + continue; + } + + if (storeOrder.getRefundStatus() == 2) { + logger.error("拼团自动处理订单申请退款:订单已退款!"); + continue; + } + + if (storeOrder.getRefundStatus() == 3) { + logger.error("拼团自动处理订单申请退款:订单退款中!"); + continue; + } + + storeOrder.setRefundReasonWapImg(systemAttachmentService.clearPrefix(request.getReasonImage())); + storeOrder.setRefundStatus(1); + storeOrder.setRefundReasonWapExplain(request.getExplain()); + storeOrder.setRefundReason(request.getText()); + storeOrder.setRefundPrice(BigDecimal.ZERO); + storeOrder.setRefundReasonTime(YztDateUtil.nowDateTime()); + storeOrder.setUpdateTime(DateUtil.date()); + orderList.add(storeOrder); + + // 发送用户退款管理员提醒短信 + if (notification.getIsSms().equals(1) && CollUtil.isNotEmpty(systemAdminList)) { + // 发送短信 + systemAdminList.forEach(admin -> smsService.sendOrderRefundApplyNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName(), tempId)); + } + } + + return storeOrderService.updateBatchById(orderList, 100); + } + + /** + * 订单列表 + * + * @param status 类型 + * @param pageRequest 分页 + * @return CommonPage + */ + @Override + public PageInfo list(String keywords, Integer status, PageParamRequest pageRequest) { + Integer userId = userService.getUserIdException(); + + PageInfo orderPageInfo = storeOrderService.getUserOrderList_2_3(keywords,userId, status, pageRequest); + List orderList = orderPageInfo.getList(); + if (CollUtil.isEmpty(orderList)) { + return CommonPage.copyPageInfo(orderPageInfo, CollUtil.newArrayList()); + } + CommonPage storeOrderCommonPage = CommonPage.restPage(orderList); + List responseList = CollUtil.newArrayList(); + for (StoreOrder storeOrder : orderList) { + OrderDetailResponse infoResponse = new OrderDetailResponse(); + BeanUtils.copyProperties(storeOrder, infoResponse); + // 订单状态(如果被删除或后台删除,则标记为已取消) + if (Boolean.TRUE.equals(storeOrder.getIsDel()) || Boolean.TRUE.equals(storeOrder.getIsSystemDel())) { + infoResponse.setOrderStatus("已取消"); + } else { + infoResponse.setOrderStatus(getH5OrderStatus(storeOrder)); + } + // 活动类型 + infoResponse.setActivityType(getOrderActivityType(storeOrder)); + // 订单详情对象列表 + List orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + List infoResponseList = CollUtil.newArrayList(); + orderInfoList.forEach(e -> { + OrderInfoResponse orderInfoResponse = new OrderInfoResponse(); + orderInfoResponse.setStoreName(e.getProductName()); + orderInfoResponse.setImage(e.getImage()); + orderInfoResponse.setCartNum(e.getPayNum()); + orderInfoResponse.setPrice(ObjectUtil.isNotNull(e.getVipPrice()) ? e.getVipPrice() : e.getPrice()); + orderInfoResponse.setProductId(e.getProductId()); + orderInfoResponse.setAttrId(e.getUnique()); + orderInfoResponse.setIsReply(e.getIsReply()?1:0); + infoResponseList.add(orderInfoResponse); + }); + infoResponse.setOrderInfoList(infoResponseList); + responseList.add(infoResponse); + } + + return CommonPage.copyPageInfo(orderPageInfo, responseList); + } + + /** + * 获取订单活动类型 + * + * @param storeOrder 订单都西昂 + * @return 活动类型 + */ + private String getOrderActivityType(StoreOrder storeOrder) { + if (storeOrder.getSeckillId() > 0) { + return "秒杀"; + } + if (storeOrder.getCombinationId() > 0) { + return "拼团"; + } + if (storeOrder.getBargainId() > 0) { + return "砍价"; + } + if (storeOrder.getType().equals(1)) { + return "视频号"; + } + if (storeOrder.getShippingType().equals(2)) { + return "核销"; + } + return "普通"; + } + + /** + * 获取H5订单状态 + * + * @param storeOrder 订单对象 + */ + private String getH5OrderStatus(StoreOrder storeOrder) { + if (!storeOrder.getPaid()) { + return "待支付"; + } + if (storeOrder.getRefundStatus().equals(1)) { + return "申请退款中"; + } + if (storeOrder.getRefundStatus().equals(2)) { + return "已退款"; + } + if (storeOrder.getRefundStatus().equals(3)) { + return "退款中"; + } + if (storeOrder.getStatus().equals(0)) { + return "待发货"; + } + if (storeOrder.getStatus().equals(1)) { + return "待收货"; + } + if (storeOrder.getStatus().equals(2)) { + return "待评价"; + } + if (storeOrder.getStatus().equals(3)) { + return "已完成"; + } + return ""; + } + + /** + * 订单详情 + * + * @param orderId 订单id + */ + @Override + public StoreOrderDetailInfoResponse detailOrder(String orderId) { + User currentUser = userService.getInfoException(); + + StoreOrderDetailInfoResponse storeOrderDetailResponse = new StoreOrderDetailInfoResponse(); + // 查询订单 + StoreOrder storeOrder = storeOrderService.getByOderId(orderId); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("订单不存在"); + } + if (!storeOrder.getUid().equals(currentUser.getUid())) { + throw new YztException("订单不存在"); + } + + BeanUtils.copyProperties(storeOrder, storeOrderDetailResponse); + MyRecord orderStatusVo = getOrderStatusVo(storeOrder); + // 订单详情对象列表 + List infoResponseList = CollUtil.newArrayList(); + List infoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + infoList.forEach(e -> { + OrderInfoResponse orderInfoResponse = new OrderInfoResponse(); + orderInfoResponse.setStoreName(e.getProductName()); + orderInfoResponse.setImage(e.getImage()); + orderInfoResponse.setCartNum(e.getPayNum()); + orderInfoResponse.setPrice(ObjectUtil.isNotNull(e.getVipPrice()) ? e.getVipPrice() : e.getPrice()); + orderInfoResponse.setProductId(e.getProductId()); + orderInfoResponse.setIsReply(e.getIsReply() ? 1 : 0); + orderInfoResponse.setAttrId(e.getAttrValueId()+""); + orderInfoResponse.setSku(e.getSku()); + infoResponseList.add(orderInfoResponse); + }); + storeOrderDetailResponse.setOrderInfoList(infoResponseList); + + // 系统门店信息 + SystemStore systemStorePram = new SystemStore(); + systemStorePram.setId(storeOrder.getStoreId()); + storeOrderDetailResponse.setSystemStore(systemStoreService.getByCondition(systemStorePram)); + // 腾讯云地图key + BeanUtils.copyProperties(storeOrder, storeOrderDetailResponse); + storeOrderDetailResponse.setStatusPic(orderStatusVo.getStr("statusPic")); + // 将删除/取消标记返回给前端,并在被取消时覆盖状态描述 + storeOrderDetailResponse.setIsDel(storeOrder.getIsDel()); + storeOrderDetailResponse.setIsSystemDel(storeOrder.getIsSystemDel()); + storeOrderDetailResponse.setCanceled(Boolean.TRUE.equals(storeOrder.getIsDel()) || Boolean.TRUE.equals(storeOrder.getIsSystemDel())); + if (Boolean.TRUE.equals(storeOrderDetailResponse.getCanceled())) { + storeOrderDetailResponse.setOrderStatusMsg("订单已取消"); + } else { + storeOrderDetailResponse.setOrderStatusMsg(orderStatusVo.getStr("msg")); + } + storeOrderDetailResponse.setPayTypeStr(orderStatusVo.getStr("payTypeStr")); + BigDecimal proTotalPrice = storeOrderDetailResponse.getPayPrice().add(storeOrderDetailResponse.getCouponPrice()).add(storeOrderDetailResponse.getDeductionPrice()).subtract(storeOrderDetailResponse.getPayPostage()); + storeOrderDetailResponse.setProTotalPrice(proTotalPrice); + + // 查询发票信息 + StoreOrderInvoice invoice = storeOrderInvoiceService.getByOrderId(orderId); + storeOrderDetailResponse.setInvoiceInfo(invoice); + return storeOrderDetailResponse; + } + + /** + * 获取订单状态相关信息 + * + * @return MyRecord + */ + private MyRecord getOrderStatusVo(StoreOrder storeOrder) { + MyRecord record = new MyRecord(); + if (!storeOrder.getPaid()) { + record.set("type", 0); + record.set("title", "未支付"); + record.set("msg", "订单未支付"); + String orderCancelTime; + if (storeOrder.getBargainId() <= 0 && storeOrder.getPinkId() <= 0 && storeOrder.getSeckillId() <= 0) { + orderCancelTime = systemConfigService.getValueByKey("order_cancel_time"); + } else { + orderCancelTime = systemConfigService.getValueByKey("order_activity_time"); + } + Date timeSpace; + timeSpace = YztDateUtil.addSecond(storeOrder.getCreateTime(), Double.valueOf(orderCancelTime).intValue() * 3600); + record.set("msg", "请在" + YztDateUtil.dateToStr(timeSpace, Constants.DATE_FORMAT) + "前完成支付"); + } else if (storeOrder.getRefundStatus() == 1) { + record.set("type", -1); + record.set("title", "申请退款中"); + record.set("msg", "商家审核中,请耐心等待"); + } else if (storeOrder.getRefundStatus() == 2) { + record.set("type", -2); + record.set("title", "已退款"); + record.set("msg", "已为您退款,感谢您的支持"); + } else if (storeOrder.getRefundStatus() == 3) { + record.set("type", -3); + record.set("title", "退款中"); + record.set("msg", "正在为您退款,感谢您的支持"); + } else if (storeOrder.getStatus() == 0) { + record.set("type", 1); + record.set("title", "未发货"); + record.set("msg", "商家未发货,请耐心等待"); + } else if (storeOrder.getStatus() == 1) { // 待收货处理 + // 待收货 + if (null != storeOrder.getDeliveryType() && storeOrder.getDeliveryType().equals(Constants.ORDER_STATUS_STR_SPIKE_KEY)) { // 送货 + StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); + storeOrderStatus.setOid(storeOrder.getId()); + storeOrderStatus.setChangeType(Constants.ORDER_LOG_DELIVERY); + List sOrderStatusResults = storeOrderStatusService.getByEntity(storeOrderStatus); + if (sOrderStatusResults.size() > 0) { + record.set("type", 2); + record.set("title", "待收货"); + record.set("msg", "商家已送货,请耐心等待"); + } + } else if (null != storeOrder.getDeliveryType() && storeOrder.getDeliveryType().equals(Constants.ORDER_LOG_EXPRESS)) { + StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); + storeOrderStatus.setOid(storeOrder.getId()); + storeOrderStatus.setChangeType(Constants.ORDER_LOG_EXPRESS); + List sOrderStatusResults = storeOrderStatusService.getByEntity(storeOrderStatus); + if (sOrderStatusResults.size() > 0) { + record.set("type", 2); + record.set("title", "待收货"); + record.set("msg", "商家已发货,请耐心等待"); + } + } else { + StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); + storeOrderStatus.setOid(storeOrder.getId()); + storeOrderStatus.setChangeType(Constants.ORDER_LOG_DELIVERY_VI); + List sOrderStatusResults = storeOrderStatusService.getByEntity(storeOrderStatus); + if (sOrderStatusResults.size() > 0) { + record.set("type", 2); + record.set("title", "待收货"); + record.set("msg", "服务商已虚拟发货"); + } else { + record.set("type", 2); + record.set("title", "待收货"); + record.set("msg", "退款拒绝订单已发货"); + } + } + } else if (storeOrder.getStatus() == 2) { + record.set("type", 3); + record.set("title", "待评价"); + record.set("msg", "已收货,快去评价一下吧"); + } else if (storeOrder.getStatus() == 3) { + record.set("type", 4); + record.set("title", "交易完成"); + record.set("msg", "交易完成,感谢您的支持"); + } + + // 支付方式 + String orderPayTypeStr = orderUtils.getOrderPayTypeStr(storeOrder.getPayType()); + record.set("payTypeStr", orderPayTypeStr); + if (StringUtils.isNotBlank(storeOrder.getDeliveryType())) { + record.set("deliveryType", StringUtils.isNotBlank(storeOrder.getDeliveryType()) ? storeOrder.getDeliveryType() : "其他方式"); + } + + // 获取商品状态图片 ignore + List orderStatusPicList = systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_ORDER_STATUS_PIC, SystemGroupDataOrderStatusPicResponse.class);// 53 = group id 在groupData中查询数据 + for (SystemGroupDataOrderStatusPicResponse picList : orderStatusPicList) { + if (picList.getOrderStatus() == record.getInt("type")) { + record.set("statusPic", picList.getUrl()); + break; + } + } + return record; + } + + /** + * 订单tap data + * + * @return 订单状态数据量 + */ + @Override + public OrderDataResponse orderData() { + Integer userId = userService.getUserIdException(); + OrderDataResponse result = new OrderDataResponse(); + + // 订单数量 + Integer orderCount = storeOrderService.getOrderCountByUid(userId); + // 待支付订单数 + Integer unPaidCount = storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_UNPAID, userId); + + if (orderCount.equals(0)) { + result.setOrderCount(0); + result.setSumPrice(BigDecimal.ZERO); + result.setUnPaidCount(unPaidCount); + result.setUnShippedCount(0); + result.setReceivedCount(0); + result.setEvaluatedCount(0); + result.setCompleteCount(0); + result.setRefundCount(0); + return result; + } + + result.setOrderCount(orderCount); + // 总消费金额 + BigDecimal sumPrice = storeOrderService.getSumPayPriceByUid(userId); + result.setSumPrice(sumPrice); + // 未支付 + result.setUnPaidCount(unPaidCount); + // 待发货 + result.setUnShippedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_NOT_SHIPPED, userId)); + // 待收货 + result.setReceivedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_SPIKE, userId)); + // 待核销 + result.setEvaluatedCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_JUDGE, userId)); + // 已完成 + result.setCompleteCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_COMPLETE, userId)); + // 退款中和已退款(只展示退款中) + result.setRefundCount(storeOrderService.getTopDataUtil(Constants.ORDER_STATUS_H5_REFUNDING, userId)); + return result; + } + + /** + * 查询退款理由 + * + * @return 退款理由集合 + */ + @Override + public List getRefundReason() { + String reasonString = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STOR_REASON); + reasonString = YztUtil.UnicodeToCN(reasonString); + reasonString = reasonString.replace("rn", "n"); + return Arrays.asList(reasonString.split("\\n")); + } + + /** + * 订单物流查看 + * + * @param orderId 订单id + */ + @Override + public Object expressOrder(String orderId) { + HashMap resultMap = new HashMap<>(); + StoreOrder storeOrderPram = new StoreOrder(); + storeOrderPram.setOrderId(orderId); + StoreOrder existOrder = storeOrderService.getByEntityOne(storeOrderPram); + if (ObjectUtil.isNull(existOrder)) throw new YztException("未找到该订单信息"); + if (!existOrder.getDeliveryType().equals(Constants.ORDER_LOG_EXPRESS) || StringUtils.isBlank(existOrder.getDeliveryType())) + throw new YztException("该订单不存在快递订单号"); + + if (existOrder.getType().equals(1)) {// 视频号订单 + Express express = expressService.getByName(existOrder.getDeliveryName()); + if (ObjectUtil.isNotNull(express)) { + existOrder.setDeliveryCode(express.getCode()); + } else { + existOrder.setDeliveryCode(""); + } + } + LogisticsResultVo expressInfo = logisticsService.info(existOrder.getDeliveryId(), null, Optional.ofNullable(existOrder.getDeliveryCode()).orElse(""), storeOrderPram.getUserPhone()); + + List list = storeOrderInfoService.getVoListByOrderId(existOrder.getId()); + List> cartInfos = CollUtil.newArrayList(); + for (StoreOrderInfoVo infoVo : list) { + HashMap cartInfo = new HashMap<>(); + cartInfo.put("payNum", infoVo.getInfo().getPayNum()); + cartInfo.put("price", infoVo.getInfo().getPrice()); + cartInfo.put("productName", infoVo.getInfo().getProductName()); + cartInfo.put("productImg", infoVo.getInfo().getImage()); + cartInfos.add(cartInfo); + } + HashMap orderInfo = new HashMap<>(); + orderInfo.put("deliveryId", existOrder.getDeliveryId()); + orderInfo.put("deliveryName", existOrder.getDeliveryName()); + orderInfo.put("deliveryType", existOrder.getDeliveryType()); + orderInfo.put("info", cartInfos); + + resultMap.put("order", orderInfo); + resultMap.put("express", expressInfo); + return resultMap; + + } + + /** + * 获取待评价信息 + */ + @Override + public OrderProductReplyResponse getReplyProduct(GetProductReply productReply) { + StoreOrderInfo storeOrderInfo = storeOrderInfoService.getByUniAndOrderId(productReply.getUni(), productReply.getOrderId()); + OrderInfoDetailVo scr = JSONObject.parseObject(storeOrderInfo.getInfo(), OrderInfoDetailVo.class); + OrderProductReplyResponse response = new OrderProductReplyResponse(); + response.setCartNum(scr.getPayNum()); + response.setTruePrice(scr.getPrice()); + response.setProductId(scr.getProductId()); + response.setImage(scr.getImage()); + response.setSku(scr.getSku()); + response.setStoreName(scr.getProductName()); + return response; + } + + /** + * 获取申请订单退款信息 + * + * @param orderId 订单编号 + * @return ApplyRefundOrderInfoResponse + */ + @Override + public ApplyRefundOrderInfoResponse applyRefundOrderInfo(String orderId) { + StoreOrder storeOrder = getByOrderIdException(orderId); + ApplyRefundOrderInfoResponse response = new ApplyRefundOrderInfoResponse(); + BeanUtils.copyProperties(storeOrder, response); + // 订单详情对象列表 + List infoVoList = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + List infoResponseList = CollUtil.newArrayList(); + infoVoList.forEach(e -> { + OrderInfoResponse orderInfoResponse = new OrderInfoResponse(); + orderInfoResponse.setStoreName(e.getInfo().getProductName()); + orderInfoResponse.setImage(e.getInfo().getImage()); + orderInfoResponse.setCartNum(e.getInfo().getPayNum()); + orderInfoResponse.setPrice(e.getInfo().getPrice()); + orderInfoResponse.setProductId(e.getProductId()); + infoResponseList.add(orderInfoResponse); + }); + response.setOrderInfoList(infoResponseList); + return response; + } + + /** + * 订单预下单 + * + * @param request 预下单请求参数 + * @return PreOrderResponse + */ + @Override + public MyRecord preOrder(PreOrderRequest request) { + if (CollUtil.isEmpty(request.getOrderDetails())) { + throw new YztException("预下单订单详情列表不能为空"); + } + User user = userService.getInfoException(); + // 校验预下单商品信息 + OrderInfoVo orderInfoVo = validatePreOrderRequest(request, user); + // 商品总计金额 + BigDecimal totalPrice; + if (orderInfoVo.getOrderDetailList().get(0).getProductType().equals(Constants.PRODUCT_TYPE_NORMAL)) { + // 普通商品 + totalPrice = orderInfoVo.getOrderDetailList().stream().map(e -> e.getVipPrice().multiply(new BigDecimal(e.getPayNum()))).reduce(BigDecimal.ZERO, BigDecimal::add); + } else { + totalPrice = orderInfoVo.getOrderDetailList().stream().map(e -> e.getPrice().multiply(new BigDecimal(e.getPayNum()))).reduce(BigDecimal.ZERO, BigDecimal::add); + } + orderInfoVo.setProTotalFee(totalPrice); + // 购买商品总数量 + int orderProNum = orderInfoVo.getOrderDetailList().stream().mapToInt(OrderInfoDetailVo::getPayNum).sum(); + orderInfoVo.setOrderProNum(orderProNum); + // 获取默认地址 + UserAddress userAddress = userAddressService.getDefaultByUid(user.getUid()); + if (ObjectUtil.isNotNull(userAddress)) { + // 计算运费 + getFreightFee(orderInfoVo, userAddress); + orderInfoVo.setAddressId(userAddress.getId()); + orderInfoVo.setRealName(userAddress.getRealName()); + orderInfoVo.setPhone(userAddress.getPhone()); + orderInfoVo.setProvince(userAddress.getProvince()); + orderInfoVo.setCity(userAddress.getCity()); + orderInfoVo.setDistrict(userAddress.getDistrict()); + orderInfoVo.setDetail(userAddress.getDetail()); + } else { + orderInfoVo.setFreightFee(BigDecimal.ZERO); + } + // 实际支付金额 + orderInfoVo.setPayFee(orderInfoVo.getProTotalFee().add(orderInfoVo.getFreightFee())); + orderInfoVo.setUserIntegral(user.getIntegral()); + orderInfoVo.setUserBalance(user.getNowMoney()); + // 缓存订单 + String key = user.getUid() + YztDateUtil.getNowTime().toString() + YztUtil.getUuid(); + redisUtil.set("user_order:" + key, JSONObject.toJSONString(orderInfoVo), Constants.ORDER_CASH_CONFIRM, TimeUnit.MINUTES); + MyRecord record = new MyRecord(); + record.set("preOrderNo", key); + return record; + } + + /** + * 加载预下单信息 + * + * @param preOrderNo 预下单号 + * @return 预下单信息 + */ + @Override + public PreOrderResponse loadPreOrder(String preOrderNo) { + // 通过缓存获取预下单对象 + String key = "user_order:" + preOrderNo; + boolean exists = redisUtil.exists(key); + if (!exists) { + throw new YztException("预下单订单不存在"); + } + String orderVoString = redisUtil.get(key).toString(); + OrderInfoVo orderInfoVo = JSONObject.parseObject(orderVoString, OrderInfoVo.class); + PreOrderResponse preOrderResponse = new PreOrderResponse(); + preOrderResponse.setOrderInfoVo(orderInfoVo); + String payWeixinOpen = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN); + if (orderInfoVo.getIsVideo()) { + // 关闭余额支付和到店自提 + preOrderResponse.setYuePayStatus("0"); + preOrderResponse.setPayWeixinOpen(payWeixinOpen); + preOrderResponse.setStoreSelfMention("false"); + preOrderResponse.setAliPayStatus("0"); + return preOrderResponse; + } + String yuePayStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS);// 1开启 2关闭 + String storeSelfMention = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_SELF_MENTION); + String aliPayStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS);// 1开启 + preOrderResponse.setYuePayStatus(yuePayStatus); + preOrderResponse.setPayWeixinOpen(payWeixinOpen); + preOrderResponse.setStoreSelfMention(storeSelfMention); + preOrderResponse.setAliPayStatus(aliPayStatus); + return preOrderResponse; + } + + /** + * 计算订单价格 + * + * @param request 计算订单价格请求对象 + * @return ComputedOrderPriceResponse + */ + @Override + public ComputedOrderPriceResponse computedOrderPrice(OrderComputedPriceRequest request) { + // 通过缓存获取预下单对象 + String key = "user_order:" + request.getPreOrderNo(); + boolean exists = redisUtil.exists(key); + if (!exists) { + throw new YztException("预下单订单不存在"); + } + String orderVoString = redisUtil.get(key).toString(); + OrderInfoVo orderInfoVo = JSONObject.parseObject(orderVoString, OrderInfoVo.class); + User user = userService.getInfoException(); + return computedPrice(request, orderInfoVo, user); + } + + /** + * 校验购买限制:根据用户上级等级限制购买特定商品 + * 规则: + * 1. 上级等级level为1(普通会员)或2(拼团会员):不能购买商品属性attr_values为"1"(加盟店)和"2"(会馆)的商品 + * 2. 上级等级level为3(加盟店):不能购买商品属性attr_values为"2"(会馆)的商品 + * 3. 上级等级level为4(会馆)、5(金奖会馆)、6(成义会馆):购买商品无限制 + * 4. 购买商品属性attr_values为"0"(会员)时:对购买者等级及其上级等级无限制 + * + * 说明:商品类型从fw_store_product_attr表的attr_values字段获取 + * + * @param orderInfoVo 订单信息 + * @param user 当前购买用户 + */ + private void validatePurchaseRestriction(OrderInfoVo orderInfoVo, User user) { + // 获取用户的上级ID + Integer spreadUid = user.getSpreadUid(); + + // 如果没有上级,无限制 + if (spreadUid == null || spreadUid <= 0) { + return; + } + + // 获取上级用户信息 + User parentUser = userService.getById(spreadUid); + if (parentUser == null) { + return; + } + + Integer parentLevel = parentUser.getLevel(); + if (parentLevel == null) { + return; + } + + // 遍历订单中的商品,检查每个商品的attr_values + for (OrderInfoDetailVo detailVo : orderInfoVo.getOrderDetailList()) { + // 获取商品ID + Integer productId = detailVo.getProductId(); + if (productId == null) { + continue; + } + + // 查询商品属性表,获取attr_values字段 + LambdaQueryWrapper attrWrapper = Wrappers.lambdaQuery(); + attrWrapper.eq(StoreProductAttr::getProductId, productId) + .eq(StoreProductAttr::getType, Constants.PRODUCT_TYPE_NORMAL) + .eq(StoreProductAttr::getIsDel, false) + .last("limit 1"); + + StoreProductAttr productAttr = storeProductAttrService.getOne(attrWrapper); + if (productAttr == null || StrUtil.isBlank(productAttr.getAttrValues())) { + continue; + } + + String attrValues = productAttr.getAttrValues().trim(); + + // 校验attr_values值的合法性 + if (!"0".equals(attrValues) && !"1".equals(attrValues) && !"2".equals(attrValues)) { + throw new YztException("商品属性配置错误,attr_values值必须为0、1或2"); + } + + if ("0".equals(attrValues)) { + continue; + } + + if ((parentLevel == 1 || parentLevel == 2) && ("1".equals(attrValues) || "2".equals(attrValues))) { + String productTypeName = "1".equals(attrValues) ? "加盟店" : "会馆"; + throw new YztException("您的上级等级为" + getLevelName(parentLevel) + ",暂无权限购买" + productTypeName + "商品"); + } + + if (parentLevel == 3 && "2".equals(attrValues)) { + throw new YztException("您的上级等级为加盟店,暂无权限购买会馆商品"); + } + + } + } + + /** + * 获取等级名称 + * + * @param level 等级 + * @return 等级名称 + */ + private String getLevelName(Integer level) { + if (level == null) { + return "未知"; + } + switch (level) { + case 1: + return "普通会员"; + case 2: + return "拼团会员"; + case 3: + return "加盟店"; + case 4: + return "会馆"; + case 5: + return "金奖会馆"; + case 6: + return "成义会馆"; + default: + return "未知等级"; + } + } + + /** + * 创建订单 + * + * @param request 创建订单请求参数 + * @return MyRecord 订单编号 + */ + @Override + public MyRecord createOrder(CreateOrderRequest request) { + User user = userService.getInfoException(); + // 通过缓存获取预下单对象 + String key = "user_order:" + request.getPreOrderNo(); + boolean exists = redisUtil.exists(key); + if (!exists) { + throw new YztException("预下单订单不存在"); + } + String orderVoString = redisUtil.get(key).toString(); + OrderInfoVo orderInfoVo = JSONObject.parseObject(orderVoString, OrderInfoVo.class); + + // 校验商品库存 + List skuRecordList = validateProductStock(orderInfoVo, user); + + // 校验购买限制:根据用户上级等级限制购买特定商品 + if (!Objects.equals(request.getType(), 2)){ + validatePurchaseRestriction(orderInfoVo, user); + } + + // 校验收货信息 + String verifyCode = ""; + String userAddressStr = ""; + if (request.getShippingType() == 1) { // 快递配送 + if (request.getAddressId() <= 0) throw new YztException("请选择收货地址"); + UserAddress userAddress = userAddressService.getById(request.getAddressId()); + if (ObjectUtil.isNull(userAddress) || userAddress.getIsDel()) { + throw new YztException("收货地址有误"); + } + request.setRealName(userAddress.getRealName()); + request.setPhone(userAddress.getPhone()); + userAddressStr = userAddress.getProvince() + userAddress.getCity() + userAddress.getDistrict() + userAddress.getDetail(); + } else if (request.getShippingType() == 2) { // 到店自提 + if (StringUtils.isBlank(request.getRealName()) || StringUtils.isBlank(request.getPhone())) { + throw new YztException("请填写姓名和电话"); + } + // 自提开关是否打开 + String storeSelfMention = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_SELF_MENTION); + if (storeSelfMention.equals("false")) { + throw new YztException("请先联系管理员开启门店自提"); + } + SystemStore systemStore = systemStoreService.getById(request.getStoreId()); + if (ObjectUtil.isNull(systemStore) || systemStore.getIsDel() || !systemStore.getIsShow()) { + throw new YztException("暂无门店无法选择门店自提"); + } + verifyCode = YztUtil.randomCount(1111111111, 999999999) + ""; + userAddressStr = systemStore.getName(); + } + + // 活动商品校验 + // 秒杀 + if (ObjectUtil.isNotNull(orderInfoVo.getSeckillId()) && orderInfoVo.getSeckillId() > 0) { + StoreSeckill storeSeckill = storeSeckillService.getByIdException(orderInfoVo.getSeckillId()); + if (storeSeckill.getStatus().equals(0)) { + throw new YztException("秒杀商品已关闭"); + } + OrderInfoDetailVo detailVo = orderInfoVo.getOrderDetailList().get(0); + StoreProductAttrValue seckillAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailVo.getAttrValueId(), orderInfoVo.getSeckillId(), Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNull(seckillAttrValue)) { + throw new YztException("秒杀商品规格不存在"); + } + commonValidateSeckill(storeSeckill, seckillAttrValue, user, detailVo.getPayNum()); + } + + // 计算订单各种价格 + OrderComputedPriceRequest orderComputedPriceRequest = new OrderComputedPriceRequest(); + orderComputedPriceRequest.setShippingType(request.getShippingType()); + orderComputedPriceRequest.setAddressId(request.getAddressId()); + orderComputedPriceRequest.setCouponId(request.getCouponId()); + orderComputedPriceRequest.setUseIntegral(request.getUseIntegral()); + ComputedOrderPriceResponse computedOrderPriceResponse = computedPrice(orderComputedPriceRequest, orderInfoVo, user); + + // 生成订单号 + String orderNo = YztUtil.getOrderNo("order"); + + // 购买赠送的积分 + int gainIntegral = 0; + List storeOrderInfos = new ArrayList<>(); + for (OrderInfoDetailVo detailVo : orderInfoVo.getOrderDetailList()) { + // ==================== 专属业务代码 ==================== + if (Objects.nonNull(request.getVirtualRemarkList()) && Objects.equals(2,request.getType())) { + Set phoneSet = new HashSet<>(); + for (VirtualRemarkVo vo : request.getVirtualRemarkList()) { + String phone = vo.getPhone(); + if (phone == null || phone.trim().isEmpty()) { + throw new YztException("手机号不能为空"); + } + if (!phoneSet.add(phone)) { + throw new YztException("手机号 " + phone + " 已重复,请勿重复添加参会人"); + } + } + StoreProductAttrValue storeProductAttrValue = storeProductAttrValueService.getById(detailVo.getAttrValueId()); + if (storeProductAttrValue == null) { + throw new YztException("商品规格不存在"); + } + + String attrValue = storeProductAttrValue.getAttrValue(); + + // 【关键修复】声明 perUnitCapacity 变量 + int perUnitCapacity = 1; // 默认每份1人 + + if (!attrValue.isBlank()) { + try { + JSONObject jsonObject = JSONObject.parseObject(attrValue); + if (jsonObject.containsKey("数量")) { + // 获取 "数量" 字段,自动转为 int(支持字符串 "2" → 2) + perUnitCapacity = jsonObject.getIntValue("数量"); + }else { + break; + } + } catch (Exception e) { + throw new YztException("解析商品规格 attrValue 失败: "+ attrValue+ e); + } + + + // 总容量 = 购买数量 × 每份容纳人数 + Integer payNum = detailVo.getPayNum(); + int totalCapacity = (payNum != null && payNum > 0 ? payNum : 1) * perUnitCapacity; + + // 实际提交的人数 + int actualCount = request.getVirtualRemarkList().size(); + + // 校验:实际人数不能超过总容量 + if (actualCount != totalCapacity) { + throw new YztException(String.format("该商品最多可填写 %d 位客户,当前已填写 %d 位", totalCapacity, actualCount)); + } + } + } + // ==================== 专属业务代码 ==================== + // 赠送积分 + if (ObjectUtil.isNotNull(detailVo.getGiveIntegral()) && detailVo.getGiveIntegral() > 0) { + gainIntegral += detailVo.getGiveIntegral() * detailVo.getPayNum(); + } + // 订单详情 + StoreOrderInfo soInfo = new StoreOrderInfo(); + soInfo.setProductId(detailVo.getProductId()); + soInfo.setInfo(JSON.toJSON(detailVo).toString()); + soInfo.setUnique(detailVo.getAttrValueId().toString()); + soInfo.setOrderNo(orderNo); + soInfo.setProductName(detailVo.getProductName()); + soInfo.setAttrValueId(detailVo.getAttrValueId()); + soInfo.setImage(detailVo.getImage()); + soInfo.setSku(detailVo.getSku()); + soInfo.setPrice(detailVo.getPrice()); + soInfo.setPayNum(detailVo.getPayNum()); + soInfo.setWeight(detailVo.getWeight()); + soInfo.setVolume(detailVo.getVolume()); + if (ObjectUtil.isNotNull(detailVo.getGiveIntegral()) && detailVo.getGiveIntegral() > 0) { + soInfo.setGiveIntegral(detailVo.getGiveIntegral()); + } else { + soInfo.setGiveIntegral(0); + } + soInfo.setIsReply(false); + soInfo.setIsSub(detailVo.getIsSub()); + soInfo.setProductType(detailVo.getProductType()); + if (ObjectUtil.isNotNull(detailVo.getVipPrice())) { + soInfo.setVipPrice(detailVo.getVipPrice()); + } else { + soInfo.setVipPrice(detailVo.getPrice()); + } + + storeOrderInfos.add(soInfo); + } + + // 下单赠送积分 + if (computedOrderPriceResponse.getPayFee().compareTo(BigDecimal.ZERO) > 0) { + // 赠送积分比例 + String integralStr = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_INTEGRAL_RATE_ORDER_GIVE); + if (StrUtil.isNotBlank(integralStr)) { + BigDecimal integralBig = new BigDecimal(integralStr); + int integral = integralBig.multiply(computedOrderPriceResponse.getPayFee()).setScale(0, BigDecimal.ROUND_DOWN).intValue(); + if (integral > 0) { + // 添加积分 + gainIntegral += integral; + } + } + } + //虚拟商品备注 + List virtualRemarkList = request.getVirtualRemarkList(); + StoreOrder storeOrder = new StoreOrder(); + storeOrder.setUid(user.getUid()); + storeOrder.setTenantId(user.getTenantId()); + storeOrder.setOrderId(orderNo); + storeOrder.setRealName(request.getRealName()); + storeOrder.setUserPhone(request.getPhone()); + storeOrder.setUserAddress(userAddressStr); + storeOrder.setVirtualRemark(JSON.toJSONString(virtualRemarkList)); + // 如果是自提 + if (request.getShippingType() == 2) { + storeOrder.setVerifyCode(verifyCode); + storeOrder.setStoreId(request.getStoreId()); + } + storeOrder.setTotalNum(orderInfoVo.getOrderProNum()); + // ==================== 禁用优惠券和积分 ==================== + storeOrder.setCouponId(0); // 强制设置优惠券ID为0 + + // 订单总价 + BigDecimal totalPrice = computedOrderPriceResponse.getProTotalFee().add(computedOrderPriceResponse.getFreightFee()); + + storeOrder.setTotalPrice(totalPrice); + storeOrder.setProTotalPrice(computedOrderPriceResponse.getProTotalFee()); + storeOrder.setTotalPostage(computedOrderPriceResponse.getFreightFee()); + storeOrder.setCouponPrice(BigDecimal.ZERO); // 强制设置优惠券金额为0 + storeOrder.setPayPrice(computedOrderPriceResponse.getPayFee()); + storeOrder.setPayPostage(computedOrderPriceResponse.getFreightFee()); +// storeOrder.setDeductionPrice(BigDecimal.ZERO); // 强制设置抵扣金额为0 + storeOrder.setDeductionPrice(computedOrderPriceResponse.getDeductionPrice()); + +// storeOrder.setPayType(request.getPayType()); +// storeOrder.setUseIntegral(0); // 强制设置使用积分为0 + storeOrder.setUseIntegral(computedOrderPriceResponse.getUsedIntegral()); + storeOrder.setGainIntegral(gainIntegral); + // ==================== 禁用优惠券和积分 ==================== + storeOrder.setMark(StringEscapeUtils.escapeHtml4(request.getMark())); + storeOrder.setCombinationId(orderInfoVo.getCombinationId()); + storeOrder.setPinkId(orderInfoVo.getPinkId()); + storeOrder.setSeckillId(orderInfoVo.getSeckillId()); + storeOrder.setBargainId(orderInfoVo.getBargainId()); + storeOrder.setBargainUserId(orderInfoVo.getBargainUserId()); + storeOrder.setCreateTime(YztDateUtil.nowDateTime()); + storeOrder.setShippingType(request.getShippingType()); +// storeOrder.setIsChannel(isChannel); + storeOrder.setPaid(false); + storeOrder.setCost(BigDecimal.ZERO); + storeOrder.setType(0); + if (orderInfoVo.getIsVideo()) { + storeOrder.setType(1);// 视频号订单 + }else if(!Objects.equals(0,request.getType())&&Objects.nonNull(request.getType())){ + storeOrder.setType(request.getType()); + } + + + + // ==================== 优惠券使用逻辑已禁用 ==================== + StoreCouponUser storeCouponUser = new StoreCouponUser(); + /* 原优惠券修改逻辑已注释 + // 优惠券修改 + if (storeOrder.getCouponId() > 0) { + storeCouponUser = storeCouponUserService.getById(storeOrder.getCouponId()); + storeCouponUser.setStatus(1); + } + */ + StoreCouponUser finalStoreCouponUser = storeCouponUser; + // ==================== 优惠券使用逻辑已禁用 ==================== + + Boolean execute = transactionTemplate.execute(e -> { + // 扣减库存 + // 需要根据是否活动商品,扣减不同的库存 + if (storeOrder.getSeckillId() > 0) {// 秒杀扣库存 + MyRecord skuRecord = skuRecordList.get(0); + // 普通商品口库存 + storeProductService.operationStock(skuRecord.getInt("productId"), skuRecord.getInt("num"), "sub", skuRecord.getInt("productVersion")); + // 普通商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("attrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_NORMAL, skuRecord.getInt("attrValueVersion")); + // 秒杀商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("activityAttrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_SECKILL, skuRecord.getInt("activityAttrValueVersion")); + // 秒杀商品扣库存 + storeSeckillService.operationStock(skuRecord.getInt("activityId"), skuRecord.getInt("num"), "sub"); + } else if (storeOrder.getBargainId() > 0) {// 砍价扣库存 + MyRecord skuRecord = skuRecordList.get(0); + // 普通商品口库存 + storeProductService.operationStock(skuRecord.getInt("productId"), skuRecord.getInt("num"), "sub", skuRecord.getInt("productVersion")); + // 普通商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("attrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_NORMAL, skuRecord.getInt("attrValueVersion")); + // 砍价商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("activityAttrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_BARGAIN, skuRecord.getInt("activityAttrValueVersion")); + // 砍价商品扣库存 + storeBargainService.operationStock(skuRecord.getInt("activityId"), skuRecord.getInt("num"), "sub"); + } else if (storeOrder.getCombinationId() > 0) {// 拼团扣库存 + MyRecord skuRecord = skuRecordList.get(0); + // 普通商品口库存 + storeProductService.operationStock(skuRecord.getInt("productId"), skuRecord.getInt("num"), "sub", skuRecord.getInt("productVersion")); + // 普通商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("attrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_NORMAL, skuRecord.getInt("attrValueVersion")); + // 拼团商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("activityAttrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_PINGTUAN, skuRecord.getInt("activityAttrValueVersion")); + // 拼团商品扣库存 + storeCombinationService.operationStock(skuRecord.getInt("activityId"), skuRecord.getInt("num"), "sub"); + } + else { // 普通商品 + for (MyRecord skuRecord : skuRecordList) { + // 普通商品口库存 + storeProductService.operationStock(skuRecord.getInt("productId"), skuRecord.getInt("num"), "sub", skuRecord.getInt("productVersion")); + // 普通商品规格扣库存 + storeProductAttrValueService.operationStock(skuRecord.getInt("attrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_NORMAL, skuRecord.getInt("attrValueVersion")); + } + } + + storeOrderService.create(storeOrder); + storeOrderInfos.forEach(info -> info.setOrderId(storeOrder.getId())); + // ==================== 优惠券修改逻辑已禁用 ==================== + /* 原优惠券修改逻辑已注释 + // 优惠券修改 + if (storeOrder.getCouponId() > 0) { + finalStoreCouponUser.setUpdateTime(DateUtil.date()); + storeCouponUserService.updateById(finalStoreCouponUser); + } + */ + // ==================== 优惠券修改逻辑已禁用 ==================== + // 保存购物车商品详情 + storeOrderInfoService.saveOrderInfos(storeOrderInfos); + // 排队与奖励逻辑改为支付成功后触发,创建订单时不再执行 + // 生成订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_CACHE_CREATE_ORDER, "订单生成"); + + // 保存发票信息 + if (request.getInvoiceInfo() != null && request.getInvoiceInfo().getNeedInvoice()) { + storeOrderInvoiceService.saveOrderInvoice(storeOrder.getOrderId(), request.getInvoiceInfo(), storeOrder.getPayPrice()); + } + + // 清除购物车数据 + if (CollUtil.isNotEmpty(orderInfoVo.getCartIdList())) { + storeCartService.deleteCartByIds(orderInfoVo.getCartIdList()); + } + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("订单生成失败"); + } + + // 删除缓存订单 + if (redisUtil.exists(key)) { + redisUtil.delete(key); + } + + // 加入自动未支付自动取消队列 + redisUtil.lPush(Constants.ORDER_AUTO_CANCEL_KEY, storeOrder.getOrderId()); + + // 发送后台管理员下单提醒通知短信 + sendAdminOrderNotice(storeOrder.getOrderId()); + + // 奖励结算改为支付成功后触发,创建订单时不再执行 + + MyRecord record = new MyRecord(); + record.set("orderNo", storeOrder.getOrderId()); + return record; + } + + /** + * 商品奖励结算方法(会员、加盟店、会馆轮循奖励+上级孵化奖励) + * 规则:乙按下单人上级,每买一次会员类商品就10%、15%、20%、25%轮循;甲作为乙的上级拿到乙实际获得奖励的5%作为孵化奖。 + * @param userId 下单用户uid + * @param storeOrder 订单对象 + */ + public void settleProductReward(Integer userId, StoreOrder storeOrder) { + // 查询下单用户(丙)的上级(乙)ID,若无上级直接不结算 + User user = userService.getById(userId); + if (user == null || user.getSpreadUid() == null || user.getSpreadUid() <= 0) return; + User parent = userService.getById(user.getSpreadUid()); // 乙 + if (parent == null) return; + + // 遍历本订单所有商品明细,对每个商品都分配奖励(每种类型分别结算) + List orderInfos = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + for (StoreOrderInfo orderInfo : orderInfos) { + // 查当前商品属性以获取商品类型(会员、加盟店、会馆属性) + LambdaQueryWrapper attrWrapper = new LambdaQueryWrapper<>(); + attrWrapper.eq(StoreProductAttr::getProductId, orderInfo.getProductId()) + .eq(StoreProductAttr::getType, 0) + .last("limit 1"); + StoreProductAttr productAttr = storeProductAttrService.getOne(attrWrapper); + if (productAttr == null || StrUtil.isBlank(productAttr.getAttrValues())) { + logger.warn("settleProductReward: product {} has no attr config, skip", orderInfo.getProductId()); + continue; + } + + String attrValueStr = productAttr.getAttrValues().trim(); + Integer attrType; + if ("0".equals(attrValueStr)) { + attrType = 0; // 会员商品 + } else if ("1".equals(attrValueStr)) { + attrType = 1; // 加盟店商品 + } else if ("2".equals(attrValueStr)) { + attrType = 2; // 会馆商品 + } else { + logger.warn("settleProductReward: product {} attr_values unknown: {}, skip", orderInfo.getProductId(), attrValueStr); + continue; + } + + BigDecimal price = orderInfo.getPrice(); + + int[] ratios = {10, 15, 20, 25}; // 奖励比例梯度(%) + + int historyCount = userBrokerageRecordService.countByUidAndAttrType(parent.getUid(), attrType); + int index = historyCount % ratios.length; // 计算本次本类型奖励应用第几档比例 + BigDecimal rate = new BigDecimal(ratios[index]).divide(new BigDecimal(100), 4, BigDecimal.ROUND_DOWN); + + BigDecimal reward; + if (attrType != null && attrType == 0) { + // 会员商品按队列单位价格计算次数再发放轮循奖励 + BigDecimal memberUnitPrice = new BigDecimal("900"); + try { + String memberPriceStr = systemConfigService.getValueByKey("queue_unit_price_member"); + if (StrUtil.isNotBlank(memberPriceStr)) memberUnitPrice = new BigDecimal(memberPriceStr.trim()); + } catch (Exception ignore) { + logger.warn("settleProductReward read queue_unit_price_member failed, use default {}", memberUnitPrice); + } + // 每件商品触发的单位数 = price / memberUnitPrice(向下取整),乘以购买数量 + int unitCount = price.divide(memberUnitPrice, 0, BigDecimal.ROUND_DOWN).intValue() * (orderInfo.getPayNum() == null ? 1 : orderInfo.getPayNum()); + if (unitCount <= 0) { + reward = BigDecimal.ZERO; + } else { + reward = memberUnitPrice.multiply(rate).multiply(new BigDecimal(unitCount)).setScale(2, BigDecimal.ROUND_DOWN); + } + } else { + // 加盟店与会馆按件数(价格)计算奖励(原逻辑) + reward = price.multiply(rate).setScale(2, BigDecimal.ROUND_DOWN); + } + + String[] typeLabel = {"会员", "加盟店", "会馆"}; + if (attrType != null && attrType == 0) { + // 会员商品:按单位逐个发放轮循奖励(每个单位一条记录),并为上级的上级发孵化奖 + int unitCount = price.divide(systemConfigService.getValueByKey("queue_unit_price_member") != null && StrUtil.isNotBlank(systemConfigService.getValueByKey("queue_unit_price_member")) ? new BigDecimal(systemConfigService.getValueByKey("queue_unit_price_member").trim()) : new BigDecimal("900"), 0, BigDecimal.ROUND_DOWN).intValue() * (orderInfo.getPayNum() == null ? 1 : orderInfo.getPayNum()); + if (unitCount > 0) { + BigDecimal accumulatedParent = BigDecimal.ZERO; + BigDecimal accumulatedGrandParent = BigDecimal.ZERO; + User grandParent = null; + if (parent.getSpreadUid() != null && parent.getSpreadUid() > 0) { + grandParent = userService.getById(parent.getSpreadUid()); + } + for (int u = 0; u < unitCount; u++) { + int rateIndex = (historyCount + u) % ratios.length; + BigDecimal unitRate = new BigDecimal(ratios[rateIndex]).divide(new BigDecimal(100), 4, BigDecimal.ROUND_DOWN); + BigDecimal unitReward = (systemConfigService.getValueByKey("queue_unit_price_member") != null && StrUtil.isNotBlank(systemConfigService.getValueByKey("queue_unit_price_member")) ? new BigDecimal(systemConfigService.getValueByKey("queue_unit_price_member").trim()) : new BigDecimal("900")).multiply(unitRate).setScale(2, BigDecimal.ROUND_DOWN); + + accumulatedParent = accumulatedParent.add(unitReward); + + UserBrokerageRecord unitRecord = new UserBrokerageRecord(); + unitRecord.setUid(parent.getUid()); + unitRecord.setLinkId(storeOrder.getOrderId()); + unitRecord.setLinkType("sale_reward"); + unitRecord.setType(1); + unitRecord.setTitle(typeLabel[0] + "商品销售奖励"); + unitRecord.setPrice(unitReward); + unitRecord.setBalance((parent.getBrokeragePrice() != null ? parent.getBrokeragePrice() : BigDecimal.ZERO).add(accumulatedParent)); + unitRecord.setMark(typeLabel[0] + "商品,轮循奖励比例:" + ratios[rateIndex] + "%,第" + (historyCount + u + 1) + "次奖励"); + unitRecord.setStatus(1); + unitRecord.setCreateTime(new Date()); + unitRecord.setBrokerageLevel(1); + unitRecord.setAttrType(attrType); + userBrokerageRecordService.save(unitRecord); + + if (grandParent != null && grandParent.getLevel() != 2) { + BigDecimal gpUnit = unitReward.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + accumulatedGrandParent = accumulatedGrandParent.add(gpUnit); + UserBrokerageRecord gpRecord = new UserBrokerageRecord(); + gpRecord.setUid(grandParent.getUid()); + gpRecord.setLinkId(storeOrder.getOrderId()); + gpRecord.setLinkType("incubator_reward"); + gpRecord.setType(1); + gpRecord.setTitle(typeLabel[0] + "商品孵化奖励"); + gpRecord.setPrice(gpUnit); + gpRecord.setBalance((grandParent.getBrokeragePrice() != null ? grandParent.getBrokeragePrice() : BigDecimal.ZERO).add(accumulatedGrandParent)); + gpRecord.setMark(typeLabel[0] + "商品孵化奖励,金额为乙销售奖励5%"); + gpRecord.setStatus(1); + gpRecord.setCreateTime(new Date()); + gpRecord.setBrokerageLevel(2); + gpRecord.setAttrType(attrType); + userBrokerageRecordService.save(gpRecord); + } + } + } + } else { + // 非会员(加盟店/会馆)原逻辑:按 price 计算一条奖励记录 + UserBrokerageRecord yRecord = new UserBrokerageRecord(); + yRecord.setUid(parent.getUid()); + yRecord.setLinkId(storeOrder.getOrderId()); + yRecord.setLinkType("sale_reward"); // 佣金类型:销售奖励 + yRecord.setType(1); + yRecord.setTitle(typeLabel[attrType != null ? attrType : 0] + "商品销售奖励"); + yRecord.setPrice(reward); + yRecord.setBalance((parent.getBrokeragePrice() != null ? parent.getBrokeragePrice() : BigDecimal.ZERO).add(reward)); + yRecord.setMark(typeLabel[attrType != null ? attrType : 0] + "商品,轮循奖励比例:" + ratios[index] + "%,第" + (historyCount+1) + "次奖励"); + yRecord.setStatus(1); + yRecord.setCreateTime(new Date()); + yRecord.setBrokerageLevel(1); + yRecord.setAttrType(attrType); + userBrokerageRecordService.save(yRecord); + + //结算孵化奖(单条) + if (parent.getSpreadUid() != null && parent.getSpreadUid() > 0) { + User grandParent = userService.getById(parent.getSpreadUid()); + if (grandParent != null && grandParent.getLevel() != 2) { + BigDecimal incubatorReward = reward.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); // 孵化奖(5%) + UserBrokerageRecord gpRecord = new UserBrokerageRecord(); + gpRecord.setUid(grandParent.getUid()); + gpRecord.setLinkId(storeOrder.getOrderId()); + gpRecord.setLinkType("incubator_reward"); // 佣金类型:孵化奖 + gpRecord.setType(1); + gpRecord.setTitle(typeLabel[attrType != null ? attrType : 0] + "商品孵化奖励"); + gpRecord.setPrice(incubatorReward); + gpRecord.setBalance((grandParent.getBrokeragePrice() != null ? grandParent.getBrokeragePrice() : BigDecimal.ZERO).add(incubatorReward)); + gpRecord.setMark(typeLabel[attrType != null ? attrType : 0] + "商品孵化奖励,金额为乙销售奖励5%"); + gpRecord.setStatus(1); + gpRecord.setCreateTime(new Date()); + gpRecord.setBrokerageLevel(2); + gpRecord.setAttrType(attrType); + userBrokerageRecordService.save(gpRecord); + } + } + } + } + //销售奖和孵化奖励结算结束后,结算管理奖 + //settleManagementReward(userId, storeOrder); + } + + /** + * 管理奖逻辑:丙下单,乙是丙上级。查询乙和丙的level(1:普通会员;2:拼团会员;3:加盟店;4:会馆;5:金奖会馆;6:成义会馆) + * 满足配置条件的,乙获得丙本单所有商品总金额的一定比例作为管理奖。 + * @param userId 丙uid + * @param storeOrder 订单对象 + */ + private void settleManagementReward(Integer userId, StoreOrder storeOrder) { + //查丙用户和上级乙用户 + User user = userService.getById(userId); + if (user == null || user.getSpreadUid() == null || user.getSpreadUid() <= 0) return; + User parent = userService.getById(user.getSpreadUid()); + if (parent == null) return; + Integer selfLevel = user.getLevel(); + Integer parentLevel = parent.getLevel(); + //乙和丙同级别则无管理奖 + if (parentLevel == null || selfLevel == null || parentLevel.equals(selfLevel)) return; + //匹配等级配置,找管理奖比例 + BigDecimal rate = BigDecimal.ZERO; + if (parentLevel == 3 && (selfLevel == 1 || selfLevel == 2)) rate = new BigDecimal("0.06"); + else if (parentLevel == 4 && (selfLevel == 1 || selfLevel == 2)) rate = new BigDecimal("0.10"); + else if (parentLevel == 4 && selfLevel == 3) rate = new BigDecimal("0.04"); + else if (parentLevel == 5 && (selfLevel == 1 || selfLevel == 2)) rate = new BigDecimal("0.12"); + else if (parentLevel == 5 && selfLevel == 3) rate = new BigDecimal("0.06"); + else if (parentLevel == 5 && selfLevel == 4) rate = new BigDecimal("0.02"); + else if (parentLevel == 6 && (selfLevel == 1 || selfLevel == 2)) rate = new BigDecimal("0.13"); + else if (parentLevel == 6 && selfLevel == 3) rate = new BigDecimal("0.07"); + else if (parentLevel == 6 && selfLevel == 4) rate = new BigDecimal("0.03"); + else if (parentLevel == 6 && selfLevel == 5) rate = new BigDecimal("0.01"); + else return; // 其他组合无管理奖 + //累加订单所有商品的金额 + List orderInfos = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + BigDecimal totalAmount = BigDecimal.ZERO; + for (StoreOrderInfo info : orderInfos) { + if (info.getPrice() != null && info.getPayNum() != null) { + totalAmount = totalAmount.add(info.getPrice().multiply(new BigDecimal(info.getPayNum()))); + } + } + if (totalAmount.compareTo(BigDecimal.ZERO) <= 0) return; + BigDecimal manageReward = totalAmount.multiply(rate).setScale(2, BigDecimal.ROUND_DOWN); + UserBrokerageRecord manageRecord = new UserBrokerageRecord(); + manageRecord.setUid(parent.getUid()); + manageRecord.setLinkId(storeOrder.getOrderId()); + manageRecord.setLinkType("manage_reward"); // 类型区分为管理奖 + manageRecord.setType(1); + manageRecord.setTitle("管理奖收益"); + manageRecord.setPrice(manageReward); + manageRecord.setBalance((parent.getBrokeragePrice() != null ? parent.getBrokeragePrice() : BigDecimal.ZERO).add(manageReward)); + manageRecord.setMark("管理奖|上级等级:" + parentLevel + ",下单者等级:" + selfLevel + ",本单合计:" + totalAmount + ",奖励比例:" + rate.multiply(BigDecimal.valueOf(100)).stripTrailingZeros().toPlainString() + "%"); + manageRecord.setStatus(1); + manageRecord.setCreateTime(new Date()); + manageRecord.setBrokerageLevel(88); // 独立专用 + userBrokerageRecordService.save(manageRecord); + + // 管理奖孵化奖:管理奖获得人的上级再获得其管理奖的 5% + if (parent.getSpreadUid() != null && parent.getSpreadUid() > 0) { + User grandParent = userService.getById(parent.getSpreadUid()); + if (grandParent != null) { + BigDecimal manageIncubatorReward = manageReward.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + if (manageIncubatorReward.compareTo(BigDecimal.ZERO) > 0) { + UserBrokerageRecord manageIncubatorRecord = new UserBrokerageRecord(); + manageIncubatorRecord.setUid(grandParent.getUid()); + manageIncubatorRecord.setLinkId(storeOrder.getOrderId()); + manageIncubatorRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_MANAGE_INCUBATOR_REWARD); + manageIncubatorRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + manageIncubatorRecord.setTitle("管理奖孵化奖收益"); + manageIncubatorRecord.setPrice(manageIncubatorReward); + manageIncubatorRecord.setBalance((grandParent.getBrokeragePrice() != null ? grandParent.getBrokeragePrice() : BigDecimal.ZERO).add(manageIncubatorReward)); + manageIncubatorRecord.setMark("管理奖孵化奖|管理奖获得人等级:" + parentLevel + ",管理奖金额:" + manageReward + ",孵化奖比例:5%"); + manageIncubatorRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE); + manageIncubatorRecord.setCreateTime(new Date()); + manageIncubatorRecord.setBrokerageLevel(89); // 独立专用:管理奖孵化奖 + userBrokerageRecordService.save(manageIncubatorRecord); + } + } + } + } + + /** + * 处理排队免单逻辑 + * @param orderInfoVo 订单信息 + * @param user 用户信息 + * @param orderNo 订单号 + */ + public void processQueueLogic(OrderInfoVo orderInfoVo, User user, String orderNo) { + // 幂等性检查:如果该订单已经有排队记录,则跳过(防止重复生成) + LambdaQueryWrapper checkWrapper = new LambdaQueryWrapper<>(); + checkWrapper.eq(StorePink::getOrderId, orderNo).last("limit 1"); + StorePink existingRecord = storePinkService.getOne(checkWrapper); + if (existingRecord != null) { + logger.warn("processQueueLogic skipped: orderNo={} already has queue records, existing_id={}", orderNo, existingRecord.getId()); + return; + } + logger.info("processQueueLogic executing: orderNo={}, creating new queue records", orderNo); + + String value = systemConfigService.getValueByKey("queue_unit_price_member"); + logger.info("读取到的配置值: [{}]", value); + List queueList = new ArrayList<>(); + Map queueMaxYMap = new HashMap<>(); + try { + logger.info("processQueueLogic start for orderNo={}, userUid={}, detailsCount={}", orderNo, user == null ? null : user.getUid(), + orderInfoVo == null || orderInfoVo.getOrderDetailList() == null ? 0 : orderInfoVo.getOrderDetailList().size()); + } catch (Exception ignore) {} + // 从系统配置读取排队单价,避免在代码中写死 + BigDecimal memberUnitPrice = new BigDecimal("900"); + BigDecimal hallUnitPrice = new BigDecimal("90000"); + try { + String memberPriceStr = systemConfigService.getValueByKey("queue_unit_price_member"); + if (StrUtil.isNotBlank(memberPriceStr)) { + memberUnitPrice = new BigDecimal(memberPriceStr.trim()); + } + } catch (Exception ignore) { + logger.warn("processQueueLogic read queue_unit_price_member failed, use default {}", memberUnitPrice); + } + try { + String hallPriceStr = systemConfigService.getValueByKey("queue_unit_price_hall"); + if (StrUtil.isNotBlank(hallPriceStr)) { + hallUnitPrice = new BigDecimal(hallPriceStr.trim()); + } + } catch (Exception ignore) { + logger.warn("processQueueLogic read queue_unit_price_hall failed, use default {}", hallUnitPrice); + } + + for (OrderInfoDetailVo detail : orderInfoVo.getOrderDetailList()) { + BigDecimal price = detail.getPrice(); + LambdaQueryWrapper attrWrapper = new LambdaQueryWrapper<>(); + attrWrapper.eq(StoreProductAttr::getProductId, detail.getProductId()) + .eq(StoreProductAttr::getType, 0) + .last("limit 1"); + + StoreProductAttr productAttr = storeProductAttrService.getOne(attrWrapper); + if (productAttr == null || StrUtil.isBlank(productAttr.getAttrValues())) { + throw new YztException("商品 " + detail.getProductName() + " 未配置商品排队属性(0/1/2)"); + } + + String attrValue = productAttr.getAttrValues().trim(); + int queueType; + String redisKey; + BigDecimal unitPrice; + + if ("0".equals(attrValue) || "1".equals(attrValue)) { + // 属性值为0或1:进入会员队列 + queueType = 1; + redisKey = "queue:counter:member"; + unitPrice = memberUnitPrice; + } else if ("2".equals(attrValue)) { + queueType = 2; + redisKey = "queue:counter:hall"; + unitPrice = hallUnitPrice; + } else { + throw new YztException("商品 " + detail.getProductName() + " 排队属性值异常:" + attrValue); + } + if (price.remainder(unitPrice).compareTo(BigDecimal.ZERO) != 0) { + throw new YztException("商品 " + detail.getProductName() + " 价格不符合排队规则"); + } + + int count = price.divide(unitPrice).intValue() * detail.getPayNum(); + + logger.debug("Processing queue items: orderNo={}, productId={}, price={}, unitPrice={}, count={}", + orderNo, detail.getProductId(), price, unitPrice, count); + for (int i = 0; i < count; i++) { + long currentQueueNo = redisUtil.incr(redisKey, 1); + queueMaxYMap.put(queueType, (int) currentQueueNo); + + StorePink queueItem = new StorePink(); + + queueItem.setUid(user.getUid()); + queueItem.setNickname(user.getNickname()); + queueItem.setAvatar(user.getAvatar()); + + queueItem.setOrderId(orderNo); + try { + queueItem.setOrderIdKey(Integer.valueOf(orderNo)); + } catch (Exception e) { + queueItem.setOrderIdKey(0); + } + + queueItem.setPid(detail.getProductId()); + queueItem.setCid(0); + queueItem.setTotalNum(1); + queueItem.setPrice(unitPrice); + queueItem.setTotalPrice(unitPrice); + + queueItem.setPeople(1); + queueItem.setKId(0); + queueItem.setStatus(1); + queueItem.setAddTime(System.currentTimeMillis() / 1000); + queueItem.setStopTime(0L); + + queueItem.setIsTpl(false); + queueItem.setIsRefund(false); + queueItem.setIs_virtual(false); + + queueItem.setQueueType(queueType); + queueItem.setQueueNo((int) currentQueueNo); + + // 生成排队码编号:年月日时分秒+六位随机数 + String queueCode = generateQueueCode(queueItem.getAddTime()); + queueItem.setQueueCode(queueCode); + + queueList.add(queueItem); + } + logger.debug("Queue items created: orderNo={}, count={}", orderNo, queueList.size()); + } + + if (!queueList.isEmpty()) { + // 验证queueList中所有记录的price是否正确(防止异常数据) + for (StorePink item : queueList) { + logger.info("BEFORE SAVE: orderNo={}, id={}, price={}, totalPrice={}, queueNo={}", + orderNo, item.getId(), item.getPrice(), item.getTotalPrice(), item.getQueueNo()); + if (!item.getPrice().equals(memberUnitPrice) && !item.getPrice().equals(hallUnitPrice)) { + logger.error("CRITICAL: Invalid price detected! orderNo={}, price={}, expected={} or {}", + orderNo, item.getPrice(), memberUnitPrice, hallUnitPrice); + throw new YztException("排队记录价格异常:" + item.getPrice()); + } + } + + storePinkService.saveBatch(queueList); + logger.info("AFTER SAVE: orderNo={}, saved {} records", orderNo, queueList.size()); + + for (Map.Entry entry : queueMaxYMap.entrySet()) { + Integer type = entry.getKey(); // 队列类型 + Integer maxY = entry.getValue(); // 该队列产生的最大Y值 + updateAllQueueProgress(type, maxY); + } + } + } + + /** + * 余额支付成功后统一处理:排队免单逻辑、管理奖、更新队列进度及商品奖励结算 + * 该方法会被支付模块在余额支付成功后同步调用,便于不依赖外部定时任务。 + */ + public void handlePostPay(StoreOrder storeOrder) { + if (storeOrder == null) return; + try { + logger.info("handlePostPay start for orderNo={}, uid={}", storeOrder == null ? null : storeOrder.getOrderId(), storeOrder == null ? null : storeOrder.getUid()); + } catch (Exception ignore) {} + try { + User user = userService.getById(storeOrder.getUid()); + if (user == null) { + logger.warn("handlePostPay user not found for orderId={}", storeOrder.getOrderId()); + return; + } + + // 构建 OrderInfoVo(与支付后原先逻辑一致) + List orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + OrderInfoVo orderInfoVo = new OrderInfoVo(); + List detailList = CollUtil.newArrayList(); + for (StoreOrderInfo orderInfo : orderInfoList) { + OrderInfoDetailVo detail = new OrderInfoDetailVo(); + detail.setProductId(orderInfo.getProductId()); + detail.setProductName(orderInfo.getProductName()); + detail.setAttrValueId(orderInfo.getAttrValueId()); + detail.setImage(orderInfo.getImage()); + detail.setSku(orderInfo.getSku()); + detail.setPrice(orderInfo.getPrice()); + detail.setPayNum(orderInfo.getPayNum()); + detail.setWeight(orderInfo.getWeight()); + detail.setVolume(orderInfo.getVolume()); + detail.setGiveIntegral(orderInfo.getGiveIntegral()); + detail.setIsReply(orderInfo.getIsReply() != null && orderInfo.getIsReply() ? 1 : 0); + detail.setIsSub(orderInfo.getIsSub()); + detail.setVipPrice(orderInfo.getVipPrice()); + detail.setProductType(orderInfo.getProductType()); + detailList.add(detail); + } + orderInfoVo.setOrderDetailList(detailList); + + // 1) 排队免单逻辑(会生成 fw_store_pink 条目,使用 unitPrice = 900) + try { + logger.info("handlePostPay calling processQueueLogic for orderNo={}", storeOrder.getOrderId()); + processQueueLogic(orderInfoVo, user, storeOrder.getOrderId()); + } catch (Exception e) { + logger.error("handlePostPay processQueueLogic failed for orderNo={}", storeOrder.getOrderId(), e); + } + + // 2) 管理奖逻辑(与排队无关,基于订单和用户) + try { + logger.info("handlePostPay calling settleManagementReward for orderNo={}", storeOrder.getOrderId()); + settleManagementReward(user.getUid(), storeOrder); + } catch (Exception e) { + logger.error("handlePostPay settleManagementReward failed for orderNo={}", storeOrder.getOrderId(), e); + } + + // 3) 商品奖励结算(轮循奖励、孵化等) + try { + logger.info("handlePostPay calling settleProductReward for orderNo={}", storeOrder.getOrderId()); + settleProductReward(user.getUid(), storeOrder); + } catch (Exception e) { + logger.error("handlePostPay settleProductReward failed for orderNo={}", storeOrder.getOrderId(), e); + } + + } catch (Exception ex) { + logger.error("handlePostPay unexpected error for orderId=" + (storeOrder == null ? "null" : storeOrder.getOrderId()), ex); + } + } + + /** + * 更新队列中所有人的进度,并处理免单 + * 触发时机:有新人(Y)入队后 + * @param queueType 队列类型 (1会员 2会馆) + * @param currentY 当前最新产生的排队号 (Y) + */ + private void updateAllQueueProgress(int queueType, int currentY) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StorePink::getQueueType, queueType) + .eq(StorePink::getStatus, 1) + .eq(StorePink::getIsRefund, false); + + List waitingList = storePinkService.list(wrapper); + + if (CollUtil.isEmpty(waitingList)) { + return; + } + + List updates = new ArrayList<>(); + + for (StorePink xUser : waitingList) { + int x = xUser.getQueueNo(); + if (x >= currentY) continue; + + BigDecimal numerator = new BigDecimal(currentY - x); // 分子 = Y - X + BigDecimal denominator = new BigDecimal(3 * x + 1); // 分母 = 3X + 1 + + if (numerator.compareTo(denominator) >= 0) { + xUser.setQueueProgress(BigDecimal.ONE); + xUser.setStatus(2); + xUser.setIsRefund(true); + + // 注释掉订单已完成的特殊处理,统一走待释放流程 + // LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + // orderWrapper.eq(StoreOrder::getOrderId, xUser.getOrderId()).last("limit 1"); + // StoreOrder order = storeOrderService.getOne(orderWrapper); + BigDecimal recordPrice = xUser.getPrice(); + // if (order != null && order.getStatus() == 3) { + // // 订单已完成:增加余额,写入账单和佣金记录 + // User queueUser = userService.getById(xUser.getUid()); + // if (queueUser != null && recordPrice.compareTo(BigDecimal.ZERO) > 0) { + // // 1. 增加用户余额 + // userService.operationNowMoney(queueUser.getUid(), recordPrice, queueUser.getNowMoney(), "add"); + // + // // 2. 写入账单表 + // UserBill userBill = new UserBill(); + // userBill.setUid(queueUser.getUid()); + // userBill.setLinkId(xUser.getOrderId()); + // userBill.setTitle("排队免单收益"); + // userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + // userBill.setType("queue_reward"); + // userBill.setPm(1); + // userBill.setNumber(recordPrice); + // userBill.setBalance(queueUser.getNowMoney().add(recordPrice)); + // userBill.setMark("排队免单成功(订单已完成),排队号:" + xUser.getQueueNo()); + // userBill.setStatus(1); + // userBill.setCreateTime(YztDateUtil.nowDateTime()); + // userBillService.save(userBill); + // + // // 3. 写入佣金记录表 + // UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + // brokerageRecord.setUid(queueUser.getUid()); + // brokerageRecord.setLinkId(xUser.getOrderId()); + // brokerageRecord.setLinkType("queue"); + // brokerageRecord.setType(1); + // brokerageRecord.setTitle("排队免单收益"); + // brokerageRecord.setPrice(recordPrice); + // brokerageRecord.setBalance(queueUser.getNowMoney().add(recordPrice)); + // brokerageRecord.setMark("排队免单成功(订单已完成),排队号:" + xUser.getQueueNo()); + // brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + // brokerageRecord.setCreateTime(new Date()); + // brokerageRecord.setBrokerageLevel(0); + // userBrokerageRecordService.save(brokerageRecord); + // + // // 丙的上级获得免单孵化奖 + // if (queueUser.getSpreadUid() != null && queueUser.getSpreadUid() > 0) { + // User parent = userService.getById(queueUser.getSpreadUid()); + // // 自身等级为2(拼团会员)时,不获得孵化奖 + // if (parent != null && parent.getLevel() != 2) { + // // 计算孵化奖金额为免单收益的5% + // BigDecimal incubatorPrize = recordPrice.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + // // 构造孵化奖佣金明细 + // UserBrokerageRecord incubatorRecord = new UserBrokerageRecord(); + // incubatorRecord.setUid(parent.getUid()); + // incubatorRecord.setLinkId(xUser.getOrderId()); + // incubatorRecord.setLinkType("queue_incubator"); // 标记类型为排队孵化奖 + // incubatorRecord.setType(1); + // incubatorRecord.setTitle("排队免单孵化奖励"); + // incubatorRecord.setPrice(incubatorPrize); // 奖励金额5% + // incubatorRecord.setBalance(BigDecimal.ZERO); + // incubatorRecord.setMark("我是" + queueUser.getNickname() + "的上级,获得其免单金额5%(" + incubatorPrize + ")的免单孵化奖"); + // incubatorRecord.setStatus(1); + // incubatorRecord.setCreateTime(new Date()); + // incubatorRecord.setBrokerageLevel(1); + // userBrokerageRecordService.save(incubatorRecord); // 写入孵化奖佣金明细 + // } + // } + // } + // + // } else { + //丙获得排队免单收益 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(xUser.getUid()); // 丙id + brokerageRecord.setLinkId(xUser.getOrderId()); + brokerageRecord.setLinkType("queue"); + brokerageRecord.setType(1); + brokerageRecord.setTitle("排队免单收益"); + brokerageRecord.setPrice(recordPrice); + brokerageRecord.setBalance(BigDecimal.ZERO); + brokerageRecord.setMark("排队免单成功(订单未完成),排队号:" + x); + brokerageRecord.setStatus(1); + brokerageRecord.setCreateTime(new Date()); + brokerageRecord.setBrokerageLevel(0); + userBrokerageRecordService.save(brokerageRecord); + + //丙的上级获得免单孵化奖 + User user = userService.getById(xUser.getUid()); + if (user != null && user.getSpreadUid() != null && user.getSpreadUid() > 0) { + User parent = userService.getById(user.getSpreadUid()); + // 自身等级为2(拼团会员)时,不获得孵化奖 + if (parent != null && parent.getLevel() != 2) { + // 计算孵化奖金额为免单收益的5% + BigDecimal incubatorPrize = recordPrice.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + // 构造孵化奖佣金明细 + UserBrokerageRecord incubatorRecord = new UserBrokerageRecord(); + incubatorRecord.setUid(parent.getUid()); + incubatorRecord.setLinkId(xUser.getOrderId()); + incubatorRecord.setLinkType("queue_incubator"); // 标记类型为排队孵化奖 + incubatorRecord.setType(1); + incubatorRecord.setTitle("排队免单孵化奖励"); + incubatorRecord.setPrice(incubatorPrize); // 奖励金额5% + incubatorRecord.setBalance(BigDecimal.ZERO); + incubatorRecord.setMark("我是" + user.getNickname() + "的上级,获得其免单金额5%(" + incubatorPrize + ")的免单孵化奖"); + incubatorRecord.setStatus(1); + incubatorRecord.setCreateTime(new Date()); + incubatorRecord.setBrokerageLevel(1); + userBrokerageRecordService.save(incubatorRecord); // 写入孵化奖佣金明细 + } + } + // } + } else { + BigDecimal progress = numerator.divide(denominator, 6, BigDecimal.ROUND_DOWN); + xUser.setQueueProgress(progress); + } + + updates.add(xUser); + } + + if (!updates.isEmpty()) { + storePinkService.updateBatchById(updates); + } + } + + /** + * 获取支付配置 + * + * @return PreOrderResponse + */ + @Override + public PreOrderResponse getPayConfig() { + PreOrderResponse preOrderResponse = new PreOrderResponse(); + String payWeixinOpen = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_PAY_WEIXIN_OPEN); + String yuePayStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_YUE_PAY_STATUS);// 1开启 2关闭 + String storeSelfMention = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_STORE_SELF_MENTION); + String aliPayStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_ALI_PAY_STATUS);// 1开启 + preOrderResponse.setYuePayStatus(yuePayStatus); + preOrderResponse.setPayWeixinOpen(payWeixinOpen); + preOrderResponse.setStoreSelfMention(storeSelfMention); + preOrderResponse.setAliPayStatus(aliPayStatus); + return preOrderResponse; + } + + /** + * 校验商品库存(生成订单) + * + * @param orderInfoVo 订单详情Vo + * @return List + * skuRecord 扣减库存对象 + * ——activityId 活动商品id + * ——activityAttrValueId 活动商品skuId + * ——productId 普通(主)商品id + * ——attrValueId 普通(主)商品skuId + * ——num 购买数量 + */ + private List validateProductStock(OrderInfoVo orderInfoVo, User user) { + List recordList = CollUtil.newArrayList(); + if (orderInfoVo.getSeckillId() > 0) { + // 秒杀部分判断 + Integer seckillId = orderInfoVo.getSeckillId(); + OrderInfoDetailVo detailVo = orderInfoVo.getOrderDetailList().get(0); + StoreSeckill storeSeckill = storeSeckillService.getByIdException(seckillId); + StoreProductAttrValue seckillAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailVo.getAttrValueId(), seckillId, Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNull(seckillAttrValue)) { + throw new YztException("秒杀商品规格不存在"); + } + MyRecord seckillRecord = commonValidateSeckill(storeSeckill, seckillAttrValue, user, detailVo.getPayNum()); + // 主商品sku + StoreProductAttrValue productAttrValue = seckillRecord.get("productAttrValue"); + StoreProduct product = seckillRecord.get("product"); + + MyRecord record = new MyRecord(); + record.set("activityId", seckillId); + record.set("activityAttrValueId", seckillAttrValue.getId()); + record.set("activityAttrValueVersion", seckillAttrValue.getVersion()); + record.set("productId", storeSeckill.getProductId()); + record.set("productVersion", product.getVersion()); + record.set("attrValueId", productAttrValue.getId()); + record.set("attrValueVersion", productAttrValue.getVersion()); + record.set("num", detailVo.getPayNum()); + recordList.add(record); + return recordList; + } + if (orderInfoVo.getBargainId() > 0) { + // 砍价部分判断 + Integer bargainId = orderInfoVo.getBargainId(); + OrderInfoDetailVo detailVo = orderInfoVo.getOrderDetailList().get(0); + StoreBargain storeBargain = storeBargainService.getByIdException(bargainId); + if (storeBargain.getStock().equals(0) || detailVo.getPayNum() > storeBargain.getStock()) { + throw new YztException("砍价商品库存不足"); + } + StoreProductAttrValue bargainAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailVo.getAttrValueId(), bargainId, Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNull(bargainAttrValue)) { + throw new YztException("砍价商品规格不存在"); + } + MyRecord bargainRecord = commonValidateBargain(storeBargain, bargainAttrValue, orderInfoVo.getBargainUserId(), user, detailVo.getPayNum()); + StoreProductAttrValue productAttrValue = bargainRecord.get("productAttrValue"); + StoreProduct product = bargainRecord.get("product"); + + MyRecord record = new MyRecord(); + record.set("activityId", bargainId); + record.set("activityAttrValueId", bargainAttrValue.getId()); + record.set("activityAttrValueVersion", bargainAttrValue.getVersion()); + record.set("productId", storeBargain.getProductId()); + record.set("productVersion", product.getVersion()); + record.set("attrValueId", productAttrValue.getId()); + record.set("attrValueVersion", productAttrValue.getVersion()); + record.set("num", detailVo.getPayNum()); + recordList.add(record); + return recordList; + } + if (orderInfoVo.getCombinationId() > 0) { + // 拼团部分判断 + Integer combinationId = orderInfoVo.getCombinationId(); + OrderInfoDetailVo detailVo = orderInfoVo.getOrderDetailList().get(0); + StoreCombination storeCombination = storeCombinationService.getByIdException(combinationId); + StoreProductAttrValue combinationAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailVo.getAttrValueId(), combinationId, Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNull(combinationAttrValue)) { + throw new YztException("拼团商品规格不存在"); + } + MyRecord combinationRecord = commonValidateCombination(storeCombination, combinationAttrValue, user, detailVo.getPayNum()); + StoreProductAttrValue productAttrValue = combinationRecord.get("productAttrValue"); + StoreProduct product = combinationRecord.get("product"); + + MyRecord record = new MyRecord(); + record.set("activityId", combinationId); + record.set("activityAttrValueId", combinationAttrValue.getId()); + record.set("activityAttrValueVersion", combinationAttrValue.getVersion()); + record.set("productId", storeCombination.getProductId()); + record.set("productVersion", product.getVersion()); + record.set("attrValueId", productAttrValue.getId()); + record.set("attrValueVersion", productAttrValue.getVersion()); + record.set("num", detailVo.getPayNum()); + recordList.add(record); + return recordList; + } + + // 普通商品 + List orderDetailList = orderInfoVo.getOrderDetailList(); + orderDetailList.forEach(e -> { + // 查询商品信息 + StoreProduct storeProduct = storeProductService.getById(e.getProductId()); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("购买的商品信息不存在"); + } + if (storeProduct.getIsDel()) { + throw new YztException("购买的商品已删除"); + } + if (!storeProduct.getIsShow()) { + throw new YztException("购买的商品已下架"); + } + if (storeProduct.getStock().equals(0) || e.getPayNum() > storeProduct.getStock()) { + throw new YztException("购买的商品库存不足"); + } + // 查询商品规格属性值信息 + StoreProductAttrValue attrValue = attrValueService.getByIdAndProductIdAndType(e.getAttrValueId(), e.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(attrValue)) { + throw new YztException("购买的商品规格信息不存在"); + } + if (attrValue.getStock() < e.getPayNum()) { + throw new YztException("购买的商品库存不足"); + } + MyRecord record = new MyRecord(); + record.set("productId", e.getProductId()); + record.set("num", e.getPayNum()); + record.set("attrValueId", e.getAttrValueId()); + record.set("productVersion", storeProduct.getVersion()); + record.set("attrValueVersion", attrValue.getVersion()); + recordList.add(record); + }); + return recordList; + } + + + /** + * 校验预下单商品信息 + * + * @param request 预下单请求参数 + * @return OrderInfoVo + */ + private OrderInfoVo validatePreOrderRequest(PreOrderRequest request, User user) { + OrderInfoVo orderInfoVo = new OrderInfoVo(); + List detailVoList = CollUtil.newArrayList(); + if (request.getPreOrderType().equals("shoppingCart")) {// 购物车购买 + detailVoList = validatePreOrderShopping(request, user); + List cartIdList = request.getOrderDetails().stream().map(PreOrderDetailRequest::getShoppingCartId).distinct().collect(Collectors.toList()); + orderInfoVo.setCartIdList(cartIdList); + } + if (request.getPreOrderType().equals("buyNow")) {// 立即购买 + // 立即购买只会有一条详情 + PreOrderDetailRequest detailRequest = request.getOrderDetails().get(0); + if (detailRequest.getSeckillId() > 0) {// 秒杀 + detailVoList.add(validatePreOrderSeckill(detailRequest, user)); + orderInfoVo.setSeckillId(detailRequest.getSeckillId()); + } else if (detailRequest.getBargainId() > 0) {// 砍价 + detailVoList.add(validatePreOrderBargain(detailRequest, user)); + orderInfoVo.setBargainId(detailRequest.getBargainId()); + orderInfoVo.setBargainUserId(detailRequest.getBargainUserId()); + } else if (detailRequest.getCombinationId() > 0) {// 拼团 + detailVoList.add(validatePreOrderCombination(detailRequest, user)); + orderInfoVo.setCombinationId(detailRequest.getCombinationId()); + orderInfoVo.setPinkId(detailRequest.getPinkId()); + } else { + // 普通商品 + if (ObjectUtil.isNull(detailRequest.getProductId())) { + throw new YztException("商品编号不能为空"); + } + if (ObjectUtil.isNull(detailRequest.getAttrValueId())) { + throw new YztException("商品规格属性值不能为空"); + } + if (ObjectUtil.isNull(detailRequest.getProductNum()) || detailRequest.getProductNum() < 0) { + throw new YztException("购买数量必须大于0"); + } + // 查询商品信息 + StoreProduct storeProduct = storeProductService.getById(detailRequest.getProductId()); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("商品信息不存在,请刷新后重新选择"); + } + if (storeProduct.getIsDel()) { + throw new YztException("商品已删除,请刷新后重新选择"); + } + if (!storeProduct.getIsShow()) { + throw new YztException("商品已下架,请刷新后重新选择"); + } + if (storeProduct.getStock() < detailRequest.getProductNum()) { + throw new YztException("商品库存不足,请刷新后重新选择"); + } + // 查询商品规格属性值信息 + StoreProductAttrValue attrValue = attrValueService.getByIdAndProductIdAndType(detailRequest.getAttrValueId(), detailRequest.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(attrValue)) { + throw new YztException("商品规格信息不存在,请刷新后重新选择"); + } + if (attrValue.getStock() < detailRequest.getProductNum()) { + throw new YztException("商品规格库存不足,请刷新后重新选择"); + } + SystemUserLevel userLevel = null; + if (user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + OrderInfoDetailVo detailVo = new OrderInfoDetailVo(); + detailVo.setProductId(storeProduct.getId()); + detailVo.setProductName(storeProduct.getStoreName()); + detailVo.setAttrValueId(attrValue.getId()); + detailVo.setSku(attrValue.getSuk()); + detailVo.setPrice(attrValue.getPrice()); + detailVo.setPayNum(detailRequest.getProductNum()); + detailVo.setImage(StrUtil.isNotBlank(attrValue.getImage()) ? attrValue.getImage() : storeProduct.getImage()); + detailVo.setVolume(attrValue.getVolume()); + detailVo.setWeight(attrValue.getWeight()); + detailVo.setTempId(storeProduct.getTempId()); + detailVo.setIsSub(storeProduct.getIsSub()); + detailVo.setProductType(Constants.PRODUCT_TYPE_NORMAL); + detailVo.setVipPrice(detailVo.getPrice()); + if (ObjectUtil.isNotNull(userLevel)) { + BigDecimal vipPrice = detailVo.getPrice().multiply(new BigDecimal(userLevel.getDiscount())).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP); + detailVo.setVipPrice(vipPrice); + } + detailVo.setGiveIntegral(storeProduct.getGiveIntegral()); + detailVoList.add(detailVo); + } + } + if (request.getPreOrderType().equals("again")) {// 再次购买 + PreOrderDetailRequest detailRequest = request.getOrderDetails().get(0); + detailVoList = validatePreOrderAgain(detailRequest, user); + } + orderInfoVo.setOrderDetailList(detailVoList); + return orderInfoVo; + } + + /** + * 购物车预下单校验 + * + * @param request 请求参数 + * @param user 用户 + * @return List + */ + private List validatePreOrderShopping(PreOrderRequest request, User user) { + List detailVoList = CollUtil.newArrayList(); + SystemUserLevel userLevel = null; + if (user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + SystemUserLevel finalUserLevel = userLevel; + request.getOrderDetails().forEach(e -> { + if (ObjectUtil.isNull(e.getShoppingCartId())) { + throw new YztException("购物车编号不能为空"); + } + StoreCart storeCart = storeCartService.getByIdAndUid(e.getShoppingCartId(), user.getUid()); + if (ObjectUtil.isNull(storeCart)) { + throw new YztException("未找到对应的购物车信息"); + } + // 查询商品信息 + StoreProduct storeProduct = storeProductService.getById(storeCart.getProductId()); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("商品信息不存在,请刷新后重新选择"); + } + if (storeProduct.getIsDel()) { + throw new YztException("商品已删除,请刷新后重新选择"); + } + if (!storeProduct.getIsShow()) { + throw new YztException("商品已下架,请刷新后重新选择"); + } + if (storeProduct.getStock() < storeCart.getCartNum()) { + throw new YztException("商品库存不足,请刷新后重新选择"); + } + // 查询商品规格属性值信息 + StoreProductAttrValue attrValue = attrValueService.getByIdAndProductIdAndType(Integer.valueOf(storeCart.getProductAttrUnique()), storeCart.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(attrValue)) { + throw new YztException("商品规格信息不存在,请刷新后重新选择"); + } + if (attrValue.getStock() < storeCart.getCartNum()) { + throw new YztException("商品规格库存不足,请刷新后重新选择"); + } + OrderInfoDetailVo detailVo = new OrderInfoDetailVo(); + detailVo.setProductId(storeProduct.getId()); + detailVo.setProductName(storeProduct.getStoreName()); + detailVo.setAttrValueId(attrValue.getId()); + detailVo.setSku(attrValue.getSuk()); + detailVo.setPrice(attrValue.getPrice()); + detailVo.setPayNum(storeCart.getCartNum()); + detailVo.setImage(StrUtil.isNotBlank(attrValue.getImage()) ? attrValue.getImage() : storeProduct.getImage()); + detailVo.setVolume(attrValue.getVolume()); + detailVo.setWeight(attrValue.getWeight()); + detailVo.setTempId(storeProduct.getTempId()); + detailVo.setGiveIntegral(storeProduct.getGiveIntegral()); + detailVo.setIsSub(storeProduct.getIsSub()); + detailVo.setProductType(Constants.PRODUCT_TYPE_NORMAL); + detailVo.setVipPrice(detailVo.getPrice()); + if (ObjectUtil.isNotNull(finalUserLevel)) { + BigDecimal vipPrice = detailVo.getPrice().multiply(new BigDecimal(finalUserLevel.getDiscount())).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP); + detailVo.setVipPrice(vipPrice); + } + detailVoList.add(detailVo); + }); + return detailVoList; + } + + /** + * 秒杀预下单校验 + * + * @param detailRequest 请求参数 + * @param user 用户 + * @return OrderInfoDetailVo + */ + private OrderInfoDetailVo validatePreOrderSeckill(PreOrderDetailRequest detailRequest, User user) { + Integer seckillId = detailRequest.getSeckillId(); + StoreSeckill storeSeckill = storeSeckillService.getByIdException(seckillId); + if (storeSeckill.getStatus().equals(0)) { + throw new YztException("秒杀商品已关闭"); + } + StoreProductAttrValue seckillAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailRequest.getAttrValueId(), seckillId, Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNull(seckillAttrValue)) { + throw new YztException("秒杀商品规格不存在"); + } + commonValidateSeckill(storeSeckill, seckillAttrValue, user, detailRequest.getProductNum()); + + OrderInfoDetailVo detailVo = new OrderInfoDetailVo(); + detailVo.setProductId(storeSeckill.getProductId()); + detailVo.setProductName(storeSeckill.getTitle()); + detailVo.setAttrValueId(seckillAttrValue.getId()); + detailVo.setSku(seckillAttrValue.getSuk()); + detailVo.setPrice(seckillAttrValue.getPrice()); + detailVo.setPayNum(detailRequest.getProductNum()); + detailVo.setImage(StrUtil.isNotBlank(seckillAttrValue.getImage()) ? seckillAttrValue.getImage() : storeSeckill.getImage()); + detailVo.setVolume(seckillAttrValue.getVolume()); + detailVo.setWeight(seckillAttrValue.getWeight()); + detailVo.setTempId(storeSeckill.getTempId()); + detailVo.setProductType(Constants.PRODUCT_TYPE_SECKILL); + return detailVo; + } + + /** + * 公共校验秒杀 + * + * @param storeSeckill 秒杀商品 + * @param seckillAttrValue 秒杀商品规格属性 + * @param user 用户 + * @return MyRecord + */ + private MyRecord commonValidateSeckill(StoreSeckill storeSeckill, StoreProductAttrValue seckillAttrValue, User user, Integer productNum) { + if (storeSeckill.getStock().equals(0) || productNum > storeSeckill.getStock()) { + throw new YztException("秒杀商品库存不足"); + } + if (seckillAttrValue.getStock() <= 0 || seckillAttrValue.getQuota() <= 0 || productNum > seckillAttrValue.getStock()) { + throw new YztException("秒杀商品规格库存不足"); + } + // 普通商品部分判断 + StoreProduct product = storeProductService.getById(storeSeckill.getProductId()); + if (ObjectUtil.isNull(product) || product.getIsDel()) { + throw new YztException("秒杀主商品不存在"); + } + if (product.getStock().equals(0) || productNum > product.getStock()) { + throw new YztException("秒杀主商品库存不足"); + } + // 主商品sku + StoreProductAttrValue productAttrValue = storeProductAttrValueService.getByProductIdAndSkuAndType(storeSeckill.getProductId(), seckillAttrValue.getSuk(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(productAttrValue)) { + throw new YztException("秒杀主商品规格不存在"); + } + if (productAttrValue.getStock() <= 0 || productNum > productAttrValue.getStock()) { + throw new YztException("秒杀主商品规格库存不足"); + } + + // 判断秒杀是否过期 1:日期是否在范围内 2:时间是否在每天的时间段内 + StoreSeckillManger seckillManger = storeSeckillMangerService.getById(storeSeckill.getTimeId()); + if (ObjectUtil.isNull(seckillManger)) { + throw new YztException("秒杀时段不存在"); + } + // 判断日期是否过期 + DateTime nowDateTime = DateUtil.date(); + String stopTimeStr = YztDateUtil.dateToStr(storeSeckill.getStopTime(), Constants.DATE_FORMAT_DATE); + Date stopDate = YztDateUtil.strToDate(stopTimeStr + " " + seckillManger.getEndTime() + ":00:00", Constants.DATE_FORMAT); + if (nowDateTime.getTime() - stopDate.getTime() >= 0) { + throw new YztException("秒杀商品已过期"); + } + // 判断是否在秒杀时段内(小时),秒杀开始时间 <= 当前时间 <= 秒杀结束时间 + int hour = nowDateTime.getField(Calendar.HOUR_OF_DAY);// 现在的小时 + if (seckillManger.getStartTime() > hour || seckillManger.getEndTime() < hour) { + throw new YztException("秒杀商品已过期"); + } + + // 判断秒杀购买次数 + // 当天参与活动次数 -根据用户和秒杀信息查询当天订单判断订单数量 + List userCurrentDaySecKillOrders = storeOrderService.getUserCurrentDaySecKillOrders(user.getUid(), storeSeckill.getId()); + if (CollUtil.isNotEmpty(userCurrentDaySecKillOrders)) { + // 判断是否有待支付订单 + List unPayOrders = userCurrentDaySecKillOrders.stream().filter(e -> !e.getPaid()).collect(Collectors.toList()); + if (unPayOrders.size() > 0) { + throw new YztException("您有秒杀待支付订单,请支付后再购买"); + } + + // 判断是否达到上限 + if (userCurrentDaySecKillOrders.size() >= storeSeckill.getNum()) { + throw new YztException("您已经达到当前秒杀活动上限"); + } + } + + MyRecord record = new MyRecord(); + record.set("productAttrValue", productAttrValue); + record.set("product", product); + return record; + } + + /** + * 砍价预下单校验 + * + * @param detailRequest 请求参数 + * @param user 用户 + * @return OrderInfoDetailVo + */ + private OrderInfoDetailVo validatePreOrderBargain(PreOrderDetailRequest detailRequest, User user) { + if (detailRequest.getBargainUserId() <= 0) { + throw new YztException("用户砍价活动id必须大于0"); + } + // 砍价部分判断 + Integer bargainId = detailRequest.getBargainId(); + StoreBargain storeBargain = storeBargainService.getByIdException(bargainId); + StoreProductAttrValue bargainAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailRequest.getAttrValueId(), bargainId, Constants.PRODUCT_TYPE_BARGAIN); + if (ObjectUtil.isNull(bargainAttrValue)) { + throw new YztException("砍价商品规格不存在"); + } + commonValidateBargain(storeBargain, bargainAttrValue, detailRequest.getBargainUserId(), user, detailRequest.getProductNum()); + + + OrderInfoDetailVo detailVo = new OrderInfoDetailVo(); + detailVo.setProductId(storeBargain.getProductId()); + detailVo.setProductName(storeBargain.getTitle()); + detailVo.setAttrValueId(bargainAttrValue.getId()); + detailVo.setSku(bargainAttrValue.getSuk()); + detailVo.setPrice(storeBargain.getMinPrice()); + detailVo.setPayNum(detailRequest.getProductNum()); + detailVo.setImage(StrUtil.isNotBlank(bargainAttrValue.getImage()) ? bargainAttrValue.getImage() : bargainAttrValue.getImage()); + detailVo.setVolume(bargainAttrValue.getVolume()); + detailVo.setWeight(bargainAttrValue.getWeight()); + detailVo.setTempId(storeBargain.getTempId()); + detailVo.setProductType(Constants.PRODUCT_TYPE_BARGAIN); + return detailVo; + } + + /** + * 公共校验砍价 + * + * @param storeBargain 砍价商品 + * @param bargainAttrValue 砍价商品规格属性 + * @param bargainUserId 砍价活动id + * @param user 用户 + * @param productNum 购买数量 + * @return MyRecord + */ + private MyRecord commonValidateBargain(StoreBargain storeBargain, StoreProductAttrValue bargainAttrValue, Integer bargainUserId, User user, Integer productNum) { + if (storeBargain.getStock().equals(0) || productNum > storeBargain.getStock()) { + throw new YztException("砍价商品库存不足"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis > storeBargain.getStopTime()) { + throw new YztException("砍价活动已结束"); + } + StoreBargainUser bargainUser = storeBargainUserService.getById(bargainUserId); + if (ObjectUtil.isNull(bargainUser)) { + throw new YztException("用户砍价活动不存在"); + } + if (bargainUser.getIsDel()) { + throw new YztException("用户砍价活动已取消"); + } + if (!bargainUser.getStatus().equals(3)) { + if (bargainUser.getBargainPriceMin().compareTo(bargainUser.getBargainPrice().subtract(bargainUser.getPrice())) != 0) { + throw new YztException("请先完成砍价活动"); + } + } + // 判断是否有订单 + StoreOrder bargainOrder = storeOrderService.getByBargainOrder(bargainUser.getBargainId(), bargainUser.getId()); + if (ObjectUtil.isNotNull(bargainOrder)) { + if (!bargainOrder.getPaid()) { + throw new YztException("订单已创建,尚未支付"); + } + throw new YztException("该砍价活动已创建了订单"); + } + // 参与活动次数 -根据用户和秒杀信息查询当天订单判断订单数量 + List userCurrentBargainOrders = storeOrderService.getUserCurrentBargainOrders(user.getUid(), storeBargain.getId()); + if (CollUtil.isNotEmpty(userCurrentBargainOrders)) { + // 判断是否有待支付订单 + List unPayOrders = userCurrentBargainOrders.stream().filter(e -> !e.getPaid()).collect(Collectors.toList()); + if (unPayOrders.size() > 0) throw new YztException("您有砍价待支付订单,请支付后再购买"); + + // 判断是否达到上限 + if (CollUtil.isNotEmpty(userCurrentBargainOrders) && userCurrentBargainOrders.size() >= storeBargain.getNum()) { + throw new YztException("您已经达到当前砍价活动上限"); + } + } + + if (bargainAttrValue.getStock() <= 0 || bargainAttrValue.getQuota() <= 0 || productNum > bargainAttrValue.getStock()) { + throw new YztException("砍价商品规格库存不足"); + } + // 普通商品部分判断 + StoreProduct product = storeProductService.getById(storeBargain.getProductId()); + if (ObjectUtil.isNull(product) || product.getIsDel()) { + throw new YztException("砍价主商品不存在"); + } + if (product.getStock().equals(0) || productNum > product.getStock()) { + throw new YztException("砍价主商品库存不足"); + } + // 主商品sku + StoreProductAttrValue productAttrValue = storeProductAttrValueService.getByProductIdAndSkuAndType(storeBargain.getProductId(), bargainAttrValue.getSuk(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(productAttrValue)) { + throw new YztException("砍价主商品规格不存在"); + } + if (productAttrValue.getStock() <= 0 || productNum > productAttrValue.getStock()) { + throw new YztException("砍价主商品规格库存不足"); + } + + MyRecord record = new MyRecord(); + record.set("productAttrValue", productAttrValue); + record.set("product", product); + return record; + } + + /** + * 拼团预下单校验 + * + * @param detailRequest 请求参数 + * @param user 用户 + * @return OrderInfoDetailVo + */ + private OrderInfoDetailVo validatePreOrderCombination(PreOrderDetailRequest detailRequest, User user) { + // 拼团部分判断 + Integer combinationId = detailRequest.getCombinationId(); + StoreCombination storeCombination = storeCombinationService.getByIdException(combinationId); + if (storeCombination.getStock().equals(0) || detailRequest.getProductNum() > storeCombination.getStock()) { + throw new YztException("拼团商品库存不足"); + } + StoreProductAttrValue combinationAttrValue = storeProductAttrValueService.getByIdAndProductIdAndType(detailRequest.getAttrValueId(), combinationId, Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNull(combinationAttrValue)) { + throw new YztException("拼团商品规格不存在"); + } + commonValidateCombination(storeCombination, combinationAttrValue, user, detailRequest.getProductNum()); + + OrderInfoDetailVo detailVo = new OrderInfoDetailVo(); + detailVo.setProductId(storeCombination.getProductId()); + detailVo.setProductName(storeCombination.getTitle()); + detailVo.setAttrValueId(combinationAttrValue.getId()); + detailVo.setSku(combinationAttrValue.getSuk()); + detailVo.setPrice(combinationAttrValue.getPrice()); + detailVo.setPayNum(detailRequest.getProductNum()); + detailVo.setImage(StrUtil.isNotBlank(combinationAttrValue.getImage()) ? combinationAttrValue.getImage() : combinationAttrValue.getImage()); + detailVo.setVolume(combinationAttrValue.getVolume()); + detailVo.setWeight(combinationAttrValue.getWeight()); + detailVo.setTempId(storeCombination.getTempId()); + detailVo.setProductType(Constants.PRODUCT_TYPE_PINGTUAN); + return detailVo; + } + + /** + * 公共校验拼团 + * + * @param storeCombination 砍价商品 + * @param combinationAttrValue 砍价商品规格属性 + * @param user 用户 + * @param productNum 购买数量 + * @return MyRecord + */ + private MyRecord commonValidateCombination(StoreCombination storeCombination, StoreProductAttrValue combinationAttrValue, User user, Integer productNum) { + // 判断拼团时间段 + long timeMillis = System.currentTimeMillis(); + if (timeMillis < storeCombination.getStartTime()) { + throw new YztException("拼团商品活动未开始"); + } + if (timeMillis >= storeCombination.getStopTime()) { + throw new YztException("拼团商品已过期"); + } + // 判断购买数量 + if (productNum > storeCombination.getOnceNum()) { + throw new YztException("购买数量超过单次拼团购买上限"); + } + + if (combinationAttrValue.getStock() <= 0 || combinationAttrValue.getQuota() <= 0 || productNum > combinationAttrValue.getStock()) { + throw new YztException("拼团商品规格库存不足"); + } + // 普通商品部分判断 + StoreProduct product = storeProductService.getById(storeCombination.getProductId()); + if (ObjectUtil.isNull(product) || product.getIsDel()) { + throw new YztException("拼团主商品不存在"); + } + if (product.getStock().equals(0) || productNum > product.getStock()) { + throw new YztException("拼团主商品库存不足"); + } + // 主商品sku + StoreProductAttrValue productAttrValue = storeProductAttrValueService.getByProductIdAndSkuAndType(storeCombination.getProductId(), combinationAttrValue.getSuk(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(productAttrValue)) { + throw new YztException("拼团主商品规格不存在"); + } + if (productAttrValue.getStock() <= 0 || productNum > productAttrValue.getStock()) { + throw new YztException("拼团主商品规格库存不足"); + } + + // 用户参与活动的次数 + List userCombinationOrders = storeOrderService.getUserCurrentCombinationOrders(user.getUid(), storeCombination.getId()); + if (CollUtil.isNotEmpty(userCombinationOrders)) { + // 判断是否有待支付订单 + List unPayOrders = userCombinationOrders.stream().filter(e -> !e.getPaid()).collect(Collectors.toList()); + if (unPayOrders.size() > 0) throw new YztException("您有拼团待支付订单,请支付后再购买"); + int payNum = userCombinationOrders.stream().mapToInt(StoreOrder::getTotalNum).sum(); + if (storeCombination.getNum() <= payNum) { + throw new YztException("您已达到该商品拼团活动上限"); + } + if ((payNum + productNum) > storeCombination.getNum()) { + throw new YztException("超过该商品拼团活动您的购买上限"); + } + } + + MyRecord record = new MyRecord(); + record.set("productAttrValue", productAttrValue); + record.set("product", product); + return record; + } + + /** + * 再次下单预下单校验 + * + * @param detailRequest 请求参数 + * @return List + */ + private List validatePreOrderAgain(PreOrderDetailRequest detailRequest, User user) { + List detailVoList = CollUtil.newArrayList(); + if (StrUtil.isBlank(detailRequest.getOrderNo())) { + throw new YztException("再次购买订单编号不能为空"); + } + StoreOrder storeOrder = getByOrderIdException(detailRequest.getOrderNo()); + if (storeOrder.getRefundStatus() > 0 || storeOrder.getStatus() != 3) { + throw new YztException("只有已完成状态订单才能再次购买"); + } + if (storeOrder.getSeckillId() > 0 || storeOrder.getBargainId() > 0 || storeOrder.getCombinationId() > 0) { + throw new YztException("活动商品订单不能再次购买"); + } + if (storeOrder.getType().equals(1)) { + throw new YztException("视频订单不能再次购买"); + } + // 获取订单详情 + List infoVoList = storeOrderInfoService.getVoListByOrderId(storeOrder.getId()); + if (CollUtil.isEmpty(infoVoList)) { + throw new YztException("订单详情未找到"); + } + SystemUserLevel userLevel = null; + if (user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + SystemUserLevel finalUserLevel = userLevel; + infoVoList.forEach(e -> { + OrderInfoDetailVo detailVo = e.getInfo(); + // 查询商品信息 + StoreProduct storeProduct = storeProductService.getById(detailVo.getProductId()); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("商品信息不存在,请刷新后重新选择"); + } + if (storeProduct.getIsDel()) { + throw new YztException("商品已删除,请刷新后重新选择"); + } + if (!storeProduct.getIsShow()) { + throw new YztException("商品已下架,请刷新后重新选择"); + } + if (storeProduct.getStock() < detailVo.getPayNum()) { + throw new YztException("商品库存不足,请刷新后重新选择"); + } + // 查询商品规格属性值信息 + StoreProductAttrValue attrValue = attrValueService.getByIdAndProductIdAndType(detailVo.getAttrValueId(), detailVo.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNull(attrValue)) { + throw new YztException("商品规格信息不存在,请刷新后重新选择"); + } + if (attrValue.getStock() < detailVo.getPayNum()) { + throw new YztException("商品规格库存不足,请刷新后重新选择"); + } + OrderInfoDetailVo tempDetailVo = new OrderInfoDetailVo(); + tempDetailVo.setProductId(storeProduct.getId()); + tempDetailVo.setProductName(storeProduct.getStoreName()); + tempDetailVo.setAttrValueId(attrValue.getId()); + tempDetailVo.setSku(attrValue.getSuk()); + tempDetailVo.setPrice(attrValue.getPrice()); + tempDetailVo.setPayNum(detailVo.getPayNum()); + tempDetailVo.setImage(StrUtil.isNotBlank(attrValue.getImage()) ? attrValue.getImage() : storeProduct.getImage()); + tempDetailVo.setVolume(attrValue.getVolume()); + tempDetailVo.setWeight(attrValue.getWeight()); + tempDetailVo.setTempId(storeProduct.getTempId()); + tempDetailVo.setGiveIntegral(storeProduct.getGiveIntegral()); + tempDetailVo.setIsSub(storeProduct.getIsSub()); + tempDetailVo.setProductType(Constants.PRODUCT_TYPE_NORMAL); + tempDetailVo.setVipPrice(attrValue.getPrice()); + if (ObjectUtil.isNotNull(finalUserLevel)) { + BigDecimal vipPrice = attrValue.getPrice().multiply(new BigDecimal(finalUserLevel.getDiscount())).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP); + tempDetailVo.setVipPrice(vipPrice); + } + detailVoList.add(tempDetailVo); + }); + return detailVoList; + } + + private StoreOrder getByOrderIdException(String orderId) { + StoreOrder storeOrder = storeOrderService.getByOderId(orderId); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("订单不存在"); + } + if (storeOrder.getIsDel() || storeOrder.getIsSystemDel()) { + throw new YztException("订单不存在"); + } + return storeOrder; + } + + /** + * 计算订单运费 + */ + private void getFreightFee(OrderInfoVo orderInfoVo, UserAddress userAddress) { + BigDecimal freightFee = BigDecimal.ZERO; + if (ObjectUtil.isNull(userAddress) || userAddress.getCityId() <= 0) { + orderInfoVo.setFreightFee(BigDecimal.ZERO); + return; + } + // 判断是否满额包邮 type=1按件数 2按重量 3按体积 + // 全场满额包邮开关 + String postageSwitchString = systemConfigService.getValueByKey(SysConfigConstants.STORE_FEE_POSTAGE_SWITCH); + if (postageSwitchString.equals("'1'")) { + // 全场满额包邮金额 + String storeFreePostageString = systemConfigService.getValueByKey(SysConfigConstants.STORE_FEE_POSTAGE); + if (storeFreePostageString.equals("0") || orderInfoVo.getProTotalFee().compareTo(new BigDecimal(storeFreePostageString)) >= 0) { + orderInfoVo.setFreightFee(BigDecimal.ZERO); + return; + } + } + + // 按模板构建MAP + Map tempMap = CollUtil.newHashMap(); + orderInfoVo.getOrderDetailList().forEach(e -> { + Integer tempId = e.getTempId(); + if (tempMap.containsKey(tempId)) { + MyRecord record = tempMap.get(tempId); + record.set("totalPrice", record.getBigDecimal("totalPrice").add(e.getPrice().multiply(BigDecimal.valueOf(e.getPayNum())))); + record.set("totalNum", record.getInt("totalNum") + e.getPayNum()); + BigDecimal weight = e.getWeight().multiply(BigDecimal.valueOf(e.getPayNum())); + record.set("weight", record.getBigDecimal("weight").add(weight)); + BigDecimal volume = e.getVolume().multiply(BigDecimal.valueOf(e.getPayNum())); + record.set("volume", record.getBigDecimal("volume").add(volume)); + } else { + MyRecord record = new MyRecord(); + record.set("totalPrice", e.getPrice().multiply(BigDecimal.valueOf(e.getPayNum()))); + record.set("totalNum", e.getPayNum()); + record.set("tempId", e.getTempId()); + BigDecimal weight = e.getWeight().multiply(BigDecimal.valueOf(e.getPayNum())); + record.set("weight", weight); + BigDecimal volume = e.getVolume().multiply(BigDecimal.valueOf(e.getPayNum())); + record.set("volume", volume); + tempMap.put(tempId, record); + } + }); + + // 指定包邮(单品运费模板)> 指定区域配送(单品运费模板) + int cityId = userAddress.getCityId(); + BigDecimal storePostage = BigDecimal.ZERO; + for (Map.Entry m : tempMap.entrySet()) { + MyRecord value = m.getValue(); + Integer tempId = value.getInt("tempId"); + ShippingTemplates shippingTemplate = shippingTemplatesService.getById(tempId); + if (shippingTemplate.getAppoint().equals(0)) { + continue; + } + if (shippingTemplate.getAppoint().equals(2)) { + ShippingTemplatesFree shippingTemplatesFree = shippingTemplatesFreeService.getByTempIdAndCityId(tempId, cityId); + if (ObjectUtil.isNotNull(shippingTemplatesFree)) { + BigDecimal multiply = value.getBigDecimal("totalPrice"); + if (multiply.compareTo(shippingTemplatesFree.getPrice()) >= 0) { + continue; + } + if (shippingTemplate.getType().equals(1)) { + if (BigDecimal.valueOf(value.getInt("totalNum")).compareTo(shippingTemplatesFree.getNumber()) >= 0) { + continue; + } + } + BigDecimal surplus = shippingTemplate.getType().equals(2) ? value.getBigDecimal("weight") : value.getBigDecimal("volume"); + if (surplus.compareTo(shippingTemplatesFree.getNumber()) >= 0) { + continue; + } + + } + } + ShippingTemplatesRegion shippingTemplatesRegion = shippingTemplatesRegionService.getByTempIdAndCityId(tempId, cityId); + if (shippingTemplate.getAppoint().equals(1) && ObjectUtil.isNull(shippingTemplatesRegion)) { + continue; + } + if (ObjectUtil.isNull(shippingTemplatesRegion)) { + shippingTemplatesRegion = shippingTemplatesRegionService.getByTempIdAndCityId(tempId, 0); + } + BigDecimal postageFee = BigDecimal.ZERO; + // 判断计费方式:件数、重量、体积 + switch (shippingTemplate.getType()) { + case 1: // 件数 + // 判断件数是否超过首件 + Integer num = value.getInt("totalNum"); + if (num <= shippingTemplatesRegion.getFirst().intValue()) { + storePostage = storePostage.add(shippingTemplatesRegion.getFirstPrice()); + postageFee = shippingTemplatesRegion.getFirstPrice(); + } else {// 超过首件的需要计算续件 + int renewalNum = num - shippingTemplatesRegion.getFirst().intValue(); + // 剩余件数/续件 = 需要计算的续件费用的次数 + BigDecimal renewalPrice = shippingTemplatesRegion.getRenewalPrice().multiply(new BigDecimal(String.valueOf(renewalNum)).divide(shippingTemplatesRegion.getRenewal(), 0, RoundingMode.UP)); + storePostage = storePostage.add(shippingTemplatesRegion.getFirstPrice()).add(renewalPrice); + postageFee = shippingTemplatesRegion.getFirstPrice().add(renewalPrice); + } + List orderInfoDetailVos = orderInfoVo.getOrderDetailList().stream().filter(e -> e.getTempId().equals(tempId)).collect(Collectors.toList()); + if (orderInfoDetailVos.size() == 1) { + orderInfoVo.setFreightFee(postageFee); + } else { + Integer tempNum = num; + for (int i = 0; i < orderInfoDetailVos.size(); i++) { + OrderInfoDetailVo orderInfoDetailVo = orderInfoDetailVos.get(i); + if (orderInfoDetailVos.size() == (i + 1)) { + orderInfoVo.setFreightFee(postageFee); + break; + } + // 更新运费计算公式 2025-4-15 + BigDecimal multiply = postageFee.multiply(new BigDecimal(orderInfoDetailVo.getPayNum().toString())).divide(new BigDecimal(tempNum.toString()), 2, RoundingMode.UP); + if (postageFee.compareTo(multiply) < 0) { + multiply = postageFee; + } + orderInfoVo.setFreightFee(multiply); + postageFee = postageFee.subtract(multiply); + tempNum = tempNum - orderInfoDetailVo.getPayNum(); + } + } + break; + case 2: // 重量 + case 3: // 体积 + BigDecimal surplus = shippingTemplate.getType().equals(2) ? value.getBigDecimal("weight") : value.getBigDecimal("volume"); + if (surplus.compareTo(shippingTemplatesRegion.getFirst()) <= 0) { + storePostage = storePostage.add(shippingTemplatesRegion.getFirstPrice()); + postageFee = shippingTemplatesRegion.getFirstPrice(); + } else {// 超过首件的需要计算续件 + BigDecimal renewalNum = surplus.subtract(shippingTemplatesRegion.getFirst()); + // 剩余件数/续件 = 需要计算的续件费用的次数 + BigDecimal renewalPrice = shippingTemplatesRegion.getRenewalPrice().multiply(renewalNum.divide(shippingTemplatesRegion.getRenewal(), 0, RoundingMode.UP)); + storePostage = storePostage.add(shippingTemplatesRegion.getFirstPrice()).add(renewalPrice); + postageFee = shippingTemplatesRegion.getFirstPrice().add(renewalPrice); + } + List orderInfoDetailVo = orderInfoVo.getOrderDetailList().stream().filter(e -> e.getTempId().equals(tempId)).collect(Collectors.toList()); + if (orderInfoDetailVo.size() == 1) { + orderInfoVo.setFreightFee(postageFee); + } else { + BigDecimal tempSurplus = surplus; + for (int i = 0; i < orderInfoDetailVo.size(); i++) { + OrderInfoDetailVo orderInfoDetailVo1 = orderInfoDetailVo.get(i); + if (orderInfoDetailVo.size() == (i + 1)) { + orderInfoVo.setFreightFee(postageFee); + break; + } + BigDecimal wv = shippingTemplate.getType().equals(2) ? orderInfoDetailVo1.getWeight() : orderInfoDetailVo1.getVolume(); + // 更新运费计算公式 2025-4-15 + BigDecimal multiply = postageFee.multiply(wv.multiply(new BigDecimal(orderInfoDetailVo1.getPayNum().toString()))).divide(tempSurplus, 2, RoundingMode.HALF_UP); + if (postageFee.compareTo(multiply) < 0) { + multiply = postageFee; + } + orderInfoVo.setFreightFee(multiply); + postageFee = postageFee.subtract(multiply); + tempSurplus = tempSurplus.subtract(wv.multiply(new BigDecimal(orderInfoDetailVo1.getPayNum().toString()))); + } + } + break; + } + } + freightFee = freightFee.add(storePostage); +// orderInfoVo.setFreightFee(storePostage); + orderInfoVo.setFreightFee(freightFee); + } + + private ComputedOrderPriceResponse computedPrice(OrderComputedPriceRequest request, OrderInfoVo orderInfoVo, User user) { + // 计算各种价格 + ComputedOrderPriceResponse priceResponse = new ComputedOrderPriceResponse(); + // 计算运费 + if (request.getShippingType().equals(2)) {// 到店自提,不计算运费 + priceResponse.setFreightFee(BigDecimal.ZERO); + } else if (ObjectUtil.isNull(request.getAddressId()) || request.getAddressId() <= 0) { + // 快递配送,无地址 + priceResponse.setFreightFee(BigDecimal.ZERO); + } else {// 快递配送,有地址 + UserAddress userAddress = userAddressService.getById(request.getAddressId()); + if (ObjectUtil.isNull(userAddress)) { + throw new YztException("用户地址不存在"); + } else { + getFreightFee(orderInfoVo, userAddress); + priceResponse.setFreightFee(orderInfoVo.getFreightFee()); + } + } + // ==================== 优惠券抵扣功能已禁用 ==================== + // 强制设置优惠券金额为0,不允许使用优惠券抵扣 + priceResponse.setCouponFee(BigDecimal.ZERO); + + /* 原优惠券逻辑已注释 + // 计算优惠券金额 + if (ObjectUtil.isNull(request.getCouponId()) || request.getCouponId() <= 0) { + priceResponse.setCouponFee(BigDecimal.ZERO); + } else if (orderInfoVo.getSeckillId() > 0 || orderInfoVo.getBargainId() > 0 || orderInfoVo.getCombinationId() > 0) { + throw new YztException("营销活动商品无法使用优惠券"); + } else if (orderInfoVo.getIsVideo()) { + throw new YztException("视频号商品无法使用优惠券"); + } else { + // 判断优惠券是否可以使用 + StoreCouponUser storeCouponUser = storeCouponUserService.getById(request.getCouponId()); + if (ObjectUtil.isNull(storeCouponUser) || !storeCouponUser.getUid().equals(user.getUid())) { + throw new YztException("优惠券领取记录不存在!"); + } + if (storeCouponUser.getStatus() == 1) { + throw new YztException("此优惠券已使用!"); + } + + if (storeCouponUser.getStatus() == 2) { + throw new YztException("此优惠券已失效!"); + } + //判断是否在使用时间内 + Date date = YztDateUtil.nowDateTime(); + if (storeCouponUser.getStartTime().compareTo(date) > 0) { + throw new YztException("此优惠券还未到达使用时间范围之内!"); + } + if (date.compareTo(storeCouponUser.getEndTime()) > 0) { + throw new YztException("此优惠券已经失效了"); + } + if (storeCouponUser.getMinPrice().compareTo(orderInfoVo.getProTotalFee()) > 0) { + throw new YztException("总金额小于优惠券最小使用金额"); + } + //检测优惠券信息 + if (storeCouponUser.getUseType().equals(1)) { + if (orderInfoVo.getProTotalFee().compareTo(storeCouponUser.getMoney()) <= 0) { + priceResponse.setCouponFee(orderInfoVo.getProTotalFee()); + priceResponse.setDeductionPrice(BigDecimal.ZERO); + priceResponse.setSurplusIntegral(user.getIntegral()); + priceResponse.setPayFee(priceResponse.getFreightFee()); + priceResponse.setUsedIntegral(0); + priceResponse.setUseIntegral(false); + priceResponse.setProTotalFee(orderInfoVo.getProTotalFee()); + return priceResponse; + } else { + priceResponse.setCouponFee(storeCouponUser.getMoney()); + } + } else { + List orderDetailList = orderInfoVo.getOrderDetailList(); + List productIdList = orderDetailList.stream().map(OrderInfoDetailVo::getProductId).collect(Collectors.toList()); + if (CollUtil.isEmpty(productIdList)) { + throw new YztException("没有找到商品"); + } + //设置优惠券所提供的集合 + List primaryKeyIdList = YztUtil.stringToArray(storeCouponUser.getPrimaryKey()); + + //取两个集合的交集,如果是false则证明没有相同的值 + //oldList.retainAll(newList)返回值代表oldList是否保持原样,如果old和new完全相同,那old保持原样并返回false。 + //交集:listA.retainAll(listB) ——listA内容变为listA和listB都存在的对象;listB不变 + if (storeCouponUser.getUseType() == 2) { + primaryKeyIdList.retainAll(productIdList); + if (CollUtil.isEmpty(primaryKeyIdList)) { + throw new YztException("此优惠券为商品券,请购买相关商品之后再使用!"); + } + List proOrderDetailList = orderDetailList.stream().filter(e -> primaryKeyIdList.contains(e.getProductId())).collect(Collectors.toList()); + BigDecimal productTotalPrice = proOrderDetailList.stream().map(e -> e.getVipPrice().multiply(new BigDecimal(e.getPayNum().toString()))).reduce(BigDecimal.ZERO, BigDecimal::add); + if (productTotalPrice.compareTo(storeCouponUser.getMoney()) <= 0) { + priceResponse.setCouponFee(productTotalPrice); + } else { + priceResponse.setCouponFee(storeCouponUser.getMoney()); + } + if (orderInfoVo.getProTotalFee().compareTo(productTotalPrice) <= 0 && productTotalPrice.compareTo(storeCouponUser.getMoney()) <= 0) { + priceResponse.setDeductionPrice(BigDecimal.ZERO); + priceResponse.setSurplusIntegral(user.getIntegral()); + priceResponse.setPayFee(priceResponse.getFreightFee()); + priceResponse.setUsedIntegral(0); + priceResponse.setUseIntegral(false); + priceResponse.setProTotalFee(orderInfoVo.getProTotalFee()); + return priceResponse; + } + } + + if (storeCouponUser.getUseType() == 3) { + //拿出需要使用优惠券的商品分类集合 + List categoryIdList = storeProductService.getProductAllCategoryIdByProductIds(productIdList); + Integer primaryKey = primaryKeyIdList.get(0); + primaryKeyIdList.retainAll(categoryIdList); + if (!categoryIdList.contains(primaryKey)) { + throw new YztException("此优惠券为分类券,请购买相关分类下的商品之后再使用!"); + } + List containsIdList = new ArrayList<>(); + List storeProductList = storeProductService.getListInIds(productIdList); + for (StoreProduct product : storeProductList) { + List cateIdList = YztUtil.stringToArray(product.getCateId()); + if (cateIdList.contains(primaryKey)) { + containsIdList.add(product.getId()); + continue; + } + List categoryList = categoryService.getByIds(cateIdList); + List parentCIdList = new ArrayList<>(); + for (Category category: categoryList) { + List parentIdList = YztUtil.stringToArrayByRegex(category.getPath(), "/"); + parentCIdList.addAll(parentIdList); + } + parentCIdList = parentCIdList.stream().distinct().collect(Collectors.toList()); + if (parentCIdList.contains(primaryKey)) { + containsIdList.add(product.getId()); + } + } + List proOrderDetailList = orderDetailList.stream().filter(e -> containsIdList.contains(e.getProductId())).collect(Collectors.toList()); + BigDecimal productTotalPrice = proOrderDetailList.stream().map(e -> e.getVipPrice().multiply(new BigDecimal(e.getPayNum().toString()))).reduce(BigDecimal.ZERO, BigDecimal::add); + if (productTotalPrice.compareTo(storeCouponUser.getMoney()) <= 0) { + priceResponse.setCouponFee(productTotalPrice); + } else { + priceResponse.setCouponFee(storeCouponUser.getMoney()); + } + if (orderInfoVo.getProTotalFee().compareTo(productTotalPrice) <= 0 && productTotalPrice.compareTo(storeCouponUser.getMoney()) <= 0) { + priceResponse.setDeductionPrice(BigDecimal.ZERO); + priceResponse.setSurplusIntegral(user.getIntegral()); + priceResponse.setPayFee(priceResponse.getFreightFee()); + priceResponse.setUsedIntegral(0); + priceResponse.setUseIntegral(false); + priceResponse.setProTotalFee(orderInfoVo.getProTotalFee()); + return priceResponse; + } + } + } + } + */// ==================== 优惠券抵扣功能已禁用 ==================== + + // ==================== 积分抵扣功能已禁用 ==================== + // 强制设置积分抵扣为0,不允许使用积分抵扣 + BigDecimal payPrice = orderInfoVo.getProTotalFee().subtract(priceResponse.getCouponFee()); + priceResponse.setProTotalFee(orderInfoVo.getProTotalFee()); + if(request.getUseIntegral()){ + priceResponse.setUseIntegral(true); + BigDecimal totalAmount = payPrice.add(priceResponse.getFreightFee()); + BigDecimal actualDeduct = user.getIntegral().min(totalAmount); + priceResponse.setDeductionPrice(actualDeduct); + priceResponse.setSurplusIntegral(user.getIntegral().subtract(actualDeduct)); // 剩余积分 + priceResponse.setPayFee(totalAmount.subtract(actualDeduct)); // 实际支付 = 总金额 - 抵扣 + priceResponse.setUsedIntegral(actualDeduct.intValue()); // 使用的积分数 + return priceResponse; + } + priceResponse.setUseIntegral(false); // 强制设为false + priceResponse.setDeductionPrice(BigDecimal.ZERO); // 抵扣金额强制为0 + priceResponse.setSurplusIntegral(user.getIntegral()); // 剩余积分保持不变 + priceResponse.setPayFee(payPrice.add(priceResponse.getFreightFee())); // 实际支付金额 = 商品总价 + 运费 + priceResponse.setUsedIntegral(0); // 使用积分强制为0 + return priceResponse; + + /* 原积分抵扣逻辑已注释 + // 积分部分 + BigDecimal payPrice = orderInfoVo.getProTotalFee().subtract(priceResponse.getCouponFee()); + priceResponse.setUseIntegral(request.getUseIntegral()); + priceResponse.setProTotalFee(orderInfoVo.getProTotalFee()); + if (!request.getUseIntegral() || user.getIntegral().compareTo(BigDecimal.ZERO) <= 0) {// 不使用积分 + priceResponse.setDeductionPrice(BigDecimal.ZERO); + priceResponse.setSurplusIntegral(user.getIntegral()); + priceResponse.setPayFee(payPrice.add(priceResponse.getFreightFee())); + priceResponse.setUsedIntegral(0); + return priceResponse; + } + // 使用积分 + // 查询积分使用比例 + String integralRatio = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_INTEGRAL_RATE); + BigDecimal deductionPrice = user.getIntegral().multiply(new BigDecimal(integralRatio)); + if (request.getUseIntegral()) { + // 积分兑换金额小于实际支付金额 + if (deductionPrice.compareTo(payPrice) < 0) { + payPrice = payPrice.subtract(deductionPrice); + priceResponse.setSurplusIntegral(java.math.BigDecimal.ZERO); + priceResponse.setUsedIntegral(user.getIntegral().intValue()); + } else { + deductionPrice = payPrice; + if (payPrice.compareTo(BigDecimal.ZERO) > 0) { + int usedIntegral = payPrice.divide(new BigDecimal(integralRatio), 0, BigDecimal.ROUND_UP).intValue(); + priceResponse.setSurplusIntegral(user.getIntegral().subtract(java.math.BigDecimal.valueOf(usedIntegral))); + priceResponse.setUsedIntegral(usedIntegral); + } + payPrice = BigDecimal.ZERO; + } + priceResponse.setPayFee(payPrice.add(priceResponse.getFreightFee())); + priceResponse.setDeductionPrice(deductionPrice); + } + return priceResponse; + */// ==================== 积分抵扣功能已禁用 ==================== + } + + /** + * 生成排队码编号 + * 格式:年月日时分秒+六位随机数 + * @param addTime Unix时间戳(秒) + * @return 排队码编号 + */ + private String generateQueueCode(Long addTime) { + // 将Unix时间戳转换为日期时间格式 + DateTime dateTime = DateUtil.date(addTime * 1000); + String timeStr = DateUtil.format(dateTime, "yyMMddHHmmss"); + + // 生成六位随机数 + int randomNum = (int)(Math.random() * 1000000); + String randomStr = String.format("%06d", randomNum); + + return timeStr + randomStr; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderTaskServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderTaskServiceImpl.java new file mode 100644 index 0000000..0a69748 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/OrderTaskServiceImpl.java @@ -0,0 +1,394 @@ +package com.yzt.service.service.impl; + + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.TaskConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderStatus; +import com.yzt.common.model.product.StoreProductReply; +import com.yzt.common.model.user.User; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.Date; +import java.util.List; + +/** + * StoreOrderServiceImpl 接口实现 + * + */ +@Service +public class OrderTaskServiceImpl implements OrderTaskService { + //日志 + private static final Logger logger = LoggerFactory.getLogger(OrderTaskServiceImpl.class); + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private StoreOrderTaskService storeOrderTaskService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductReplyService storeProductReplyService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private OrderPayService orderPayService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private OrderServiceImpl orderServiceImpl; + + /** + * 用户取消订单 + * + * @since 2020-07-09 + */ + @Override + public void cancelByUser() { + String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_CANCEL_BY_USER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.cancelByUser | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try { +// StoreOrder storeOrder = getJavaBeanStoreOrder(data); + StoreOrder storeOrder = storeOrderService.getById(Integer.valueOf(data.toString())); + boolean result = storeOrderTaskService.cancelByUser(storeOrder); + if (!result) { + redisUtil.lPush(redisKey, data); + } + } catch (Exception e) { + redisUtil.lPush(redisKey, data); + } + } + } + + private StoreOrder getJavaBeanStoreOrder(Object data) { + return JSONObject.toJavaObject(JSONObject.parseObject(data.toString()), StoreOrder.class); + } + + /** + * 执行 用户退款申请 + * + * @since 2020-07-09 + */ + @Override + public void refundApply() { + String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.refundApply | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object orderId = redisUtil.getRightPop(redisKey, 10L); + if (null == orderId) { + continue; + } + try { + StoreOrder storeOrder = storeOrderService.getById(Integer.valueOf(orderId.toString())); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("订单不存在,orderNo = " + orderId); + } +// boolean result = storeOrderTaskService.refundApply(storeOrder); + boolean result = storeOrderTaskService.refundOrder(storeOrder); + if (!result) { + logger.error("订单退款错误:result = " + result); + redisUtil.lPush(redisKey, orderId); + } + } catch (Exception e) { + logger.error("订单退款错误:" + e.getMessage()); + redisUtil.lPush(redisKey, orderId); + } + } + } + + /** + * 完成订单 + * + * @since 2020-07-09 + */ + @Override + public void complete() { + String redisKey = Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.complete | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try { + StoreOrder storeOrder = storeOrderService.getById(Integer.valueOf(data.toString())); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("OrderTaskServiceImpl.orderPaySuccessAfter | 订单不存在,orderId: " + data); + throw new YztException("订单不存在,orderId: " + data); + } + boolean result = storeOrderTaskService.complete(storeOrder); + if (!result) { + redisUtil.lPush(redisKey, data); + } + } catch (Exception e) { + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 订单支付成功后置处理 + */ + @Override + public void orderPaySuccessAfter() { + String redisKey = TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.orderPaySuccessAfter | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (ObjectUtil.isNull(data)) { + continue; + } + try { + StoreOrder storeOrder = storeOrderService.getByOderId(String.valueOf(data)); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("OrderTaskServiceImpl.orderPaySuccessAfter | 订单不存在,orderNo: " + data); + throw new YztException("订单不存在,orderNo: " + data); + } + boolean result = orderPayService.paySuccess(storeOrder); + if (!result) { + redisUtil.lPush(redisKey, data); + } else { + // 微信支付成功后也执行排队免单和奖励逻辑 + try { + logger.info("===== Wechat pay callback calling handlePostPay for orderNo={} =====", storeOrder.getOrderId()); + orderServiceImpl.handlePostPay(storeOrder); + } catch (Exception ex) { + logger.error("Wechat pay handlePostPay failed for orderNo=" + storeOrder.getOrderId(), ex); + } + } + } catch (Exception e) { + e.printStackTrace(); + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 自动取消未支付订单 + */ + @Override + public void autoCancel() { + String redisKey = Constants.ORDER_AUTO_CANCEL_KEY; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.autoCancel | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try { + StoreOrder storeOrder = storeOrderService.getByOderId(String.valueOf(data)); + if (ObjectUtil.isNull(storeOrder)) { + logger.error("OrderTaskServiceImpl.autoCancel | 订单不存在,orderNo: " + data); + throw new YztException("订单不存在,orderNo: " + data); + } + boolean result = storeOrderTaskService.autoCancel(storeOrder); + if (!result) { + redisUtil.lPush(redisKey, data); + } + } catch (Exception e) { + e.printStackTrace(); + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 订单收货 + */ + @Override + public void orderReceiving() { + String redisKey = TaskConstants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER; + Long size = redisUtil.getListSize(redisKey); + logger.info("OrderTaskServiceImpl.orderReceiving | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object id = redisUtil.getRightPop(redisKey, 10L); + if (null == id) { + continue; + } + try { + Boolean result = storeOrderTaskService.orderReceiving(Integer.valueOf(id.toString())); + if (!result) { + redisUtil.lPush(redisKey, id); + } + } catch (Exception e) { + redisUtil.lPush(redisKey, id); + } + } + } + + /** + * 订单自动完成 + */ + @Override + public void autoComplete() { + // 查找所有收获状态订单 + List orderList = storeOrderService.findIdAndUidListByReceipt(); + if (CollUtil.isEmpty(orderList)) { + return ; + } + logger.info("OrderTaskServiceImpl.autoComplete | size:0"); + + // 根据订单状态表判断订单是否可以自动完成 + for (StoreOrder order : orderList) { + StoreOrderStatus orderStatus = storeOrderStatusService.getLastByOrderId(order.getId()); + if (!orderStatus.getChangeType().equals("user_take_delivery")) { + logger.error("订单自动完成:订单记录最后一条不是收货状态,orderId = " + order.getId()); + continue ; + } + // 判断是否到自动完成时间(收货时间向后偏移7天) + String comTime = YztDateUtil.addDay(orderStatus.getCreateTime(), 7, Constants.DATE_FORMAT); + int compareDate = YztDateUtil.compareDate(comTime, YztDateUtil.nowDateTime(Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (compareDate > 0) { + continue ; + } + + /** + * --------------- + * 自动好评转完成 + * --------------- + */ + // 获取订单详情 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(order.getId()); + if (CollUtil.isEmpty(orderInfoVoList)) { + logger.error("订单自动完成:无订单详情数据,orderId = " + order.getId()); + continue; + } + List replyList = CollUtil.newArrayList(); + User user = userService.getById(order.getUid()); + // 生成评论 + for (StoreOrderInfoOldVo orderInfo : orderInfoVoList) { + // 判断是否已评论 + if (orderInfo.getInfo().getIsReply().equals(1)) { + continue; + } + String replyType = Constants.STORE_REPLY_TYPE_PRODUCT; + + StoreProductReply reply = new StoreProductReply(); + reply.setUid(order.getUid()); + reply.setOid(order.getId()); + reply.setProductId(orderInfo.getProductId()); + reply.setUnique(orderInfo.getUnique()); + reply.setReplyType(replyType); + reply.setProductScore(5); + reply.setServiceScore(5); + reply.setComment(""); + reply.setPics(""); + reply.setNickname(user.getNickname()); + reply.setAvatar(user.getAvatar()); + reply.setSku(orderInfo.getInfo().getSku()); + reply.setCreateTime(YztDateUtil.nowDateTime()); + replyList.add(reply); + } + order.setStatus(Constants.ORDER_STATUS_INT_COMPLETE); + Boolean execute = transactionTemplate.execute(e -> { + System.out.println("操作的订单ID:" + order.getId()); + Date now = DateUtil.date(); + order.setUpdateTime(now); + order.setFinishTime(now); + storeOrderService.updateById(order); + storeProductReplyService.saveBatch(replyList); + return Boolean.TRUE; + }); + if (execute) { + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER, order.getId()); + } else { + logger.error("订单自动完成:更新数据库失败,orderId = " + order.getId()); + } + } + } + + /** + * 订单自动收货 + */ + @Override + public void autoTakeDelivery() { + int day = 14; + String autoDay = systemConfigService.getValueByKey("auto_take_delivery_day"); + if (StrUtil.isNotBlank(autoDay) && Integer.parseInt(autoDay) >= 1) { + day = Integer.parseInt(autoDay); + } + DateTime dateTime = DateUtil.offsetDay(DateUtil.date(), -day); + List storeOrderList = storeOrderService.findAwaitTakeDeliveryOrderList(dateTime.toString()); + + storeOrderList.forEach(order -> { + try { + //已收货,待评价 + order.setStatus(Constants.ORDER_STATUS_INT_BARGAIN); + order.setUpdateTime(DateUtil.date()); + boolean result = storeOrderService.updateById(order); + if (result) { + //后续操作放入redis + redisUtil.lPush(TaskConstants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER, order.getId()); + } + } catch (Exception e) { + logger.error("自动收货异常:订单号:{},异常信息={}", order.getOrderId(), e.getMessage()); + } + }); + + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/OssServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/OssServiceImpl.java new file mode 100644 index 0000000..ac8115d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/OssServiceImpl.java @@ -0,0 +1,52 @@ +package com.yzt.service.service.impl; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.CloudVo; +import com.yzt.service.service.OssService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.File; + + +/** + * AsyncServiceImpl 同步到云服务 + * + */ +@Service +public class OssServiceImpl implements OssService { + + private static final Logger logger = LoggerFactory.getLogger(OssServiceImpl.class); + + @Override + public void upload(CloudVo cloudVo, String webPth, String localFile, File file) { + logger.info("上传文件开始:" + localFile); + OSS ossClient = new OSSClientBuilder().build(cloudVo.getRegion(), cloudVo.getAccessKey(), cloudVo.getSecretKey()); + try { + //判断bucket是否存在 + if (!ossClient.doesBucketExist(cloudVo.getBucketName())){ + ossClient.createBucket(cloudVo.getBucketName()); + } + + if(!file.exists()){ + logger.info("上传文件" + localFile + "不存在:"); + return; + } + PutObjectRequest putObjectRequest = new PutObjectRequest(cloudVo.getBucketName(), webPth, file); + // 上传文件。 + PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest); + logger.info("上传文件 -- 结束:" + putObjectResult.getETag()); + + } catch (Exception e){ + throw new YztException(e.getMessage()); + } finally { + ossClient.shutdown(); + } + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/PageDiyServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/PageDiyServiceImpl.java new file mode 100644 index 0000000..d20ba17 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/PageDiyServiceImpl.java @@ -0,0 +1,331 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.page.PageDiy; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.page.PageDiyEditNameRequest; +import com.yzt.common.response.page.PageDiyResponse; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.result.SystemConfigResultCode; +import com.yzt.service.mapper.page.PageDiyMapper; +import com.yzt.service.service.PageDiyService; +import com.yzt.service.service.SystemConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** +* PageDiyServiceImpl 接口实现 +*/ +@Service +public class PageDiyServiceImpl extends ServiceImpl implements PageDiyService { + + private static final Logger logger = LoggerFactory.getLogger(PageDiyServiceImpl.class); + + @Resource + private PageDiyMapper mapper; + + @Autowired + private SystemConfigService systemConfigService; + + + /** + * 列表 + * + * @return List + * @since 2023-05-16 + */ + @Override + public List getList(String name, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + // 列表查询时忽略掉value字段,以免影响查询速度 + lambdaQueryWrapper.select(PageDiy.class, i -> !i.getColumn().equals("value")); + if (StrUtil.isNotBlank(name)) { + lambdaQueryWrapper.like(PageDiy::getName, URLUtil.decode(name)); + } + lambdaQueryWrapper.eq(PageDiy::getMerId, 0); + lambdaQueryWrapper.eq(PageDiy::getIsDel, 0); + lambdaQueryWrapper.orderByDesc(PageDiy::getIsDefault, PageDiy::getAddTime); + List pageDiys = mapper.selectList(lambdaQueryWrapper); + return pageDiys; + } + + /** + * 保存diy + * + * @param pageDiy diy数据 + */ + @Override + public PageDiy savePageDiy(PageDiy pageDiy) { + String adminApiPath = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_API_URL); + if (StrUtil.isBlank(adminApiPath)) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "应用设置中 微信小程序数据配置 或者 支付回调地址以及网站地址 配置不全"); + } + // 检查diy模版名称唯一 + checkPageDiyNameUnique(pageDiy.getName(), null); + DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue()); + // 通配符去掉关键子 再存储 + jsonContext.delete("$..*[?(@ == '"+ adminApiPath +"')]"); + pageDiy.setValue(jsonContext.jsonString()); + save(pageDiy); + return pageDiy; + } + + /** + * 更新diy + * + * @param pageDiy + */ + @Override + public Boolean editPageDiy(PageDiy pageDiy) { + String adminApiPath = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_API_URL); + if (StrUtil.isBlank(adminApiPath)) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "应用设置中 微信小程序数据配置 或者 支付回调地址以及网站地址 配置不全"); + } + // 检查diy模版名称唯一 + checkPageDiyNameUnique(pageDiy.getName(), pageDiy.getId()); +// DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue()); +// // 通配符去掉关键子 再存储 +// jsonContext.delete("$..*[?(@ == '"+ adminApiPath +"')]"); +// pageDiy.setValue(jsonContext.jsonString()); + pageDiy.setUpdateTime(DateUtil.date()); + return mapper.updateById(pageDiy)>0; + } + + /** + * 编辑diy名称 + *@param pageDiyEditNameRequest 待编辑名称对象 + */ + @Override + public Boolean editPageDiyName(PageDiyEditNameRequest pageDiyEditNameRequest) { + // 检查diy模版名称唯一 + checkPageDiyNameUnique(pageDiyEditNameRequest.getName(), pageDiyEditNameRequest.getId()); + + PageDiy pageDiyForUpdate = new PageDiy(); + pageDiyForUpdate.setId(pageDiyEditNameRequest.getId()); + pageDiyForUpdate.setName(pageDiyEditNameRequest.getName()); + pageDiyForUpdate.setUpdateTime(DateUtil.date()); + return mapper.updateById(pageDiyForUpdate) > 0; + } + + /** + * 设置DIY首页模版 + * isDefault =1 是平台首页 2=商户 diy后期商户再处理 + * + * @param diyId 被设置为首页的diy模版id + * @return 设置结果 + */ + @Override + public Boolean setDiyPageHome(Integer diyId) { + PageDiy pageDiy = mapper.selectById(diyId); + if(ObjectUtil.isNull(pageDiy)) throw new YztException(CommonResultCode.VALIDATE_FAILED, "当前DIY模版不存在"); + + // 取消现有的首页设置,如果存在的话 + LambdaQueryWrapper queryWaiteResetDefaultTemp = Wrappers.lambdaQuery(); + queryWaiteResetDefaultTemp.eq(PageDiy::getIsDefault, 1); + List currentWaitResetPageHome = mapper.selectList(queryWaiteResetDefaultTemp); + List currentTempByReset = currentWaitResetPageHome.stream().map(homeTemp -> homeTemp.setIsDefault(0)).collect(Collectors.toList()); + saveOrUpdateBatch(currentTempByReset); + + // 设置当前diy数据为商城首页 + pageDiy.setIsDefault(1); + pageDiy.setUpdateTime(DateUtil.date()); + return mapper.updateById(pageDiy) > 0; + } + + /** + * 获取DIY首页模版Id + *@param isLoadValue 是否加载value详情数据 + * @return 首页模版ID + */ + @Override + public PageDiy getDiyPageHome(Boolean isLoadValue) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(PageDiy::getIsDefault, 1); + if(Boolean.FALSE == isLoadValue){ + queryWrapper.select(PageDiy.class, i -> !i.getColumn().equals("value")); + } + List currentWaitResetPageHome = mapper.selectList(queryWrapper); + if(ObjectUtil.isNull(currentWaitResetPageHome) || currentWaitResetPageHome.size() != 1){ + throw new YztException("首页模版设置不正确!"); + } + + PageDiy pageDiy = currentWaitResetPageHome.get(0); + if(Boolean.TRUE == isLoadValue){ +// String modifiedJsonString = getModifiedJsonString(pageDiy.getValue()); +// pageDiy.setValue(modifiedJsonString); + pageDiy.setValue(pageDiy.getValue()); + } + return pageDiy; + } + + + /** + * 针对Admin + * 根据id加载diy模版配置 + * + * @param id 对应的模版id + * 描述: + * id=0加载商城首页的,也就是setDiyPageHome后的数据,平台端会默认设置已经有首页的数据,也会预制 + * id>1时加载对应的模版即可 + */ + @Override + public PageDiy getDiyPageByPageIdForAdmin(Integer id) { + PageDiy pageDiy = null; + if(0 == id){ + LambdaQueryWrapper getHomeDefault = Wrappers.lambdaQuery(); + getHomeDefault.eq(PageDiy::getIsDefault, 1); + pageDiy = getOne(getHomeDefault); + }else{ + pageDiy = getById(id); + } + + if(ObjectUtil.isNull(pageDiy)) throw new YztException(SystemConfigResultCode.PAGE_DIY_NOT_EXIST); + +// String modifiedJsonString = getModifiedJsonString(pageDiy.getValue()); +// pageDiy.setValue(modifiedJsonString); + pageDiy.setValue(pageDiy.getValue()); + return pageDiy; + } + + /** + * 根据id加载diy模版配置 + * + * @param id 对应的模版id + * 描述: + * id=0加载商城首页的,也就是setDiyPageHome后的数据,平台端会默认设置已经有首页的数据,也会预制 + * id>1时加载对应的模版即可 + */ + @Override + public PageDiyResponse getDiyPageByPageIdForFront(Integer id) { + PageDiy pageDiy; + if(0 == id){ + LambdaQueryWrapper getHomeDefault = Wrappers.lambdaQuery(); + getHomeDefault.eq(PageDiy::getIsDefault, 1); + pageDiy = getOne(getHomeDefault); + }else{ + pageDiy = getById(id); + } + + if(ObjectUtil.isNull(pageDiy)) throw new YztException(SystemConfigResultCode.PAGE_DIY_NOT_EXIST); + + + // 优化front比必要的字段 提高diy组件渲染效率 +// DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue()); +// jsonContext.delete("$..*[?(@.name == 'goodList')].itemStyle.list"); +// jsonContext.delete("$..*[?(@.name == 'goodList')].tabConfig.list"); +// jsonContext.delete("$..*[?(@.name == 'goodList')].typeConfig.list"); +//// jsonContext.delete("$..*[?(@.name == 'goodList')].selectConfig"); +// jsonContext.delete("$..*[?(@.name == 'goodList')].goodsSort.list"); +// jsonContext.delete("$..*[?(@.name == 'goodList')].goodsList.list[*].attrValue"); +// jsonContext.delete("$..*[?(@.name == 'homeTab')].activeValueBrand"); +// jsonContext.delete("$..*[?(@.name == 'homeTab')].goodsList"); +// jsonContext.delete("$..*[?(@.name == 'homeTab')].selectConfig"); +// jsonContext.delete("$..*[?(@.name == 'homeTab')].productList..*.goods[*].attrValue"); + + PageDiyResponse response = new PageDiyResponse(); + BeanUtils.copyProperties(pageDiy, response); +// String modifiedJsonString = getModifiedJsonString(jsonContext.jsonString()); +// response.setValue(JSON.parseObject(modifiedJsonString)); + response.setValue(JSON.parseObject(pageDiy.getValue())); + return response; + } + + /** + * 检查diy模版名称唯一 + * @param pageDiyName 当前要检查的模版名称 + * @param id 更新时的 diy id + */ + private void checkPageDiyNameUnique(String pageDiyName, Integer id) { + LambdaQueryWrapper pageDiyLambdaQueryWrapper = Wrappers.lambdaQuery(); + pageDiyLambdaQueryWrapper.eq(PageDiy::getName, pageDiyName); + if(ObjectUtil.isNotNull(id)){ + pageDiyLambdaQueryWrapper.ne(PageDiy::getId, id); + } + List pageDiyNameExist = mapper.selectList(pageDiyLambdaQueryWrapper); + if(ObjectUtil.isNotNull(pageDiyNameExist) && !pageDiyNameExist.isEmpty()){ + throw new YztException(CommonResultCode.VALIDATE_FAILED, "当前模版名称已经存在,请修改后再保存!"); + } + } + +////////////////////////////////// 内部处理json配置中的素材地址方法 START + + /** + * 调用diy配置数据后结合本地配置,传递给递归方法替换 + * @param diyValue 当前待操作的diy对象,其实仅仅用到了value + * @return 替换后的json对象 + */ + private String getModifiedJsonString(String diyValue) { + // 使用 Gson 解析 JSON 数据 + Gson gson = new Gson(); + JsonElement jsonElement = gson.fromJson(diyValue, JsonElement.class); + + // 替换指定前缀的键 + String adminApiPath = UploadConstants.UPLOAD_FILE_KEYWORD; + String newPrefix = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_LOCAL_UPLOAD_URL); + JsonElement modifiedJsonElement = replaceJsonValue(jsonElement, adminApiPath, newPrefix); + + // 将修改后的 JSON 数据转换回字符串 + return gson.toJson(modifiedJsonElement); + } + + /** + * 根据系统关键字匹配素材前缀,匹配后追加系统中对应的素材前缀 + * @param jsonElement 当前操作的json对象 + * @param keyword 匹配的关键字 + * @param newValue 需要追加的前缀 + * @return 操作后的正确json数据 + */ + private JsonElement replaceJsonValue(JsonElement jsonElement, String keyword, String newValue) { + if (jsonElement.isJsonObject()) { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + JsonObject newJsonObject = new JsonObject(); + for (String key : jsonObject.keySet()) { + JsonElement value = jsonObject.get(key); + if (value.isJsonPrimitive() && value.getAsString().startsWith(keyword)) { + newJsonObject.addProperty(key, newValue + "/" + value.getAsString()); + } else { + newJsonObject.add(key, replaceJsonValue(value, keyword, newValue)); // 递归处理子元素 + } + } + return newJsonObject; + } else if (jsonElement.isJsonArray()) { + // 如果数组元素也可能含有关键字,可以按需处理 + JsonArray jsonArray = jsonElement.getAsJsonArray(); + JsonArray newJsonArray = new JsonArray(); + for (JsonElement element : jsonArray) { + newJsonArray.add(replaceJsonValue(element, keyword, newValue)); // 递归处理数组元素 + } + return newJsonArray; + } else { + return jsonElement; + } + } + + ////////////////////////////////// 内部处理json配置中的素材地址方法 END +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/PageLayoutServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/PageLayoutServiceImpl.java new file mode 100644 index 0000000..0237e2a --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/PageLayoutServiceImpl.java @@ -0,0 +1,337 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysGroupDataConstants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemGroupData; +import com.yzt.common.request.SystemFormItemCheckRequest; +import com.yzt.common.response.pagelayout.PageLayoutBottomNavigationResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.service.PageLayoutService; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.SystemGroupDataService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 页面布局接口实现类 + * fw_ + */ +@Service +public class PageLayoutServiceImpl implements PageLayoutService { + + @Autowired + private SystemGroupDataService systemGroupDataService; + @Autowired + private TransactionTemplate transactionTemplate; + @Autowired + private SystemAttachmentService systemAttachmentService; + @Autowired + private SystemConfigService systemConfigService; + + /** + * 页面首页 + * @return 首页信息 + */ + @Override + public HashMap index() { + HashMap map = CollUtil.newHashMap(); + // 首页banner + List bannerList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_BANNER); + map.put("indexBanner", convertData(bannerList)); + // 首页金刚区 + List menuList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_MENU); + map.put("indexMenu", convertData(menuList)); + // 首页新闻 + List newsList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER); + map.put("indexNews", convertData(newsList)); + + // 我的页服务 + List userMenuList = systemGroupDataService.findListByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_MENU); + map.put("userMenu", convertData(userMenuList)); + // 我的页banner + List userBannerList = systemGroupDataService.findListByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_BANNER); + map.put("userBanner", convertData(userBannerList)); + return map; + } + + /** + * 首页保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean save(JSONObject jsonObject) { + List dataList = CollUtil.newArrayList(); + + if (StrUtil.isNotBlank(jsonObject.getString("indexBanner"))) { + List indexBanner = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexBanner")); + dataList.addAll(convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_BANNER)); + } + if (StrUtil.isNotBlank(jsonObject.getString("indexMenu"))) { + List indexMenu = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexMenu")); + dataList.addAll(convertGroupData(indexMenu, Constants.GROUP_DATA_ID_INDEX_MENU)); + } + if (StrUtil.isNotBlank(jsonObject.getString("indexNews"))) { + List indexNews = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexNews")); + dataList.addAll(convertGroupData(indexNews, Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER)); + } + if (StrUtil.isNotBlank(jsonObject.getString("userMenu"))) { + List userMenu = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userMenu")); + dataList.addAll(convertGroupData(userMenu, Constants.GROUP_DATA_ID_USER_CENTER_MENU)); + } + if (StrUtil.isNotBlank(jsonObject.getString("userBanner"))) { + List userBanner = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userBanner")); + dataList.addAll(convertGroupData(userBanner, Constants.GROUP_DATA_ID_USER_CENTER_BANNER)); + } + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_BANNER); + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_MENU); + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER); + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_MENU); + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_BANNER); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面首页banner保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean indexBannerSave(JSONObject jsonObject) { + List indexBanner = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexBanner")); + List dataList = convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_BANNER); + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_BANNER); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面首页menu保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean indexMenuSave(JSONObject jsonObject) { + List indexMenu = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexMenu")); + List dataList = convertGroupData(indexMenu, Constants.GROUP_DATA_ID_INDEX_MENU); + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_MENU); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面首页新闻保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean indexNewsSave(JSONObject jsonObject) { + List indexNews = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexNews")); + List dataList = convertGroupData(indexNews, Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER); + if (StrUtil.isNotBlank(jsonObject.getString("indexNews"))) { + } + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面用户中心banner保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean userBannerSave(JSONObject jsonObject) { + List userBanner = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userBanner")); + List dataList = convertGroupData(userBanner, Constants.GROUP_DATA_ID_USER_CENTER_BANNER); + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_BANNER); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面用户中心导航保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean userMenuSave(JSONObject jsonObject) { + List userMenu = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userMenu")); + List dataList = convertGroupData(userMenu, Constants.GROUP_DATA_ID_USER_CENTER_MENU); + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_MENU); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 页面用户中心商品table保存 + * @param jsonObject 数据 + * @return Boolean + */ + @Override + public Boolean indexTableSave(JSONObject jsonObject) { + List indexBanner = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexTable")); + List dataList = convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_EX_BANNER); + Boolean execute = transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_EX_BANNER); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 转换组合数据 + * @param jsonObjectList 数组 + * @param gid gid + * @return List + */ + private List convertGroupData(List jsonObjectList, Integer gid) { + return jsonObjectList.stream().map(e -> { + SystemGroupData groupData = new SystemGroupData(); + if (e.containsKey("id") && ObjectUtil.isNotNull(e.getInteger("id"))) { + groupData.setId(e.getInteger("id")); + } + groupData.setGid(gid); + groupData.setSort(e.getInteger("sort")); + groupData.setStatus(e.getBoolean("status")); + // 组装json + Map jsonMap = CollUtil.newHashMap(); + jsonMap.put("id", e.getInteger("tempid")); + jsonMap.put("sort", groupData.getSort()); + jsonMap.put("status", groupData.getStatus()); + List> mapList = CollUtil.newArrayList(); + e.remove("id"); + e.remove("gid"); + e.remove("sort"); + e.remove("status"); + e.remove("tempid"); + e.forEach((key, value) -> { + Map map = CollUtil.newHashMap(); + map.put("name", key); + map.put("title", key); + map.put("value", value); + if (String.valueOf(value).contains(UploadConstants.UPLOAD_FILE_KEYWORD)) { + String values = systemAttachmentService.clearPrefix(String.valueOf(value)); + map.put("value", values); + } + mapList.add(map); + }); + jsonMap.put("fields", mapList); + groupData.setValue(JSONObject.toJSONString(jsonMap)); + return groupData; + }).collect(Collectors.toList()); + } + + /** + * 转换数据 + * @param dataList 数据列表 + * @return List + */ + private List> convertData(List dataList) { + return dataList.stream().map(data -> { + HashMap map = CollUtil.newHashMap(); + map.put("id", data.getId()); + map.put("gid", data.getGid()); + map.put("sort", data.getSort()); + map.put("status", data.getStatus()); + JSONObject jsonObject = JSONObject.parseObject(data.getValue()); + List systemFormItemCheckRequestList = YztUtil.jsonToListClass(jsonObject.getString("fields"), SystemFormItemCheckRequest.class); + systemFormItemCheckRequestList.forEach(e -> { + map.put(e.getName(), e.getValue()); + }); + map.put("tempid", jsonObject.getInteger("id")); + return map; + }).collect(Collectors.toList()); + + + } + + /** + * 获取页面底部导航信息 + */ + @Override + public PageLayoutBottomNavigationResponse getBottomNavigation() { + PageLayoutBottomNavigationResponse response = new PageLayoutBottomNavigationResponse(); + // 个人中心页服务 + List dataList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION); + response.setBottomNavigationList(convertData(dataList)); + + // 是否自定义 + String isCustom = systemConfigService.getValueByKey(Constants.CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM); + response.setIsCustom(isCustom); + return response; + } + + /** + * 页面底部导航信息保存 + * @return 保存结果 + */ + @Override + public Boolean bottomNavigationSave(JSONObject jsonObject) { + String isCustom = jsonObject.getString("isCustom"); + if (StrUtil.isBlank(isCustom)) { + throw new YztException("请选择是否自定义"); + } + List bottomNavigationList = YztUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("bottomNavigationList")); + if (CollUtil.isEmpty(bottomNavigationList)) { + throw new YztException("请传入底部导航数据"); + } + List dataList = convertGroupData(bottomNavigationList, Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION); + return transactionTemplate.execute(e -> { + // 先删除历史数据 + systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION); + // 保存新数据 + systemGroupDataService.saveBatch(dataList, 100); + + systemConfigService.updateOrSaveValueByName(Constants.CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM, isCustom); + return Boolean.TRUE; + }); + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/QiNiuServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/QiNiuServiceImpl.java new file mode 100644 index 0000000..6f96798 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/QiNiuServiceImpl.java @@ -0,0 +1,74 @@ +package com.yzt.service.service.impl; + +import com.qiniu.common.QiniuException; +import com.qiniu.http.Response; +import com.qiniu.storage.UploadManager; +import com.yzt.common.exception.YztException; +import com.yzt.common.vo.CloudVo; +import com.yzt.service.service.QiNiuService; +import com.yzt.service.service.SystemAttachmentService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.io.File; + + +/** + * AsyncServiceImpl 同步到云服务 + * + */ +@Service +public class QiNiuServiceImpl implements QiNiuService { + private static final Logger logger = LoggerFactory.getLogger(QiNiuServiceImpl.class); + + @Lazy + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 同步到七牛云 + * @param cloudVo CloudVo + * + * @since 2020-05-06 + */ + @Async + @Override + public void upload(UploadManager uploadManager, CloudVo cloudVo, String upToken, String webPth, String localFile, Integer id) { + try { + logger.info("上传文件" + id + "开始:" + localFile); + + File file = new File(localFile); + if(!file.exists()){ + logger.info("上传文件"+ id + localFile + "不存在:"); + return; + } + + Response put = uploadManager.put(localFile, webPth, upToken); + put.close(); + logger.info("上传文件" + id + " -- 结束:" + put.address); + //更新数据库 + systemAttachmentService.updateCloudType(id, 2); + } catch (QiniuException ex) { + throw new YztException(ex.getMessage()); + } + } + + @Override + public void uploadFile(UploadManager uploadManager, String upToken, String webPth, String localFile, File file) { + try { + if(!file.exists()){ + logger.error("上传文件" + localFile + "不存在:"); + return; + } + Response put = uploadManager.put(file, webPth, upToken); + put.close(); + } catch (QiniuException ex) { + throw new YztException(ex.getMessage()); + } + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/QrCodeServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/QrCodeServiceImpl.java new file mode 100644 index 0000000..351579c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/QrCodeServiceImpl.java @@ -0,0 +1,167 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.exception.YztException; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.QRCodeUtil; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.vo.QrCodeVo; +import com.yzt.service.service.QrCodeService; +import com.yzt.service.service.WechatNewService; +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + +/** +* QrCodeServiceImpl 接口实现 +* fw_ +*/ +@Service +public class QrCodeServiceImpl implements QrCodeService { + @Autowired + private RestTemplateUtil restTemplateUtil; + @Autowired + private WechatNewService wechatNewService; + + /** + * 二维码 + * + * @return QrCodeVo + */ + @Override + public QrCodeVo getWecahtQrCode(JSONObject data) { +// StringBuilder scene = new StringBuilder(); +// String page = ""; +// try { +// if (ObjectUtil.isNotNull(data)) { +// Map dataMap = JSONObject.toJavaObject(data, Map.class); +// +// for (Map.Entry m : dataMap.entrySet()) { +// if (m.getKey().equals("path")) { +// //前端路由, 不需要拼参数 +// page = m.getValue().toString(); +// continue; +// } +// if (scene.length() > 0) { +// scene.append(","); +// } +// scene.append(m.getKey()).append(":").append(m.getValue()); +// } +// } +// } catch (Exception e) { +// throw new YztException("url参数错误 " + e.getMessage()); +// } + if (ObjectUtil.isNull(data) || data.isEmpty()) + throw new YztException(CommonResultCode.VALIDATE_FAILED, "生成微信参数不能为空"); + QrCodeVo vo = new QrCodeVo(); + vo.setCode(wechatNewService.createQrCode(data)); + return vo; + } + + /** + * 远程图片转base64 + * + * @param url 图片链接地址 + * @return QrCodeVo + */ + @Override + public QrCodeVo urlToBase64(String url) { + HttpResponse httpResponse = HttpRequest.get(url).execute(); + byte[] bytes = httpResponse.bodyBytes(); + ; + String base64Image = YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + QrCodeVo vo = new QrCodeVo(); + vo.setCode(base64Image); + return vo; + } + + /** + * 字符串转base64 + * + * @param text 待转换字符串 + * @return QrCodeVo base64格式 + */ + @Override + public QrCodeVo strToBase64(String text, Integer width, Integer height) { + if ((width < 50 || height < 50) && (width > 500 || height > 500) && text.length() >= 999) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "生成二维码参数不合法"); + } + String base64Image; + try { + base64Image = QRCodeUtil.crateQRCode(text, width, height); + } catch (Exception e) { + throw new YztException("生成二维码异常"); + } + QrCodeVo vo = new QrCodeVo(); + vo.setCode(base64Image); + return vo; + } + + /** + * 二维码 + * @return Object + */ + @Override + public Map get(JSONObject data) { + Map map = new HashMap<>(); + StringBuilder scene = new StringBuilder(); + String page = ""; + try{ + if(null != data){ + Map dataMap = JSONObject.toJavaObject(data, Map.class); + + for (Map.Entry m : dataMap.entrySet()) { + if(m.getKey().equals("path")){ + //前端路由, 不需要拼参数 + page = m.getValue().toString(); + continue; + } + if (scene.length() > 0) { + scene.append(","); + } + scene.append(m.getKey()).append(":").append(m.getValue()); + } + } + }catch (Exception e){ + throw new YztException("url参数错误 " + e.getMessage()); + } + map.put("code", wechatNewService.createQrCode(page, scene.length() > 0 ? scene.toString() : "")); + return map; + } + + @Override + public Map base64(String url) { + byte[] bytes = restTemplateUtil.getBuffer(url); + String base64Image = YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + Map map = new HashMap<>(); + map.put("code", base64Image); + return map; + } + + /** + * 讲字符串转为QRcode + * @param text 待转换字符串 + * @return QRcode base64格式 + */ + @Override + public Map base64String(String text,int width, int height) { + + String base64Image = null; + try { + base64Image = QRCodeUtil.crateQRCode(text,width,height); + }catch (Exception e){ + throw new YztException("生成二维码异常"); + } + Map map = new HashMap<>(); + map.put("code", base64Image); + return map; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/RechargePayServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/RechargePayServiceImpl.java new file mode 100644 index 0000000..26f37e6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/RechargePayServiceImpl.java @@ -0,0 +1,79 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.RechargePayService; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserRechargeService; +import com.yzt.service.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; + + +/** + * 支付类 + * + */ +@Service +public class RechargePayServiceImpl implements RechargePayService { + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBillService userBillService; + + /** + * 支付成功处理 + * 增加余额,userBill记录 + * @param userRecharge 充值订单 + */ + @Override + public Boolean paySuccess(UserRecharge userRecharge) { + userRecharge.setPaid(true); + userRecharge.setPayTime(YztDateUtil.nowDateTime()); + + User user = userService.getById(userRecharge.getUid()); + + BigDecimal payPrice = userRecharge.getPrice().add(userRecharge.getGivePrice()); + BigDecimal balance = user.getNowMoney().add(payPrice); + // 余额变动对象 + UserBill userBill = new UserBill(); + userBill.setUid(userRecharge.getUid()); + userBill.setLinkId(userRecharge.getOrderId()); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_PERSONAL_RECHARGE); + userBill.setPm(1); + userBill.setTitle("充值支付"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_PAY_RECHARGE); + userBill.setNumber(payPrice); + userBill.setBalance(balance); + userBill.setMark(StrUtil.format("余额增加了{}元", payPrice)); + userBill.setStatus(1); + userBill.setCreateTime(YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 订单变动 + userRechargeService.updateById(userRecharge); + // 余额变动 + userService.operationNowMoney(user.getUid(), payPrice, user.getNowMoney(), "add"); + // 创建记录 + userBillService.save(userBill); + return Boolean.TRUE; + }); + return execute; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/RetailShopServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/RetailShopServiceImpl.java new file mode 100644 index 0000000..42efda1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/RetailShopServiceImpl.java @@ -0,0 +1,161 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.RetailShopRequest; +import com.yzt.common.response.SpreadUserResponse; +import com.yzt.common.response.UserExtractResponse; +import com.yzt.service.mapper.UserMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * RetailShopServiceImpl 接口实现 分销业务实现 + * + */ +@Service +public class RetailShopServiceImpl extends ServiceImpl implements RetailShopService { + + @Autowired + private UserService userService; + + @Autowired + private UserExtractService userExtractService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + /** + * 获取分销列表 + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + */ + @Override + public CommonPage getSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest) { + Page pageUserPage = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + // id,头像,昵称,姓名,电话,推广用户数,推广订单数,推广订单额,佣金总金额,已提现金额,提现次数,未提现金额,上级推广人 + PageInfo userPageInfo = userService.getAdminSpreadPeopleList(keywords, dateLimit, pageRequest); + + if (CollUtil.isEmpty(userPageInfo.getList())) { + return CommonPage.restPage(new PageInfo<>()); + } + List userList = userPageInfo.getList(); + List responseList = CollUtil.newArrayList(); + userList.forEach(user -> { + SpreadUserResponse userResponse = new SpreadUserResponse(); + BeanUtils.copyProperties(user, userResponse); + // 上级推广员名称 + userResponse.setSpreadNickname("无"); + if (ObjectUtil.isNotNull(user.getSpreadUid()) && user.getSpreadUid() > 0) { + User spreadUser = userService.getById(user.getSpreadUid()); + userResponse.setSpreadNickname(Optional.ofNullable(spreadUser.getNickname()).orElse("--")); + } + + List recordList = userBrokerageRecordService.getSpreadListByUid(user.getUid()); + if (CollUtil.isEmpty(recordList)) { + // 推广订单数 + userResponse.setSpreadOrderNum(0); + // 推广订单额 + userResponse.setSpreadOrderTotalPrice(BigDecimal.ZERO); + // 佣金总金额 + userResponse.setTotalBrokeragePrice(BigDecimal.ZERO); + // 已提现金额 + userResponse.setExtractCountPrice(BigDecimal.ZERO); + // 提现次数 + userResponse.setExtractCountNum(0); + // 冻结中佣金 + userResponse.setFreezeBrokeragePrice(BigDecimal.ZERO); + } else { + // 推广订单数 + userResponse.setSpreadOrderNum(recordList.size()); + // 佣金总金额 + userResponse.setTotalBrokeragePrice(recordList.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add)); + // 推广订单额 + List orderNoList = recordList.stream().map(UserBrokerageRecord::getLinkId).collect(Collectors.toList()); + BigDecimal spreadOrderTotalPrice = storeOrderService.getSpreadOrderTotalPriceByOrderList(orderNoList); + userResponse.setSpreadOrderTotalPrice(spreadOrderTotalPrice); + + UserExtractResponse extractResponse = userExtractService.getUserExtractByUserId(user.getUid()); + // 已提现金额 + userResponse.setExtractCountPrice(extractResponse.getExtractCountPrice()); + // 提现次数 + userResponse.setExtractCountNum(extractResponse.getExtractCountNum()); + // 冻结中佣金 + userResponse.setFreezeBrokeragePrice(userBrokerageRecordService.getFreezePrice(user.getUid())); + } + responseList.add(userResponse); + }); + PageInfo responsePageInfo = CommonPage.copyPageInfo(pageUserPage, responseList); + responsePageInfo.setTotal(userPageInfo.getTotal()); + responsePageInfo.setPages(userPageInfo.getPages()); + return CommonPage.restPage(responsePageInfo); + } + + /** + * 获取分销配置信息 + * @return 返回配置信息 + */ + @Override + public RetailShopRequest getManageInfo() { +// List keys = initKeys(); + RetailShopRequest response = new RetailShopRequest(); + response.setBrokerageFuncStatus(Integer.parseInt(systemConfigService.getValueByKey("brokerage_func_status"))); +// response.setStoreBrokerageStatus(systemConfigService.getValueByKey(keys.get(1))); + response.setStoreBrokerageRatio(Integer.parseInt(systemConfigService.getValueByKey("store_brokerage_ratio"))); + response.setStoreBrokerageTwo(Integer.parseInt(systemConfigService.getValueByKey("store_brokerage_two"))); + response.setUserExtractMinPrice(new BigDecimal(systemConfigService.getValueByKey("user_extract_min_price"))); + response.setUserExtractBank(systemConfigService.getValueByKey("user_extract_bank").replace("\\n","\n")); + response.setExtractTime(Integer.parseInt(systemConfigService.getValueByKey("extract_time"))); + response.setStoreBrokerageQuota(Integer.parseInt(systemConfigService.getValueByKey("store_brokerage_quota"))); + response.setStoreBrokerageIsBubble(Integer.parseInt(systemConfigService.getValueByKey("store_brokerage_is_bubble"))); + response.setBrokerageBindind(Integer.parseInt(systemConfigService.getValueByKey("brokerage_bindind"))); + return response; + } + + /** + * 更新分销配置信息 + * @param retailShopRequest 待保存数据 + * @return 更新结果 + */ + @Override + public boolean setManageInfo(RetailShopRequest retailShopRequest) { + // 返佣比例之和+起来不能超过100% + int ration = retailShopRequest.getStoreBrokerageTwo() + retailShopRequest.getStoreBrokerageRatio(); + if (ration > 100 || ration < 0) throw new YztException("返佣比例加起来不能超过100%"); + + systemConfigService.updateOrSaveValueByName("brokerage_func_status", retailShopRequest.getBrokerageFuncStatus().toString()); + systemConfigService.updateOrSaveValueByName("store_brokerage_ratio", retailShopRequest.getStoreBrokerageRatio().toString()); + systemConfigService.updateOrSaveValueByName("store_brokerage_two", retailShopRequest.getStoreBrokerageTwo().toString()); + systemConfigService.updateOrSaveValueByName("user_extract_min_price", retailShopRequest.getUserExtractMinPrice().toString()); + systemConfigService.updateOrSaveValueByName("user_extract_bank", retailShopRequest.getUserExtractBank()); + systemConfigService.updateOrSaveValueByName("extract_time", retailShopRequest.getExtractTime().toString()); + systemConfigService.updateOrSaveValueByName("brokerage_bindind", retailShopRequest.getBrokerageBindind().toString()); + systemConfigService.updateOrSaveValueByName("store_brokerage_quota", retailShopRequest.getStoreBrokerageQuota().toString()); + systemConfigService.updateOrSaveValueByName("store_brokerage_is_bubble", retailShopRequest.getStoreBrokerageIsBubble().toString()); + return true; + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SafetyServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SafetyServiceImpl.java new file mode 100644 index 0000000..04d4790 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SafetyServiceImpl.java @@ -0,0 +1,69 @@ +package com.yzt.service.service.impl; + +import com.anji.captcha.model.common.ResponseModel; +import com.anji.captcha.model.vo.CaptchaVO; +import com.anji.captcha.service.CaptchaService; +import com.anji.captcha.util.StringUtils; +import com.yzt.service.service.SafetyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; + +/** + * 行为验证码 + * + * @version 1.0.0 + * @Date 2025/6/12 + */ +@Service +public class SafetyServiceImpl implements SafetyService { + + @Autowired(required = false) + private CaptchaService captchaService; + + /** + * 获取行为验证码 + */ + @Override + public ResponseModel getSafetyCode(CaptchaVO data, HttpServletRequest request) { + assert request.getRemoteHost() != null; + data.setBrowserInfo(getRemoteId(request)); + return captchaService.get(data); + } + + /** + * 验证行为验证码 + */ + @Override + public ResponseModel checkSafetyCode(CaptchaVO data, HttpServletRequest request) { + data.setBrowserInfo(getRemoteId(request)); + return captchaService.check(data); + } + + /** + * 行为验证码二次校验 + */ + @Override + public ResponseModel verifySafetyCode(CaptchaVO data) { + return captchaService.verification(data); + } + + public static final String getRemoteId(HttpServletRequest request) { + String xfwd = request.getHeader("X-Forwarded-For"); + String ip = getRemoteIpFromXfwd(xfwd); + String ua = request.getHeader("user-agent"); + if (StringUtils.isNotBlank(ip)) { + return ip + ua; + } + return request.getRemoteAddr() + ua; + } + + private static String getRemoteIpFromXfwd(String xfwd) { + if (StringUtils.isNotBlank(xfwd)) { + String[] ipList = xfwd.split(","); + return StringUtils.trim(ipList[0]); + } + return null; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesFreeServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesFreeServiceImpl.java new file mode 100644 index 0000000..b0cacb9 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesFreeServiceImpl.java @@ -0,0 +1,180 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONArray; +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.service.impl.ServiceImpl; +import com.yzt.common.model.express.ShippingTemplatesFree; +import com.yzt.common.request.ShippingTemplatesFreeRequest; +import com.yzt.common.response.ShippingTemplatesFreeResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.ShippingTemplatesFreeMapper; +import com.yzt.service.service.ShippingTemplatesFreeService; +import com.yzt.service.service.SystemCityService; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * ShippingTemplatesFreeServiceImpl 接口实现 + * + */ +@Service +public class ShippingTemplatesFreeServiceImpl extends ServiceImpl implements ShippingTemplatesFreeService { + + @Resource + private ShippingTemplatesFreeMapper mapper; + + @Autowired + private SystemCityService systemCityService; + + private List cityIdList; + + /** + * 保存配送区域 + * + * @param shippingTemplatesFreeRequestList List 运费集合 + * @param type Integer 计费方式 + * @param tempId Integer 运费模板id + */ + @Override + public Boolean saveAll(List shippingTemplatesFreeRequestList, Integer type, Integer tempId) { + ArrayList shippingTemplatesFreesList = new ArrayList<>(); + for (ShippingTemplatesFreeRequest shippingTemplatesFreeRequest : shippingTemplatesFreeRequestList) { + String uniqueKey = DigestUtils.md5Hex(shippingTemplatesFreeRequest.toString()); + List titleArray = JSONArray.parseArray(shippingTemplatesFreeRequest.getTitle(), String.class); + if (shippingTemplatesFreeRequest.getCityId().equals("all") || shippingTemplatesFreeRequest.getCityId().equals("0")) { + ShippingTemplatesFree shippingTemplatesFree = new ShippingTemplatesFree(); + shippingTemplatesFree.setCityId(0); + shippingTemplatesFree.setTitle(titleArray.get(0)); + shippingTemplatesFree.setUniqid(uniqueKey); + shippingTemplatesFree.setTempId(tempId); + shippingTemplatesFree.setType(type); + shippingTemplatesFree.setStatus(true); + shippingTemplatesFree.setNumber(shippingTemplatesFreeRequest.getNumber()); + shippingTemplatesFree.setPrice(shippingTemplatesFreeRequest.getPrice()); + shippingTemplatesFreesList.add(shippingTemplatesFree); + } else { + cityIdList = YztUtil.stringToArray(shippingTemplatesFreeRequest.getCityId()); + Map cityMap = new HashMap<>(); + titleArray.forEach(e -> { + JSONArray parseArray = JSONArray.parseArray(e); + Integer cityId = parseArray.getInteger(2); + cityMap.put(cityId, e); + }); + for (Integer cityId : cityIdList) { + ShippingTemplatesFree shippingTemplatesFree = new ShippingTemplatesFree(); + shippingTemplatesFree.setCityId(cityId); + shippingTemplatesFree.setTitle(cityMap.get(cityId)); + shippingTemplatesFree.setUniqid(uniqueKey); + shippingTemplatesFree.setTempId(tempId); + shippingTemplatesFree.setType(type); + shippingTemplatesFree.setNumber(shippingTemplatesFreeRequest.getNumber()); + shippingTemplatesFree.setPrice(shippingTemplatesFreeRequest.getPrice()); + shippingTemplatesFree.setStatus(true); + shippingTemplatesFreesList.add(shippingTemplatesFree); + } + } + } + //批量保存模板数据 + return saveBatch(shippingTemplatesFreesList); + } + + /** + * 获取所有城市cityId + * + * @return List + + */ + private List getCityIdList() { + if (this.cityIdList == null || this.cityIdList.size() < 1) { + this.cityIdList = systemCityService.getCityIdList(); + } + return this.cityIdList; + } + + /** + * 把模板下的所有数据标记为无效 + * + * @param tempId Integer 运费模板id + * + * @since 2020-05-20 + */ + private void updateStatus(Integer tempId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ShippingTemplatesFree::getTempId, tempId); + + ShippingTemplatesFree shippingTemplatesFree = new ShippingTemplatesFree(); + shippingTemplatesFree.setStatus(false); + update(shippingTemplatesFree, lambdaQueryWrapper); + } + + /** + * 删除模板下的无效数据 + * + * @param tempId Integer 运费模板id + */ + @Override + public Boolean deleteByTempId(Integer tempId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(ShippingTemplatesFree::getTempId, tempId); + return mapper.delete(wrapper) > 0; + } + + /** + * 根据模板编号、城市ID查询 + * + * @param tempId 模板编号 + * @param cityId 城市ID + * @return 运费模板 + */ + @Override + public ShippingTemplatesFree getByTempIdAndCityId(Integer tempId, Integer cityId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(ShippingTemplatesFree::getTempId, tempId); + lqw.eq(ShippingTemplatesFree::getCityId, cityId); + lqw.eq(ShippingTemplatesFree::getStatus, true); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 分组查询 + * + * @param tempId Integer 运费模板id + * @return List + */ + @Override + public List getListGroup(Integer tempId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(ShippingTemplatesFree::getTitle, ShippingTemplatesFree::getNumber, ShippingTemplatesFree::getPrice, + ShippingTemplatesFree::getUniqid); + lqw.eq(ShippingTemplatesFree::getTempId, tempId); + List list = mapper.selectList(lqw); + List responseList = CollUtil.newArrayList(); + if (CollUtil.isEmpty(list)) { + return responseList; + } + Map> listMap = list.stream().collect(Collectors.groupingBy(ShippingTemplatesFree::getUniqid, LinkedHashMap::new, Collectors.toList())); + Set>> entrySet = listMap.entrySet(); + for (Map.Entry> entry : entrySet) { + String uniqid = entry.getKey(); + String title = entry.getValue().stream().map(ShippingTemplatesFree::getTitle).collect(Collectors.joining(",")); + ShippingTemplatesFree free = entry.getValue().get(0); + ShippingTemplatesFreeResponse response = new ShippingTemplatesFreeResponse(); + response.setTitle(title); + response.setUniqid(uniqid); + response.setNumber(free.getNumber()); + response.setPrice(free.getPrice()); + responseList.add(response); + } + return responseList; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesRegionServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesRegionServiceImpl.java new file mode 100644 index 0000000..e4561e5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesRegionServiceImpl.java @@ -0,0 +1,215 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONArray; +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.service.impl.ServiceImpl; +import com.yzt.common.model.express.ShippingTemplatesRegion; +import com.yzt.common.request.ShippingTemplatesRegionRequest; +import com.yzt.common.response.ShippingTemplatesRegionResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.ShippingTemplatesRegionMapper; +import com.yzt.service.service.ShippingTemplatesRegionService; +import com.yzt.service.service.SystemCityService; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.util.*; +import java.util.stream.Collectors; + +/** + * ShippingTemplatesRegionServiceImpl 接口实现 + * + */ +@Service +public class ShippingTemplatesRegionServiceImpl extends ServiceImpl implements ShippingTemplatesRegionService { + + @Resource + private ShippingTemplatesRegionMapper mapper; + + @Autowired + private SystemCityService systemCityService; + + private List cityIdList; + + @Override + public List listByIds(Collection idList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(ShippingTemplatesRegion::getTempId, idList); + lqw.orderByAsc(ShippingTemplatesRegion::getCityId); + return mapper.selectList(lqw); + } + + /** + * 保存配送区域及运费 + * + * @param shippingTemplatesRegionRequestList List 运费集合 + * @param type Integer 计费方式 + * @param tempId Integer 运费模板id + */ + @Override + public Boolean saveAll(List shippingTemplatesRegionRequestList, Integer type, Integer tempId) { + ArrayList shippingTemplatesRegionList = new ArrayList<>(); + for (ShippingTemplatesRegionRequest shippingTemplatesRegionRequest : shippingTemplatesRegionRequestList) { + String uniqueKey = DigestUtils.md5Hex(shippingTemplatesRegionRequest.toString()); + List titleArray = JSONArray.parseArray(shippingTemplatesRegionRequest.getTitle(), String.class); + if (shippingTemplatesRegionRequest.getCityId().equals("all") || shippingTemplatesRegionRequest.getCityId().equals("0")) { + ShippingTemplatesRegion shippingTemplatesRegion = new ShippingTemplatesRegion(); + shippingTemplatesRegion.setCityId(0); + shippingTemplatesRegion.setTitle(titleArray.get(0)); + shippingTemplatesRegion.setUniqid(uniqueKey); + shippingTemplatesRegion.setRenewal(shippingTemplatesRegionRequest.getRenewal()); + shippingTemplatesRegion.setRenewalPrice(shippingTemplatesRegionRequest.getRenewalPrice()); + shippingTemplatesRegion.setFirst(shippingTemplatesRegionRequest.getFirst()); + shippingTemplatesRegion.setFirstPrice(shippingTemplatesRegionRequest.getFirstPrice()); + shippingTemplatesRegion.setTempId(tempId); + shippingTemplatesRegion.setType(type); + shippingTemplatesRegion.setStatus(true); + shippingTemplatesRegionList.add(shippingTemplatesRegion); + } else { + List cityIdList = YztUtil.stringToArray(shippingTemplatesRegionRequest.getCityId()); + Map cityMap = new HashMap<>(); + titleArray.forEach(e -> { + JSONArray parseArray = JSONArray.parseArray(e); + Integer cityId = parseArray.getInteger(2); + cityMap.put(cityId, e); + }); + for (Integer cityId : cityIdList) { + ShippingTemplatesRegion shippingTemplatesRegion = new ShippingTemplatesRegion(); + shippingTemplatesRegion.setCityId(cityId); + shippingTemplatesRegion.setTitle(cityMap.get(cityId)); + shippingTemplatesRegion.setUniqid(uniqueKey); + shippingTemplatesRegion.setRenewal(shippingTemplatesRegionRequest.getRenewal()); + shippingTemplatesRegion.setRenewalPrice(shippingTemplatesRegionRequest.getRenewalPrice()); + shippingTemplatesRegion.setFirst(shippingTemplatesRegionRequest.getFirst()); + shippingTemplatesRegion.setFirstPrice(shippingTemplatesRegionRequest.getFirstPrice()); + shippingTemplatesRegion.setTempId(tempId); + shippingTemplatesRegion.setType(type); + shippingTemplatesRegion.setStatus(true); + shippingTemplatesRegionList.add(shippingTemplatesRegion); + } + } + } + //批量保存模板数据 + return saveBatch(shippingTemplatesRegionList); + } + + @Override + public Boolean deleteByTempId(Integer tempId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(ShippingTemplatesRegion::getTempId, tempId); + return mapper.delete(wrapper) > 0; + } + + /** + * 获取所有城市cityId + * + * @return List + + */ + private List getCityIdList() { + if (this.cityIdList == null || this.cityIdList.size() < 1) { + this.cityIdList = systemCityService.getCityIdList(); + } + return this.cityIdList; + } + + /** + * 把模板下的所有数据标记为无效 + * + * @param tempId Integer 运费模板id + */ + private Boolean updateStatus(Integer tempId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.set(ShippingTemplatesRegion::getStatus, false); + wrapper.eq(ShippingTemplatesRegion::getTempId, tempId); + return update(wrapper); + } + + /** + * 删除模板下的无效数据 + * + * @param tempId Integer 运费模板id + * @return Boolean + */ + @Override + public Boolean delete(Integer tempId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ShippingTemplatesRegion::getTempId, tempId); + lambdaQueryWrapper.eq(ShippingTemplatesRegion::getStatus, false); + return mapper.delete(lambdaQueryWrapper) > 0; + } + + /** + * 根据模板编号、城市ID查询 + * + * @param tempId 模板编号 + * @param cityId 城市ID + * @return 运费模板 + */ + @Override + public ShippingTemplatesRegion getByTempIdAndCityId(Integer tempId, Integer cityId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(ShippingTemplatesRegion::getTempId, tempId); + lambdaQueryWrapper.eq(ShippingTemplatesRegion::getCityId, cityId); + lambdaQueryWrapper.eq(ShippingTemplatesRegion::getStatus, true); + lambdaQueryWrapper.orderByDesc(ShippingTemplatesRegion::getId); + lambdaQueryWrapper.last(" limit 1"); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 获取运费模板区域列表 + * + * @param tempId 模板标号 + * @return List + */ + @Override + public List findListById(Integer tempId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(ShippingTemplatesRegion::getTempId, tempId); + lqw.eq(ShippingTemplatesRegion::getStatus, true); + return mapper.selectList(lqw); + } + + /** + * 分组查询 + * + * @param tempId Integer 运费模板id + * @return List + */ + @Override + public List getListGroup(Integer tempId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(ShippingTemplatesRegion::getTitle, ShippingTemplatesRegion::getFirst, ShippingTemplatesRegion::getFirstPrice, + ShippingTemplatesRegion::getRenewal, ShippingTemplatesRegion::getRenewalPrice, ShippingTemplatesRegion::getUniqid); + lqw.eq(ShippingTemplatesRegion::getTempId, tempId); + List list = mapper.selectList(lqw); + List responseList = CollUtil.newArrayList(); + if (CollUtil.isEmpty(list)) { + return responseList; + } + Map> listMap = list.stream().collect(Collectors.groupingBy(ShippingTemplatesRegion::getUniqid, LinkedHashMap::new, Collectors.toList())); + Set>> entrySet = listMap.entrySet(); + for (Map.Entry> entry : entrySet) { + String uniqid = entry.getKey(); + String title = entry.getValue().stream().map(ShippingTemplatesRegion::getTitle).collect(Collectors.joining(",")); + ShippingTemplatesRegion region = entry.getValue().get(0); + ShippingTemplatesRegionResponse response = new ShippingTemplatesRegionResponse(); + response.setTitle(title); + response.setUniqid(uniqid); + response.setFirst(region.getFirst()); + response.setFirstPrice(region.getFirstPrice()); + response.setRenewal(region.getRenewal()); + response.setRenewalPrice(region.getRenewalPrice()); + responseList.add(response); + } + return responseList; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesServiceImpl.java new file mode 100644 index 0000000..86cc545 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/ShippingTemplatesServiceImpl.java @@ -0,0 +1,258 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.express.ShippingTemplates; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.ShippingTemplatesRegionRequest; +import com.yzt.common.request.ShippingTemplatesRequest; +import com.yzt.common.request.ShippingTemplatesSearchRequest; +import com.yzt.common.response.ShippingTemplatesFreeResponse; +import com.yzt.common.response.ShippingTemplatesInfoResponse; +import com.yzt.common.response.ShippingTemplatesRegionResponse; +import com.yzt.service.mapper.ShippingTemplatesMapper; +import com.yzt.service.service.ShippingTemplatesFreeService; +import com.yzt.service.service.ShippingTemplatesRegionService; +import com.yzt.service.service.ShippingTemplatesService; +import com.yzt.service.service.StoreProductService; +import javax.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.List; + +/** + * ShippingTemplatesServiceImpl 接口实现 + * + */ +@Service +public class ShippingTemplatesServiceImpl extends ServiceImpl implements ShippingTemplatesService { + + @Resource + private ShippingTemplatesMapper mapper; + + @Autowired + private ShippingTemplatesRegionService shippingTemplatesRegionService; + + @Autowired + private ShippingTemplatesFreeService shippingTemplatesFreeService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private StoreProductService storeProductService; + + /** + * 列表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(ShippingTemplatesSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (!StringUtils.isBlank(request.getKeywords())) { + lambdaQueryWrapper.like(ShippingTemplates::getName, request.getKeywords()); + } + lambdaQueryWrapper.orderByDesc(ShippingTemplates::getSort).orderByDesc(ShippingTemplates::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增 + * + * @param request 新增参数 + * @return Boolean + */ + @Override + public Boolean create(ShippingTemplatesRequest request) { + // 判断模板名称是否重复 + if (isExistName(request.getName())) { + throw new YztException("模板名称已存在,请更换模板名称!"); + } + List shippingTemplatesRegionRequestList = request.getShippingTemplatesRegionRequestList(); + if (request.getAppoint().equals(2) && CollUtil.isEmpty(shippingTemplatesRegionRequestList)) { + throw new YztException("不包邮,最少需要一条公共区域运费数据"); + } + + ShippingTemplates shippingTemplates = new ShippingTemplates(); + shippingTemplates.setName(request.getName()); + shippingTemplates.setSort(request.getSort()); + shippingTemplates.setType(request.getType()); + shippingTemplates.setAppoint(request.getAppoint()); + + return transactionTemplate.execute(e -> { + boolean save = save(shippingTemplates); + if (!save) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + if (!shippingTemplates.getAppoint().equals(0) && CollUtil.isNotEmpty(shippingTemplatesRegionRequestList)) { + save = shippingTemplatesRegionService.saveAll(shippingTemplatesRegionRequestList, shippingTemplates.getType(), shippingTemplates.getId()); + if (!save) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + } + if (shippingTemplates.getAppoint().equals(2) && CollUtil.isNotEmpty(request.getShippingTemplatesFreeRequestList())) { + save = shippingTemplatesFreeService.saveAll(request.getShippingTemplatesFreeRequestList(), shippingTemplates.getType(), shippingTemplates.getId()); + if (!save) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + } + return Boolean.TRUE; + }); + } + + /** + * 根据模板名称获取模板 + * + * @param name 模板名称 + * @return ShippingTemplates + */ + private ShippingTemplates getByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(ShippingTemplates::getName, name); + return mapper.selectOne(lqw); + } + + /** + * 是否存在模板名称 + */ + private Boolean isExistName(String name) { + ShippingTemplates templates = getByName(name); + if (ObjectUtil.isNull(templates)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + /** + * 新增 + * + * @param id Integer 模板id + * @param request ShippingTemplatesRequest 新增参数 + */ + @Override + public Boolean update(Integer id, ShippingTemplatesRequest request) { + ShippingTemplates shippingTemplates = getByIdException(id); + List shippingTemplatesRegionRequestList = request.getShippingTemplatesRegionRequestList(); + if (request.getAppoint().equals(2) && CollUtil.isEmpty(shippingTemplatesRegionRequestList)) { + throw new YztException("不包邮,最少需要一条公共区域运费数据"); + } + if (!shippingTemplates.getName().equals(request.getName())) { + if (isExistName(request.getName())) { + throw new YztException("模板名称已存在,请更换模板名称!"); + } + } + + shippingTemplates.setName(request.getName()); + shippingTemplates.setSort(request.getSort()); + shippingTemplates.setType(request.getType()); + + return transactionTemplate.execute(e -> { + if (!shippingTemplates.getAppoint().equals(0)) { + shippingTemplatesRegionService.deleteByTempId(id); + } + if (shippingTemplates.getAppoint().equals(2)) { + shippingTemplatesFreeService.deleteByTempId(id); + } + shippingTemplates.setAppoint(request.getAppoint()); + shippingTemplates.setUpdateTime(DateUtil.date()); + boolean update = updateById(shippingTemplates); + if (!update) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + if (CollUtil.isNotEmpty(shippingTemplatesRegionRequestList)) { + update = shippingTemplatesRegionService.saveAll(shippingTemplatesRegionRequestList, request.getType(), shippingTemplates.getId()); + if (!update) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + } + if (shippingTemplates.getAppoint().equals(2) && CollUtil.isNotEmpty(request.getShippingTemplatesFreeRequestList())) { + update = shippingTemplatesFreeService.saveAll(request.getShippingTemplatesFreeRequestList(), request.getType(), shippingTemplates.getId()); + if (!update) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + } + return Boolean.TRUE; + }); + } + + /** + * 删除 + * + * @param id Integer + * @return boolean + */ + @Override + public Boolean remove(Integer id) { + getByIdException(id); + if (storeProductService.isUseShippingTemplateId(id)) { + throw new YztException("有商品使用此运费模板,无法删除"); + } + return transactionTemplate.execute(e -> { + shippingTemplatesRegionService.deleteByTempId(id); + shippingTemplatesFreeService.deleteByTempId(id); + removeById(id); + return Boolean.TRUE; + }); + } + + /** + * 获取模板信息 + * + * @param id 模板id + * @return ShippingTemplates + */ + @Override + public ShippingTemplatesInfoResponse getInfo(Integer id) { + ShippingTemplates shippingTemplates = getByIdException(id); + ShippingTemplatesInfoResponse response = new ShippingTemplatesInfoResponse(); + BeanUtils.copyProperties(shippingTemplates, response); + if (shippingTemplates.getAppoint().equals(0)) { + return response; + } + List regionResponseList = shippingTemplatesRegionService.getListGroup(id); + if (CollUtil.isNotEmpty(regionResponseList)) { + regionResponseList.forEach(regionResponse -> { + regionResponse.setTitle("[" + regionResponse.getTitle() + "]"); + }); + response.setRegionList(regionResponseList); + } + if (shippingTemplates.getAppoint().equals(2)) { + List freeResponseList = shippingTemplatesFreeService.getListGroup(id); + freeResponseList.forEach(freeResponse -> { + freeResponse.setTitle("[" + freeResponse.getTitle() + "]"); + }); + response.setFreeList(freeResponseList); + } + return response; + } + + private ShippingTemplates getByIdException(Integer id) { + ShippingTemplates shippingTemplates = getById(id); + if (ObjectUtil.isNull(shippingTemplates)) { + throw new YztException("运费模板不存在"); + } + return shippingTemplates; + } + + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsRecordServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsRecordServiceImpl.java new file mode 100644 index 0000000..d513c02 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsRecordServiceImpl.java @@ -0,0 +1,32 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.sms.SmsRecord; +import com.yzt.service.mapper.SmsRecordMapper; +import com.yzt.service.service.SmsRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * SmsRecordServiceImpl 接口实现 + * + */ +@Service +public class SmsRecordServiceImpl extends ServiceImpl implements SmsRecordService { + + @Resource + private SmsRecordMapper mapper; + + /** + * 短信发送记录保存 + * + * @param smsRecord 待保存短信记录 + * @return 保存结果 + */ + @Override + public boolean save(SmsRecord smsRecord) { + return mapper.insert(smsRecord) > 0; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsServiceImpl.java new file mode 100644 index 0000000..8056de7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsServiceImpl.java @@ -0,0 +1,575 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.OnePassConstants; +import com.yzt.common.constants.SmsConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SmsApplyTempRequest; +import com.yzt.common.request.SmsModifySignRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.utils.ValidateFormUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.OnePassLoginVo; +import com.yzt.common.vo.SendSmsVo; +import com.yzt.service.plugin.sms.SmsPluginFactory; +import com.yzt.service.service.*; +import com.yzt.service.util.OnePassUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * SmsServiceImpl 接口实现 + * + */ +@Service +public class SmsServiceImpl implements SmsService { + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private RestTemplateUtil restTemplateUtil; + + @Autowired + private SmsRecordService smsRecordService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private UserService userService; + + @Autowired + private OnePassUtil onePassUtil; + + @Autowired + private SmsPluginFactory smsPluginFactory; + + private static final Logger logger = LoggerFactory.getLogger(SmsServiceImpl.class); + + /** + * 发送短信 + * @param phone 手机号 + * @param tag 短信标识 + * @param msgTempId 短信模板id + * @param pram 参数 + * @return Boolean + */ + private Boolean sendMessages(String phone, Integer tag, Integer msgTempId, HashMap pram) { + //发送手机验证码, 记录到redis sms_validate_code_手机号 + switch (tag) { + case SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE: // 验证码 特殊处理 code + //获取短信验证码过期时间 + String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); + if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { + codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 + } + Integer code = YztUtil.randomCount(111111, 999999); + HashMap justPram = new HashMap<>(); + justPram.put("code", code); + justPram.put("time", codeExpireStr); + push(phone, SmsConstants.SMS_CONFIG_VERIFICATION_CODE, + SmsConstants.SMS_CONFIG_VERIFICATION_CODE_TEMP_ID, justPram); + + // 将验证码存入redis + redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); + break; + case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name + push(phone, SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH, + SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id + push(phone, msgTempId, pram); + break; + case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price + push(phone, SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH, + SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID, pram); + break; + } + return true; + } + + /** + * 发送短信 + * @param sendSmsVo 短信参数 + */ + private Boolean sendCode(SendSmsVo sendSmsVo) { + String result; + try { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + + Map map = (Map) JSONObject.parseObject(sendSmsVo.getParam()); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("phone", sendSmsVo.getMobile()); + param.add("temp_id", sendSmsVo.getTemplate()); + map.entrySet().stream().forEach(entry -> param.add(StrUtil.format(SmsConstants.SMS_COMMON_PARAM_FORMAT, entry.getKey()), entry.getValue())); + System.out.println("============发送短信=========header = " + header); + result = restTemplateUtil.postFromUrlencoded(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI, param, header); + checkResult(result); + } catch (Exception e) { + //接口请求异常,需要重新发送 + e.printStackTrace(); + logger.error(e.getMessage()); + return false; + } + return true; + } + + /** + * 组装发送对象 + * + * @param phone 手机号 + * @param msgTempId 模板id + * @param mapPram 参数map + */ + private Boolean push(String phone, Integer msgTempId, HashMap mapPram) { + if (StrUtil.isBlank(phone) || msgTempId <= 0) { + return false; + } + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + SendSmsVo smsVo = new SendSmsVo(); + smsVo.setUid(loginVo.getAccessKey()); + smsVo.setToken(loginVo.getSecretKey()); + smsVo.setMobile(phone); + smsVo.setTemplate(msgTempId); + smsVo.setParam(JSONObject.toJSONString(mapPram)); + return sendCode(smsVo); + } + + /** + * 组装发送对象 + * + * @param phone 手机号 + * @param tempKey 模板key + * @param msgTempId 模板id + * @param mapPram 参数map + */ + private Boolean push(String phone, String tempKey, Integer msgTempId, HashMap mapPram) { + if (StrUtil.isBlank(phone) || StrUtil.isBlank(tempKey) || msgTempId <= 0) { + return false; + } + OnePassLoginVo loginVo = onePassUtil.getLoginVo(); + SendSmsVo smsVo = new SendSmsVo(); + smsVo.setUid(loginVo.getAccessKey()); + smsVo.setToken(loginVo.getSecretKey()); + smsVo.setMobile(phone); + smsVo.setTemplate(msgTempId); + smsVo.setParam(JSONObject.toJSONString(mapPram)); + return sendCode(smsVo); + } + + /** + * 修改签名 + */ + @Override + public Boolean modifySign(SmsModifySignRequest request) { + ValidateFormUtil.isPhoneException(request.getPhone()); + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add("sign", request.getSign()); + map.add("phone", request.getPhone()); + map.add("verify_code", request.getCode()); + + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_SMS_MODIFY_URI, map, header); + return Boolean.TRUE; + } + + /** + * 短信模板 + */ + @Override + public MyRecord temps(PageParamRequest pageParamRequest) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("page", pageParamRequest.getPage()); + param.add("limit", pageParamRequest.getLimit()); + param.add("temp_type", 0);// 查询所有类型模板 + JSONObject post = postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_TEMP_LIST_URI, param, header); + JSONObject jsonObject = post.getJSONObject("data"); + logger.warn("短信模板响应JsonObject = {}", jsonObject); + JSONArray jsonArray = jsonObject.getJSONArray("data"); + MyRecord myRecord = new MyRecord(); + if (CollUtil.isEmpty(jsonArray)) { + return myRecord.set("count", 0); + } + List recordList = jsonArray.stream().map(i -> { + MyRecord record = new MyRecord(); + record.setColums((JSONObject) i); + switch (record.getInt("temp_type")) { + case 1: + record.set("type", "验证码"); + break; + case 2: + record.set("type", "通知"); + break; + case 3: + record.set("type", "营销短信"); + break; + } + return record; + }).collect(Collectors.toList()); + + myRecord.set("count", jsonObject.getInteger("count")); + myRecord.set("data", recordList); + return myRecord; + } + + /** + * 申请模板消息 + */ + @Override + public Boolean applyTempMessage(SmsApplyTempRequest request) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("title", request.getTitle()); + param.add("content", request.getContent()); + param.add("type", request.getType()); + + onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_TEMP_APPLY_URI, param, header); + return Boolean.TRUE; + } + + /** + * 模板申请记录 + * + * @param type (1=验证码 2=通知 3=推广) + */ + @Override + public MyRecord applys(Integer type, PageParamRequest pageParamRequest) { + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("page", pageParamRequest.getPage()); + param.add("limit", pageParamRequest.getLimit()); + if (ObjectUtil.isNotNull(type)) { + param.add("temp_type", type); + } + + JSONObject post = onePassUtil.postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_APPLYS_LIST_URI, param, header); + JSONObject jsonObject = post.getJSONObject("data"); + JSONArray jsonArray = jsonObject.getJSONArray("data"); + MyRecord myRecord = new MyRecord(); + if (CollUtil.isEmpty(jsonArray)) { + return myRecord.set("count", 0); + } + List recordList = jsonArray.stream().map(i -> { + MyRecord record = new MyRecord(); + record.setColums((JSONObject) i); + switch (record.getInt("temp_type")) { + case 1: + record.set("type", "验证码"); + break; + case 2: + record.set("type", "通知"); + break; + case 3: + record.set("type", "营销短信"); + break; + } + return record; + }).collect(Collectors.toList()); + + myRecord.set("count", recordList.size()); + myRecord.set("data", recordList); + return myRecord; + } + + /** + * 发送公共验证码 + * + * @param phone 手机号 + * @return Boolean + */ + @Override + public Boolean sendCommonCode(String phone) { + ValidateFormUtil.isPhone(phone,"手机号码错误"); + if (redisUtil.exists(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone)) { + throw new YztException("您的短信发送过于频繁,请稍后再试"); + } + return sendSms(phone, SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE, null); + } + + /** + * 发送支付成功短信 + * + * @param phone 手机号 + * @param orderNo 订单编号 + * @param payPrice 支付金额 + * @param msgTempId 短信模板id + * @return Boolean + */ + @Override + public Boolean sendPaySuccess(String phone, String orderNo, BigDecimal payPrice, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("pay_price", payPrice); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH, msgTempId, map); + } + + /** + * 发送管理员下单短信提醒 + * + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + * @return Boolean + */ + @Override + public Boolean sendCreateOrderNotice(String phone, String orderNo, String realName, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH, msgTempId, map); + } + + /** + * 发送订单支付成功管理员提醒短信 + * + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + * @return Boolean + */ + @Override + public Boolean sendOrderPaySuccessNotice(String phone, String orderNo, String realName, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH, msgTempId, map); + } + + /** + * 发送用户退款管理员提醒短信 + * + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + * @return Boolean + */ + @Override + public Boolean sendOrderRefundApplyNotice(String phone, String orderNo, String realName, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH, msgTempId, map); + } + + /** + * 发送用户确认收货管理员提醒短信 + * @param phone 手机号 + * @param orderNo 订单编号 + * @param realName 管理员名称 + * @param msgTempId 短信模板id + */ + @Override + public Boolean sendOrderReceiptNotice(String phone, String orderNo, String realName, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("admin_name", realName); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH, msgTempId, map); + } + + /** + * 发送订单改价提醒短信 + * + * @param phone 手机号 + * @param orderNo 订单编号 + * @param price 修改后的支付金额 + * @param msgTempId 短信模板id + * @return Boolean + */ + @Override + public Boolean sendOrderEditPriceNotice(String phone, String orderNo, BigDecimal price, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("order_id", orderNo); + map.put("pay_price", price); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH, msgTempId, map); + } + + /** + * 发送订单发货提醒短信 + * + * @param phone 手机号 + * @param nickName 用户昵称 + * @param storeName 商品名称 + * @param orderNo 订单编号 + * @param msgTempId 短信模板id + */ + @Override + public Boolean sendOrderDeliverNotice(String phone, String nickName, String storeName, String orderNo, Integer msgTempId) { + HashMap map = CollUtil.newHashMap(); + map.put("nickname", nickName); + map.put("store_name", storeName); + map.put("order_id", orderNo); + return sendMessages(phone, SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH, msgTempId, map); + } + + /** + * post请求from表单模式提交 + */ + private JSONObject postFrom(String url, MultiValueMap param, Map header) { + String result = restTemplateUtil.postFromUrlencoded(url, param, header); + return checkResult(result); + } + + /** + * 检测结构请求返回的数据 + * + * @param result 接口返回的结果 + * @return JSONObject + + */ + private JSONObject checkResult(String result) { + if (StrUtil.isBlank(result)) { + throw new YztException("短信平台接口异常,没任何数据返回!"); + } + + JSONObject jsonObject; + try { + jsonObject = JSONObject.parseObject(result); + } catch (Exception e) { + throw new YztException("短信平台接口异常!"); + } + if (SmsConstants.SMS_ERROR_CODE.equals(jsonObject.getInteger("status"))) { + throw new YztException("短信平台接口" + jsonObject.getString("msg")); + } + return jsonObject; + } + + /** + * 发送短信 + * 验证码特殊处理其他的参数自行根据要求处理 + * 参数处理逻辑 {code:value,code1:value1} + * + * @param phone String 手机号码 + * @return boolean + */ + private Boolean sendSms(String phone, Integer tag, HashMap pram) { + SendSmsVo sendSmsVo = new SendSmsVo(); + sendSmsVo.setMobile(phone); + if (tag.equals(SmsConstants.SMS_CONFIG_TYPE_VERIFICATION_CODE)) {// 验证码 特殊处理 code + //获取短信验证码过期时间 + String codeExpireStr = systemConfigService.getValueByKey(Constants.CONFIG_KEY_SMS_CODE_EXPIRE); + if (StrUtil.isBlank(codeExpireStr) || Integer.parseInt(codeExpireStr) == 0) { + codeExpireStr = Constants.NUM_FIVE + "";// 默认5分钟过期 + } + Integer code = YztUtil.randomCount(111111, 999999); + HashMap justPram = new HashMap<>(); + justPram.put("code", code.toString()); + System.out.println("-----------------短信验证码为:"+ code); + justPram.put("time", codeExpireStr); + + boolean aBoolean = smsPluginFactory.smsPlugin().sendSmsCode(phone, justPram); + if (!aBoolean) { + throw new YztException("发送短信失败,请联系后台管理员"); + } + // 将验证码存入redis + redisUtil.set(userService.getValidateCodeRedisKey(phone), code, Long.valueOf(codeExpireStr), TimeUnit.MINUTES); + redisUtil.set(SmsConstants.SMS_VALIDATE_PHONE_NUM + phone, 1, 60L); + return aBoolean; + } + // 以下部分实时性不高暂时还是使用队列发送 + sendSmsVo.setContent(JSONObject.toJSONString(pram)); + switch (tag) { + case SmsConstants.SMS_CONFIG_TYPE_LOWER_ORDER_SWITCH: // 支付成功短信提醒 pay_price order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_LOWER_ORDER_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_DELIVER_GOODS_SWITCH: // 发货短信提醒 nickname store_name + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_DELIVER_GOODS_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_CONFIRM_TAKE_OVER_SWITCH: // 确认收货短信提醒 order_id store_name + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_LOWER_ORDER_SWITCH: // 用户下单管理员短信提醒 admin_name order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_LOWER_ORDER_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_PAY_SUCCESS_SWITCH: // 支付成功管理员短信提醒 admin_name order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_PAY_SUCCESS_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_REFUND_SWITCH: // 用户确认收货管理员短信提醒 admin_name order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_REFUND_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_ADMIN_CONFIRM_TAKE_OVER_SWITCH: // 用户发起退款管理员短信提醒 admin_name order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ADMIN_CONFIRM_TAKE_OVER_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_PRICE_REVISION_SWITCH: // 改价短信提醒 order_id pay_price + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_PRICE_REVISION_SWITCH_TEMP_ID); + break; + case SmsConstants.SMS_CONFIG_TYPE_ORDER_PAY_FALSE: // 订单未支付 order_id + sendSmsVo.setTemplate(SmsConstants.SMS_CONFIG_ORDER_PAY_FALSE_TEMP_ID); + break; + } + return commonSendSms(sendSmsVo); + } + + /** + * 公共发送短信 + * + * @param sendSmsVo 发送短信对象 + * @return 是否发送成功 + */ + private Boolean commonSendSms(SendSmsVo sendSmsVo) { + try { + String result; + String token = onePassUtil.getToken(); + HashMap header = onePassUtil.getCommonHeader(token); + + Map map = (Map) JSONObject.parseObject(sendSmsVo.getContent()); + MultiValueMap param = new LinkedMultiValueMap<>(); + param.add("phone", sendSmsVo.getMobile()); + param.add("temp_id", sendSmsVo.getTemplate()); + + map.forEach((key, value) -> param.add(StrUtil.format(SmsConstants.SMS_COMMON_PARAM_FORMAT, key), value)); + logger.info("============发送短信=========header = " + header + ",content = " + sendSmsVo.getContent()); + result = restTemplateUtil.postFromUrlencoded(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.ONE_PASS_API_SEND_URI, param, header); + checkResult(result); + } catch (Exception e) { + e.printStackTrace(); + logger.error("发送短信失败:" + e.getMessage()); + return false; + } + return true; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsTemplateServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsTemplateServiceImpl.java new file mode 100644 index 0000000..580acf4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SmsTemplateServiceImpl.java @@ -0,0 +1,37 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.service.mapper.SmsTemplateMapper; +import com.yzt.service.service.SmsTemplateService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * SmsTemplateServiceImpl 接口实现 + * + */ +@Service +public class SmsTemplateServiceImpl extends ServiceImpl implements SmsTemplateService { + + @Resource + private SmsTemplateMapper mapper; + + /** + * 获取详情 + * @param id 模板id + * @return SmsTemplate + */ + @Override + public SmsTemplate getDetail(Integer id) { + SmsTemplate smsTemplate = getById(id); + if (ObjectUtil.isNull(smsTemplate)) { + throw new YztException("短信模板不存在"); + } + return smsTemplate; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainServiceImpl.java new file mode 100644 index 0000000..9c3d937 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainServiceImpl.java @@ -0,0 +1,918 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.BargainConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.ProductConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.bargain.StoreBargainUser; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.product.StoreProductDescription; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.service.mapper.StoreBargainMapper; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreBargainService 实现类 + * + */ +@Service +public class StoreBargainServiceImpl extends ServiceImpl implements StoreBargainService { + + @Resource + private StoreBargainMapper mapper; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Lazy + @Autowired + private StoreBargainUserHelpService storeBargainUserHelpService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private StoreProductAttrService attrService; + + @Autowired + private StoreProductAttrValueService attrValueService; + + @Autowired + private StoreProductAttrResultService storeProductAttrResultService; + + @Autowired + private StoreProductDescriptionService storeProductDescriptionService; + + @Autowired + private UserService userService; + + @Autowired + private RedisUtil redisUtil; + + @Lazy + @Autowired + private StoreProductService storeProductService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + private static final Logger logger = LoggerFactory.getLogger(StoreBargainServiceImpl.class); + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreBargainSearchRequest request, PageParamRequest pageParamRequest) { + Page storeBargainPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreBargain::getIsDel, false); + if (StrUtil.isNotEmpty(request.getKeywords())) { + lambdaQueryWrapper.and(i -> i.like(StoreBargain::getId, request.getKeywords()) + .or().like(StoreBargain::getStoreName, request.getKeywords()) + .or().like(StoreBargain::getTitle, request.getKeywords())); + } + if (ObjectUtil.isNotNull(request.getStatus())) { + lambdaQueryWrapper.eq(StoreBargain::getStatus, request.getStatus()); + } + lambdaQueryWrapper.orderByDesc(StoreBargain::getSort, StoreBargain::getId); + List storeBargainList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeBargainList)) { + return CommonPage.copyPageInfo(storeBargainPage, CollUtil.newArrayList()); + } + // 1.砍价参与人数,2.帮忙砍价人数,3.砍价成功人数 + List storeProductResponses = CollUtil.newArrayList(); + for (StoreBargain storeBargain : storeBargainList) { + StoreBargainResponse storeBargainResponse = new StoreBargainResponse(); + BeanUtils.copyProperties(storeBargain, storeBargainResponse); + storeBargainResponse.setStartTime(YztDateUtil.timestamp2DateStr(storeBargain.getStartTime(), Constants.DATE_FORMAT_DATE)); + storeBargainResponse.setStopTime(YztDateUtil.timestamp2DateStr(storeBargain.getStopTime(), Constants.DATE_FORMAT_DATE)); + storeBargainResponse.setAddTime(YztDateUtil.timestamp2DateStr(storeBargain.getAddTime(), Constants.DATE_FORMAT)); + List bargainUserList = storeBargainUserService.getListByBargainId(storeBargain.getId()); + if (CollUtil.isEmpty(bargainUserList)) { + storeBargainResponse.setCountPeopleAll(0L); + storeBargainResponse.setCountPeopleHelp(0L); + storeBargainResponse.setCountPeopleSuccess(0L); + //限量剩余 + storeBargainResponse.setSurplusQuota(storeBargain.getQuota()); + storeProductResponses.add(storeBargainResponse); + continue ; + } + //砍价参与人数 + Integer countPeopleAll = bargainUserList.size(); + //砍价成功人数 + Long countPeopleSuccess = bargainUserList.stream() + .filter(o -> o.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_SUCCESS)).count(); + //帮忙砍价人数 + Long countPeopleHelp = storeBargainUserHelpService.getHelpCountByBargainId(storeBargain.getId()); + storeBargainResponse.setCountPeopleAll(countPeopleAll.longValue()); + storeBargainResponse.setCountPeopleHelp(countPeopleHelp); + storeBargainResponse.setCountPeopleSuccess(countPeopleSuccess); + //限量剩余 + storeBargainResponse.setSurplusQuota(storeBargain.getQuota()); + storeProductResponses.add(storeBargainResponse); + } + return CommonPage.copyPageInfo(storeBargainPage, storeProductResponses); + } + + /** + * 删除砍价商品 + * @param id 砍价商品id + * @return Boolean + */ + @Override + public boolean deleteById(Integer id) { + StoreBargain existBargain = getById(id); + long timeMillis = System.currentTimeMillis(); + if (existBargain.getStatus().equals(true) && existBargain.getStartTime() <= timeMillis && timeMillis <= existBargain.getStopTime()) { + throw new YztException("活动开启中,商品不支持删除"); + } + + StoreBargain storeBargain = new StoreBargain(); + storeBargain.setId(id).setIsDel(true); + + + List collect = CollUtil.newArrayList(); + List bargainUserList = storeBargainUserService.getListByBargainId(storeBargain.getId()); + collect = bargainUserList.stream().filter(e -> e.getStatus().equals(1)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + collect.forEach(e -> e.setStatus(2)); + } + List finalCollect = collect; + + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(storeBargain); + if (CollUtil.isNotEmpty(finalCollect)) { + storeBargainUserService.updateBatchById(finalCollect); + } + return Boolean.TRUE; + }); + return execute; + } + + /** + * 新增砍价商品 + * @param request 砍价商品result + * @return 新增结果 + */ + @Override + public boolean saveBargain(StoreBargainRequest request) { + // 参数校验 + if (CollUtil.isEmpty(request.getAttrValue())) { + throw new YztException("请选择砍价商品的规格属性"); + } + StoreProductAttrValueAddRequest attrValueRequest = request.getAttrValue().get(0); + if (ObjectUtil.isNull(attrValueRequest.getQuota()) || attrValueRequest.getQuota() <= 0) { + throw new YztException("活动限购数量必须大于0"); + } + // 可砍价的金额 + BigDecimal tempPrice = attrValueRequest.getPrice().subtract(attrValueRequest.getMinPrice()); + // 砍价人数 * 0.01 = 每人砍1分总共钱数 + BigDecimal multiply = new BigDecimal(request.getPeopleNum()).multiply(new BigDecimal("0.01")); + if (tempPrice.compareTo(multiply) < 0) { + // 砍价起始金额 - 砍价最低价 >= 砍价人数 * 0.01 + throw new YztException("必须保证每个人最少砍1分钱"); + } + + StoreBargain bargain = new StoreBargain(); + BeanUtils.copyProperties(request, bargain); + bargain.setId(null); + // 头图、轮播图 + bargain.setImage(systemAttachmentService.clearPrefix(request.getImage())); + bargain.setImages(systemAttachmentService.clearPrefix(request.getImages())); + // 活动开始结束时间 + bargain.setStartTime(YztDateUtil.dateStr2Timestamp(request.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN)); + bargain.setStopTime(YztDateUtil.dateStr2Timestamp(request.getStopTime(), Constants.DATE_TIME_TYPE_END)); + bargain.setAddTime(System.currentTimeMillis()); + // 砍价商品价格 + bargain.setPrice(attrValueRequest.getPrice()); + bargain.setMinPrice(attrValueRequest.getMinPrice()); + bargain.setCost(attrValueRequest.getCost()); + bargain.setStock(attrValueRequest.getStock()); + bargain.setQuota(attrValueRequest.getQuota()); + bargain.setIsDel(false); + bargain.setQuotaShow(bargain.getQuota()); + bargain.setSales(0); + + // 处理商品属性,给砍价商品一份单规格默认属性 + List addRequestList = request.getAttr(); + List attrList = addRequestList.stream().map(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + attr.setType(Constants.PRODUCT_TYPE_BARGAIN); + return attr; + }).collect(Collectors.toList()); + + // 处理商品属性值,砍价商品只有一条属性值 + StoreProductAttrValue singleAttrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(attrValueRequest, singleAttrValue); + singleAttrValue.setType(ProductConstants.PRODUCT_TYPE_BARGAIN); + singleAttrValue.setImage(systemAttachmentService.clearPrefix(singleAttrValue.getImage())); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_BARGAIN); + + Boolean execute = transactionTemplate.execute(e -> { + save(bargain); + attrList.forEach(attr -> attr.setProductId(bargain.getId())); + singleAttrValue.setProductId(bargain.getId()); + attrService.saveBatch(attrList); + attrValueService.save(singleAttrValue); + + spd.setProductId(bargain.getId()); + storeProductDescriptionService.deleteByProductId(spd.getProductId(), ProductConstants.PRODUCT_TYPE_BARGAIN); + storeProductDescriptionService.save(spd); + + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 编辑砍价商品 + * @param request 请求参数 + * @return Boolean + */ + @Override + public boolean updateBargain(StoreBargainRequest request) { + if (ObjectUtil.isNull(request.getId())) { + throw new YztException("砍价商品id不能为空"); + } + StoreBargain existBargain = getById(request.getId()); + if (ObjectUtil.isNull(existBargain) || existBargain.getIsDel()) { + throw new YztException("砍价商品不存在"); + } + long timeMillis = System.currentTimeMillis(); + if (existBargain.getStatus().equals(true) && existBargain.getStartTime() <= timeMillis && timeMillis <= existBargain.getStopTime()) { + throw new YztException("活动开启中,商品不支持修改"); + } + + if (CollUtil.isEmpty(request.getAttrValue())) { + throw new YztException("请选择砍价商品的规格属性"); + } + + StoreProductAttrValueAddRequest attrValueRequest = request.getAttrValue().get(0); + + // 可砍价的金额 + BigDecimal tempPrice =attrValueRequest.getPrice().subtract(attrValueRequest.getMinPrice()); + // 砍价人数 * 0.01 = 每人砍1分总共钱数 + BigDecimal multiply = new BigDecimal(request.getPeopleNum()).multiply(new BigDecimal("0.01")); + if (tempPrice.compareTo(multiply) < 0) { + // 砍价起始金额 - 砍价最低价 >= 砍价人数 * 0.01 + throw new YztException("必须保证每个人最少砍1分钱"); + } + + StoreBargain bargain = new StoreBargain(); + BeanUtils.copyProperties(request, bargain); + // 头图、轮播图 + bargain.setImage(systemAttachmentService.clearPrefix(request.getImage())); + bargain.setImages(systemAttachmentService.clearPrefix(request.getImages())); + // 活动开始结束时间 + bargain.setStartTime(YztDateUtil.dateStr2Timestamp(request.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN)); + bargain.setStopTime(YztDateUtil.dateStr2Timestamp(request.getStopTime(), Constants.DATE_TIME_TYPE_END)); + + // 砍价商品价格 + bargain.setPrice(attrValueRequest.getPrice()); + bargain.setMinPrice(attrValueRequest.getMinPrice()); + bargain.setCost(attrValueRequest.getCost()); + bargain.setStock(attrValueRequest.getStock()); + bargain.setQuota(attrValueRequest.getQuota()); + bargain.setQuotaShow(attrValueRequest.getQuota()); + int saveCount = mapper.updateById(bargain); + if (saveCount <= 0) { + throw new YztException("编辑砍价商品失败"); + } + + List addRequestList = request.getAttr(); + List attrAddList = CollUtil.newArrayList(); + List attrUpdateList = CollUtil.newArrayList(); + addRequestList.forEach(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + if (ObjectUtil.isNull(attr.getId())) { + attr.setProductId(bargain.getId()); + attr.setType(Constants.PRODUCT_TYPE_BARGAIN); + attrAddList.add(attr); + } else { + attr.setProductId(bargain.getId()); + attr.setIsDel(false); + attrUpdateList.add(attr); + } + }); + + // attrValue部分 + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(attrValueRequest, attrValue); + attrValue.setSuk(attrValueRequest.getSuk()); + attrValue.setImage(systemAttachmentService.clearPrefix(attrValueRequest.getImage())); + if (ObjectUtil.isNull(attrValue.getId())) { + attrValue.setProductId(bargain.getId()); + attrValue.setQuota(attrValueRequest.getQuota()); + attrValue.setQuotaShow(attrValueRequest.getQuota()); + attrValue.setType(Constants.PRODUCT_TYPE_BARGAIN); + } else { + attrValue.setIsDel(false); + } + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_BARGAIN); + spd.setProductId(bargain.getId()); + + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(bargain); + + // 先删除原用attr+value + attrService.deleteByProductIdAndType(bargain.getId(), Constants.PRODUCT_TYPE_BARGAIN); + attrValueService.deleteByProductIdAndType(bargain.getId(), Constants.PRODUCT_TYPE_BARGAIN); + + if (CollUtil.isNotEmpty(attrAddList)) { + attrService.saveBatch(attrAddList); + } + if (CollUtil.isNotEmpty(attrUpdateList)) { + attrService.saveOrUpdateBatch(attrUpdateList); + } + + if (ObjectUtil.isNotNull(attrValue.getId())) { + attrValueService.updateById(attrValue); + } else { + attrValueService.save(attrValue); + } + + storeProductDescriptionService.deleteByProductId(bargain.getId(), Constants.PRODUCT_TYPE_BARGAIN); + storeProductDescriptionService.save(spd); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 更新砍价商品状态 + * @param id 砍价商品id + * @param status 砍价商品状态 + * @return Boolean + */ + @Override + public boolean updateBargainStatus(Integer id, boolean status) { + StoreBargain temp = getById(id); + if (ObjectUtil.isNull(temp) || temp.getIsDel()) { + throw new YztException("砍价商品不存在"); + } + if (status) { + // 判断商品是否存在 + StoreProduct product = storeProductService.getById(temp.getProductId()); + if (ObjectUtil.isNull(product)) { + throw new YztException("关联的商品已删除,无法开启活动"); + } + } + + StoreBargain storeBargain = new StoreBargain(); + storeBargain.setId(id).setStatus(status); + return mapper.updateById(storeBargain) > 0; + } + + /** + * 获取砍价商品详情 + * @param bargainId 砍价商品id + * @return StoreProductResponse + */ + @Override + public StoreProductInfoResponse getAdminDetail(Integer bargainId) { + StoreBargain storeBargain = mapper.selectById(bargainId); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("未找到对应砍价商品信息"); + } + StoreProductInfoResponse storeProductResponse = new StoreProductInfoResponse(); + BeanUtils.copyProperties(storeBargain, storeProductResponse); + storeProductResponse.setStatus(storeBargain.getStatus().equals(true) ? 1 : 0); + + // 查询attr + List attrs = attrService.getListByProductIdAndType(storeBargain.getId(), ProductConstants.PRODUCT_TYPE_BARGAIN); + storeProductResponse.setAttr(attrs); + storeProductResponse.setSliderImage(String.join(",",storeBargain.getImages())); + + boolean specType = false; + if (attrs.size() > 1) { + specType = true; + } + storeProductResponse.setSpecType(specType); + + // 注意:数据瓶装步骤:分别查询砍价和商品本身信息组装sku信息之后,再对比sku属性是否相等来赋值是否砍价sku信息 + List bargainAttrValueList = attrValueService.getListByProductIdAndType(bargainId, ProductConstants.PRODUCT_TYPE_BARGAIN); + // 查询主商品sku + List attrValueList = attrValueService.getListByProductIdAndType(storeBargain.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + + List valueResponseList = attrValueList.stream().map(e -> { + AttrValueResponse valueResponse = new AttrValueResponse(); + Integer id = 0; + for (StoreProductAttrValue value : bargainAttrValueList) { + if (value.getSuk().equals(e.getSuk())) { + id = value.getId(); + BeanUtils.copyProperties(value, valueResponse); + break; + } + } + if (id.equals(0)) { + BeanUtils.copyProperties(e, valueResponse); + valueResponse.setId(null); + } else { + valueResponse.setId(id); + } + valueResponse.setMinPrice(storeBargain.getMinPrice()); + return valueResponse; + }).collect(Collectors.toList()); + storeProductResponse.setAttrValue(valueResponseList); + + StoreProductDescription sd = storeProductDescriptionService.getByProductIdAndType(bargainId, Constants.PRODUCT_TYPE_BARGAIN); + if(ObjectUtil.isNotNull(sd)){ + storeProductResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + return storeProductResponse; + } + + /** + * h5 获取砍价商品列表 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getH5List(PageParamRequest pageParamRequest) { + Page storeBargainPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreBargain::getId, StoreBargain::getProductId, StoreBargain::getTitle, StoreBargain::getImage, + StoreBargain::getStartTime, StoreBargain::getStopTime, StoreBargain::getMinPrice, StoreBargain::getQuota); + lqw.eq(StoreBargain::getStatus, true); + lqw.eq(StoreBargain::getIsDel, false); + long timeMillis = System.currentTimeMillis(); + lqw.le(StoreBargain::getStartTime, timeMillis); + lqw.ge(StoreBargain::getStopTime, timeMillis); + lqw.orderByDesc(StoreBargain::getSort, StoreBargain::getId); + List storeBargains = mapper.selectList(lqw); + if (CollUtil.isEmpty(storeBargains)) { + return CommonPage.copyPageInfo(storeBargainPage, CollUtil.newArrayList()); + } + List bargainResponseList = storeBargains.stream().map(bargain -> { + StoreBargainDetailResponse storeBargainResponse = new StoreBargainDetailResponse(); + BeanUtils.copyProperties(bargain, storeBargainResponse); + return storeBargainResponse; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(storeBargainPage, bargainResponseList); + } + + /** + * H5 砍价商品详情 + * @param id 砍价商品id + */ + @Override + public BargainDetailH5Response getH5Detail(Integer id) { + StoreBargain storeBargain = mapper.selectById(id); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("未找到对应砍价商品信息"); + } + if (!storeBargain.getStatus()) { + throw new YztException("砍价商品已下架"); + } + BargainDetailH5Response detailH5Response = new BargainDetailH5Response(); + BeanUtils.copyProperties(storeBargain, detailH5Response); + StoreProduct storeProduct = storeProductService.getById(storeBargain.getProductId()); + if (storeProduct.getIsDel()) { + detailH5Response.setMasterStatus("delete"); + } else if (!storeProduct.getIsShow()) { + detailH5Response.setMasterStatus("soldOut"); + } else if (storeProduct.getStock() <= 0) { + detailH5Response.setMasterStatus("sellOut"); + } else { + detailH5Response.setMasterStatus("normal"); + } + + List storeProductAttrValuesBargain = attrValueService.getListByProductIdAndType(id, ProductConstants.PRODUCT_TYPE_BARGAIN); + if (CollUtil.isEmpty(storeProductAttrValuesBargain)) { + throw new YztException("砍价商品规格属性值未找到"); + } + StoreProductAttrValue productAttrValue = storeProductAttrValuesBargain.get(0); + detailH5Response.setAttrValueId(productAttrValue.getId()); + detailH5Response.setSku(productAttrValue.getSuk()); + + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, id) + .eq(StoreProductDescription::getType, ProductConstants.PRODUCT_TYPE_BARGAIN)); + if (ObjectUtil.isNotNull(sd)) { + detailH5Response.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(cn.hutool.core.date.DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(3); + userVisitRecordService.save(visitRecord); + return detailH5Response; + } + + /** + * 获取当前时间段的砍价商品 + * @param productId 砍价商品id + * @return List + */ + @Override + public List getCurrentBargainByProductId(Integer productId) { + long timeMillis = System.currentTimeMillis(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargain::getProductId, productId); + lqw.eq(StoreBargain::getIsDel, false); + lqw.eq(StoreBargain::getStatus,true); + lqw.le(StoreBargain::getStartTime, timeMillis); + lqw.ge(StoreBargain::getStopTime, timeMillis); + lqw.orderByDesc(StoreBargain::getSort, StoreBargain::getId); + return mapper.selectList(lqw); + } + + /** + * 创建砍价活动 + * @param request 请求参数 + * @return MyRecord + */ + @Override + public MyRecord start(BargainFrontRequest request) { + StoreBargain storeBargain = mapper.selectById(request.getBargainId()); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("对应的砍价商品不存在"); + } + if (!storeBargain.getStatus()) { + throw new YztException("砍价商品已下架"); + } + if (storeBargain.getQuota() <= 0 || storeBargain.getStock() <= 0) { + throw new YztException("砍价商品已售罄"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis > storeBargain.getStopTime()) { + throw new YztException("砍价活动已结束"); + } + User user = userService.getInfoException(); + + // 判断是否有正在砍价商品 + StoreBargainUser spavBargainUser = new StoreBargainUser(); + spavBargainUser.setIsDel(false).setBargainId(request.getBargainId()).setUid(user.getUid()); + List historyList = storeBargainUserService.getByEntity(spavBargainUser); + if (CollUtil.isNotEmpty(historyList)) { + List collect = historyList.stream().filter(i -> i.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + throw new YztException("请先完成当前砍价活动"); + } + // 判断是否达到参与砍价活动上限 + if (historyList.size() >= storeBargain.getNum()) { + throw new YztException("您已达到当前砍价活动上限"); + } + } + + StoreBargainUser storeBargainUser = new StoreBargainUser(); + storeBargainUser.setUid(user.getUid()); + storeBargainUser.setBargainId(request.getBargainId()); + storeBargainUser.setBargainPriceMin(storeBargain.getMinPrice()); + storeBargainUser.setBargainPrice(storeBargain.getPrice()); + storeBargainUser.setPrice(BigDecimal.ZERO); + storeBargainUser.setAddTime(System.currentTimeMillis()); + storeBargainUser.setStatus(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE); + boolean save = storeBargainUserService.save(storeBargainUser); + if (!save) { + throw new YztException("参与砍价失败"); + } + MyRecord record = new MyRecord(); + record.set("storeBargainUserId", storeBargainUser.getId()); + return record; + } + + /** + * 后台任务批量操作库存 + */ + @Override + public void consumeProductStock() { + String redisKey = Constants.PRODUCT_BARGAIN_STOCK_UPDATE; + Long size = redisUtil.getListSize(redisKey); + logger.info("StoreBargainServiceImpl.consumeProductStock | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (ObjectUtil.isNull(data)) { + continue; + } + try{ + StoreProductStockRequest storeProductStockRequest = + com.alibaba.fastjson.JSONObject.toJavaObject(com.alibaba.fastjson.JSONObject.parseObject(data.toString()), StoreProductStockRequest.class); + boolean result = doProductStock(storeProductStockRequest); + if(!result){ + redisUtil.lPush(redisKey, data); + } + }catch (Exception e){ + redisUtil.lPush(redisKey, data); + } + } + + } + + /** + * 砍价活动结束后处理 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void stopAfterChange() { + // 查询活动状态为开启,结束时间小于当前时间的数据 + List storeBargainList = getByStatusAndGtStopTime(); + logger.info("StoreBargainServiceImpl.stopAfterChange | size:" + storeBargainList.size()); + if (CollUtil.isEmpty(storeBargainList)) { + return; + } + List bargainUserList = CollUtil.newArrayList(); + for (StoreBargain bargain : storeBargainList) { + // 查询用户参与活动表中状态为进行中的数据 + StoreBargainUser spavBargainUser = new StoreBargainUser(); + spavBargainUser.setBargainId(bargain.getId()); + spavBargainUser.setStatus(BargainConstants.BARGAIN_USER_STATUS_PARTICIPATE); + spavBargainUser.setIsDel(false); + List bargainUsers = storeBargainUserService.getByEntity(spavBargainUser); + if (CollUtil.isEmpty(bargainUsers)) { + continue ; + } + for (StoreBargainUser bargainUser : bargainUsers) { + bargainUser.setStatus(BargainConstants.BARGAIN_USER_STATUS_FAIL); + } + bargainUserList.addAll(bargainUsers); + } + boolean b = storeBargainUserService.updateBatchById(bargainUserList, 100); + if (!b) { + logger.error("砍价活动结束后更新用户状态定时任务——————失败"); + throw new YztException("砍价活动结束后更新用户状态失败"); + } + } + + /** + * 商品是否存在砍价活动 + * @param productId 商品编号 + * @return Boolean + */ + @Override + public Boolean isExistActivity(Integer productId) { + // 查询商品关联的砍价商品 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargain::getProductId, productId); + List bargainList = mapper.selectList(lqw); + if (CollUtil.isEmpty(bargainList)) { + return false; + } + // 判断关联的商品是否处于活动开启状态 + List list = bargainList.stream().filter(i -> i.getStatus().equals(true)).collect(Collectors.toList()); + return CollUtil.isNotEmpty(list); + } + + /** + * 查询带异常 + * @param id 砍价商品id + * @return StoreBargain + */ + @Override + public StoreBargain getByIdException(Integer id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargain::getId, id); + lqw.eq(StoreBargain::getIsDel, false); + lqw.eq(StoreBargain::getStatus, true); + StoreBargain storeBargain = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeBargain)) throw new YztException("砍价商品不存在或未开启"); + return storeBargain; + } + + /** + * 添加/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + @Override + public Boolean operationStock(Integer id, Integer num, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota + {}", num)); + } + if (type.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota - {}", num)); + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format(" and (quota - {} >= 0)", num)); + } + updateWrapper.eq("id", id); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新砍价商品库存失败,商品id = " + id); + } + return update; + } + + /** + * 砍价首页信息 + * 砍价商品信息6条 + * @return BargainIndexResponse + */ + @Override + public BargainIndexResponse getIndexInfo() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreBargain::getId, StoreBargain::getProductId, StoreBargain::getTitle, StoreBargain::getMinPrice, StoreBargain::getPrice, StoreBargain::getImage, StoreBargain::getSales); + lqw.eq(StoreBargain::getStatus, true); + lqw.eq(StoreBargain::getIsDel, false); + lqw.gt(StoreBargain::getStock, 0); + long timeMillis = System.currentTimeMillis(); + lqw.le(StoreBargain::getStartTime, timeMillis); + lqw.ge(StoreBargain::getStopTime, timeMillis); + lqw.orderByDesc(StoreBargain::getSort, StoreBargain::getId); + lqw.last(" limit 6"); + List storeBargains = mapper.selectList(lqw); + if (CollUtil.isEmpty(storeBargains)) { + return null; + } + BargainIndexResponse response = new BargainIndexResponse(); + response.setProductList(storeBargains); + return response; + } + + /** + * 获取砍价列表header + * @return BargainHeaderResponse + */ + @Override + public BargainHeaderResponse getHeader() { + BargainHeaderResponse headerResponse = new BargainHeaderResponse(); + // 获取参与砍价总人数 + Integer bargainTotal = storeBargainUserHelpService.getCount(); + headerResponse.setBargainTotal(bargainTotal); + if (bargainTotal <= 0) { + return headerResponse; + } + // 获取砍价成功列表 + List bargainUserList = storeBargainUserService.getHeaderList(); + if (CollUtil.isEmpty(bargainUserList)) { + headerResponse.setBargainSuccessList(CollUtil.newArrayList()); + return headerResponse; + } + List uidList = bargainUserList.stream().map(StoreBargainUser::getUid).distinct().collect(Collectors.toList()); + HashMap userMap = userService.getMapListInUid(uidList); + List bargainIdList = bargainUserList.stream().map(StoreBargainUser::getBargainId).distinct().collect(Collectors.toList()); + HashMap bargainMap = getStoreNameMapInId(bargainIdList); + List> mapList = bargainUserList.stream().map(e -> { + // 获取用户昵称头像 + User user = userMap.get(e.getUid()); + HashMap map = CollUtil.newHashMap(); + map.put("nickName", user.getNickname()); + map.put("avatar", user.getAvatar()); + map.put("price", e.getBargainPriceMin()); + map.put("title", bargainMap.get(e.getBargainId())); + return map; + }).collect(Collectors.toList()); + headerResponse.setBargainSuccessList(mapList); + return headerResponse; + } + + /** + * 根据id数组获取砍价商品map + * @param bargainIdList 砍价商品id数组 + * @return HashMap + */ + @Override + public HashMap getMapInId(List bargainIdList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(StoreBargain::getId, bargainIdList); + List bargainList = mapper.selectList(lqw); + HashMap map = CollUtil.newHashMap(); + bargainList.forEach(e -> { + map.put(e.getId(), e); + }); + return map; + } + + /** + * 获取砍价商品名称Map + * @param bargainIdList 砍价商品id数组 + * @return List> + */ + private HashMap getStoreNameMapInId(List bargainIdList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreBargain::getId, StoreBargain::getTitle); + lqw.in(StoreBargain::getId, bargainIdList); + List bargainList = mapper.selectList(lqw); + HashMap map = CollUtil.newHashMap(); + bargainList.forEach(e -> { + map.put(e.getId(), e.getTitle()); + }); + return map; + } + + /** + * 查询活动状态为开启,结束时间小于当前时间的数据 + * @return List + */ + private List getByStatusAndGtStopTime() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargain::getStatus, true); + lqw.lt(StoreBargain::getStopTime, System.currentTimeMillis()); + return mapper.selectList(lqw); + } + + // 砍价操作库存 + private boolean doProductStock(StoreProductStockRequest storeProductStockRequest){ + // 砍价商品信息回滚 + StoreBargain existProduct = getById(storeProductStockRequest.getBargainId()); + List existAttr = + attrValueService.getListByProductIdAndAttrId( + storeProductStockRequest.getBargainId(), + storeProductStockRequest.getAttrId().toString(), + storeProductStockRequest.getType()); + if(ObjectUtil.isNull(existProduct) || ObjectUtil.isNull(existAttr)){ // 未找到商品 + logger.info("库存修改任务未获取到商品信息"+JSON.toJSONString(storeProductStockRequest)); + return true; + } + + // 回滚商品库存/销量 并更新 + boolean isPlus = storeProductStockRequest.getOperationType().equals("add"); + int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum(); + existProduct.setStock(productStock); + existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum()); + existProduct.setQuota(existProduct.getQuota() + storeProductStockRequest.getNum()); + updateById(existProduct); + + // 回滚sku库存 + for (StoreProductAttrValue attrValue : existAttr) { + int productAttrStock = isPlus ? attrValue.getStock() + storeProductStockRequest.getNum() : attrValue.getStock() - storeProductStockRequest.getNum(); + attrValue.setStock(productAttrStock); + attrValue.setSales(attrValue.getSales()-storeProductStockRequest.getNum()); + attrValue.setQuota(attrValue.getQuota() + storeProductStockRequest.getNum()); + attrValueService.updateById(attrValue); + } + + // 商品本身库存回滚 + // StoreProductStockRequest 创建次对象调用商品扣减库存实现扣减上本本身库存 + StoreProductResponse existProductLinkedSeckill = storeProductService.getByProductId(storeProductStockRequest.getProductId()); + for (StoreProductAttrValueResponse attrValueResponse : existProductLinkedSeckill.getAttrValue()) { + if(attrValueResponse.getSuk().equals(storeProductStockRequest.getSuk())){ + StoreProductStockRequest r = new StoreProductStockRequest() + .setAttrId(attrValueResponse.getId()) + .setNum(storeProductStockRequest.getNum()) + .setOperationType("add") + .setProductId(storeProductStockRequest.getProductId()) + .setType(Constants.PRODUCT_TYPE_NORMAL) + .setSuk(storeProductStockRequest.getSuk()); + storeProductService.doProductStock(r); + } + } + return true; + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserHelpServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserHelpServiceImpl.java new file mode 100644 index 0000000..d432e02 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserHelpServiceImpl.java @@ -0,0 +1,422 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.BargainConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.NotifyConstants; +import com.yzt.common.constants.UserConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.bargain.StoreBargainUser; +import com.yzt.common.model.bargain.StoreBargainUserHelp; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserToken; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.response.StoreBargainUserHelpResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.mapper.StoreBargainUserHelpMapper; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * StoreBargainUserHelpService 实现类 + * + */ +@Service +public class StoreBargainUserHelpServiceImpl extends ServiceImpl implements StoreBargainUserHelpService { + private static final Logger log = LoggerFactory.getLogger(StoreBargainUserHelpServiceImpl.class); + + @Resource + private StoreBargainUserHelpMapper mapper; + + @Autowired + private StoreBargainUserService storeBargainUserService; + + @Autowired + private UserService userService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private SystemNotificationService systemNotificationService; + + + /** + * 列表 + * @param bargainUserId 砍价活动id + * @return List + */ + @Override + public List getList(Integer bargainUserId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargainUserHelp::getBargainUserId, bargainUserId); + lqw.orderByDesc(StoreBargainUserHelp::getId); + List helpList = mapper.selectList(lqw); + if (CollUtil.isEmpty(helpList)) { + return CollUtil.newArrayList(); + } + List list = helpList.stream().map(help -> { + StoreBargainUserHelpResponse helpResponse = new StoreBargainUserHelpResponse(); + BeanUtils.copyProperties(help, helpResponse); + helpResponse.setAddTime(YztDateUtil.timestamp2DateStr(help.getAddTime(), Constants.DATE_FORMAT)); + User user = userService.getById(help.getUid()); + helpResponse.setAvatar(user.getAvatar()); + helpResponse.setNickname(user.getNickname()); + return helpResponse; + }).collect(Collectors.toList()); + return list; + } + + /** + * 获取帮助砍价人数 + * @param bargainId 砍价商品ID + * @return Long + */ + @Override + public Long getHelpCountByBargainId(Integer bargainId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(StoreBargainUserHelp::getId); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainId, bargainId); + return mapper.selectCount(lambdaQueryWrapper).longValue(); + } + + /** + * 获取帮助砍价人数 + * @param bargainId 砍价商品ID + * @param bargainUserId 砍价商品发起用户表id + * @return Long + */ + @Override + public Long getHelpCountByBargainIdAndBargainUid(Integer bargainId, Integer bargainUserId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(StoreBargainUserHelp::getId); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainId, bargainId); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainUserId, bargainUserId); + return mapper.selectCount(lambdaQueryWrapper).longValue(); + } + + /** + * 砍价 + * @param request 砍价请求参数 + * @return 砍价金额 + */ + @Override + public Map help(BargainFrontRequest request) { + if (ObjectUtil.isNull(request.getBargainUserId())) { + throw new YztException("砍价活动id不能为空"); + } + + Map map = new HashMap<>(); + User user = userService.getInfoException(); + StoreBargain storeBargain = storeBargainService.getById(request.getBargainId()); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("对应的砍价商品不存在"); + } + if (!storeBargain.getStatus()) { + throw new YztException("砍价商品已下架"); + } + if (storeBargain.getQuota() <= 0 || storeBargain.getStock() <= 0) { + throw new YztException("砍价商品已售罄"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (currentTimeMillis < storeBargain.getStartTime()) { + throw new YztException("砍价活动未开始"); + } + if (currentTimeMillis > storeBargain.getStopTime()) { + throw new YztException("砍价活动已结束"); + } + StoreBargainUser storeBargainUser = storeBargainUserService.getById(request.getBargainUserId()); + if (ObjectUtil.isNull(storeBargainUser)) { + throw new YztException("砍价商品用户信息不存在"); + } + + // 判断是否砍价成功 + if (storeBargainUser.getStatus().equals(BargainConstants.BARGAIN_USER_STATUS_SUCCESS) || storeBargainUser.getBargainPriceMin().compareTo(storeBargainUser.getBargainPrice().subtract(storeBargainUser.getPrice())) >= 0) { + throw new YztException("商品已完成砍价"); + } + + // 给自己砍价 + if (user.getUid().equals(storeBargainUser.getUid())) { + StoreBargainUserHelp myHelp = getByUidAndBargainIdAndBargainUserId(user.getUid(), storeBargain.getId(), storeBargainUser.getId()); + if (ObjectUtil.isNotNull(myHelp)) { + throw new YztException("您已经砍过了"); + } + } else {// 不是给自己砍价,不包含给自己砍的 + // 用户对本商品的砍价次数 + List tempUserList = storeBargainUserService.getListByBargainIdAndUid(storeBargain.getId(), user.getUid()); + if (CollUtil.isNotEmpty(tempUserList)) { + List tempUserIdList = tempUserList.stream().map(StoreBargainUser::getId).collect(Collectors.toList()); + Integer helpCount = getUserHelpNum(user.getUid(), storeBargain.getId(), tempUserIdList); + if (helpCount >= storeBargain.getBargainNum()) { + throw new YztException("您的帮砍次数已达上限"); + } + } + } + + // 获取活动用户的总已砍次数 + Long helpCount = getHelpCountByBargainIdAndBargainUid(request.getBargainId(), storeBargainUser.getId()); + // 计算砍价金额 + BigDecimal bargainPrice = helpBargain(storeBargain, storeBargainUser, helpCount); + boolean isOut = false; + if (storeBargain.getPeopleNum().equals(helpCount.intValue() + 1)) { + isOut = true; + } + + boolean finalIsOut = isOut; + Boolean execute = transactionTemplate.execute(e -> { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(StoreBargainUser::getPrice, storeBargainUser.getPrice().add(bargainPrice)); + if (finalIsOut) { + updateWrapper.set(StoreBargainUser::getStatus, 3); + } + updateWrapper.eq(StoreBargainUser::getId, storeBargainUser.getId()); + updateWrapper.eq(StoreBargainUser::getPrice, storeBargainUser.getPrice()); + storeBargainUserService.update(updateWrapper); + storeBargainUser.setPrice(storeBargainUser.getPrice().add(bargainPrice)); + + StoreBargainUserHelp userHelp = new StoreBargainUserHelp(); + userHelp.setBargainId(request.getBargainId()); + userHelp.setBargainUserId(storeBargainUser.getId()); + userHelp.setUid(user.getUid()); + userHelp.setPrice(bargainPrice); + userHelp.setAddTime(System.currentTimeMillis()); + save(userHelp); + + // 分享人数添加 + if (!user.getUid().equals(request.getBargainUserUid())) { + storeBargain.setShare(storeBargain.getShare() + 1); + storeBargainService.updateById(storeBargain); + } + + return Boolean.TRUE; + }); + + if (!execute) { + throw new YztException("砍价失败!"); + } + + try { + // 如果砍价完成,发送微信模板消息 + if (isOut) { + // 发送微信模板消息 + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.BARGAINING_SUCCESS_MARK); + if (notification.getIsWechat().equals(1) || notification.getIsRoutine().equals(1)) { + User tempUser = userService.getById(storeBargainUser.getUid()); + pushMessageOrder(storeBargain, tempUser, notification); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("砍价成功发送微信消息失败:{}", e.getMessage()); + } + map.put("bargainPrice", bargainPrice); + return map; + } + + /** + * 发送消息通知 + * @param storeBargain 砍价商品 + * @param user 发起砍价用户 + */ + private void pushMessageOrder(StoreBargain storeBargain, User user, SystemNotification notification) { + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNotNull(userToken)) { + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "好腻害!你的朋友们已经帮你砍到底价了!"); + temMap.put("keyword1", storeBargain.getTitle()); + temMap.put("keyword2", storeBargain.getMinPrice().toString()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "请尽快支付!"); + templateMessageService.pushTemplateMessage(notification.getWechatId(), temMap, userToken.getToken()); + return; + } + } + if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 +// temMap.put("thing6", storeBargain.getTitle()); +// temMap.put("amount3", storeBargain.getMinPrice().toString() + "元"); +// temMap.put("thing7", "好腻害!你的朋友们已经帮你砍到底价了!"); + temMap.put("thing1", storeBargain.getTitle()); + temMap.put("amount2", storeBargain.getMinPrice().toString() + "元"); + temMap.put("thing3", "好腻害!你的朋友们已经帮你砍到底价了!"); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), temMap, userToken.getToken()); + } + } + + /** + * 获取参与砍价总人数(次) + * @return Integer + */ + @Override + public Integer getCount() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreBargainUserHelp::getId); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 获取好友助力列表 + * @param bargainUserId 砍价用户表id + * @return List + */ + @Override + public List getHelpListByBargainUserId(Integer bargainUserId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargainUserHelp::getBargainUserId, bargainUserId); + return mapper.selectList(lqw); + } + + /** + * 是否帮砍过 + * @param bargainUserId 用户砍价活动id + * @param uid 用户uid + * @return Boolean + */ + @Override + public Boolean getIsHelp(Integer bargainUserId, Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargainUserHelp::getBargainUserId, bargainUserId); + lqw.eq(StoreBargainUserHelp::getUid, uid); + StoreBargainUserHelp userHelp = mapper.selectOne(lqw); + if (ObjectUtil.isNull(userHelp)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + /** + * 获取该砍价商品用户的帮砍次数 + * @param bargainId 砍价商品id + * @param uid 用户uid + * @param bargainUserIdList 用户参与砍价活动id数组 + * @return Integer + */ + @Override + public Integer getHelpCountByBargainIdAndUidInBUserId(Integer bargainId, Integer uid, List bargainUserIdList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreBargainUserHelp::getId); + lqw.eq(StoreBargainUserHelp::getBargainId, bargainId); + lqw.eq(StoreBargainUserHelp::getUid, uid); + lqw.notIn(StoreBargainUserHelp::getBargainUserId, bargainUserIdList); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 砍价金额计算 + * @param storeBargain 砍价商品 + * @param storeBargainUser 砍价商品用户 + * @param helpCount 帮助砍价次数 + * @return + * 砍价时在设置好的价格区间内以大于20%小于80%之间随机一个价格后 在总金额中减去,砍价最后一位不可随机价格,直接砍价到设置区间的最低价格为准 + * + * 剩余砍价金额 - 剩余砍价次数 * 0.01 = 可砍价金额 + * 可砍价金额 > 0.01 以大于20%小于80%之间随机一个价格 + * + */ + private BigDecimal helpBargain(StoreBargain storeBargain, StoreBargainUser storeBargainUser, Long helpCount) { + BigDecimal minPrice = storeBargainUser.getBargainPriceMin();//底价 + BigDecimal price = storeBargainUser.getBargainPrice();//砍价商品金额 + BigDecimal userPrice = storeBargainUser.getPrice();//已砍金额 + Integer peopleNum = storeBargain.getPeopleNum();//帮助砍价好友人数限定 + + BigDecimal subtract = price.subtract(minPrice);// 可砍价金额(总) + + BigDecimal bargainPrice; + double retainPrice;// 需要保留的金额 + // 没有砍过 + if (helpCount == 0) { + // 可砍价金额 + retainPrice = (peopleNum - 1) * 0.01; + BigDecimal canBargainPrice = subtract.subtract(new BigDecimal(retainPrice)); + if (canBargainPrice.compareTo(new BigDecimal("0.01")) > 0) {// 超过0.01 + bargainPrice = RandomUtil.randomBigDecimal(subtract.multiply(new BigDecimal(Constants.BARGAIN_TATIO_DOWN)), subtract.multiply(new BigDecimal(Constants.BARGAIN_TATIO_UP))); + if (bargainPrice.compareTo(new BigDecimal("0.01")) < 0) { + bargainPrice = new BigDecimal("0.01"); + } + return bargainPrice.setScale(2, BigDecimal.ROUND_HALF_UP); + } + return new BigDecimal("0.01"); + } + // 最后一次砍价 + if (peopleNum - helpCount.intValue() == 1) { + return subtract.subtract(userPrice); + } + // 其他情况 + retainPrice = (peopleNum - helpCount.intValue()) * 0.01; + BigDecimal remaining = subtract.subtract(userPrice).subtract(new BigDecimal(retainPrice)); + if (remaining.compareTo(new BigDecimal("0.01")) > 0) {// 超过0.01 + bargainPrice = RandomUtil.randomBigDecimal(remaining.multiply(new BigDecimal(Constants.BARGAIN_TATIO_DOWN)), remaining.multiply(new BigDecimal(Constants.BARGAIN_TATIO_UP))); + if (bargainPrice.compareTo(new BigDecimal("0.01")) < 0) { + bargainPrice = new BigDecimal("0.01"); + } + return bargainPrice.setScale(2, BigDecimal.ROUND_HALF_UP); + } + return new BigDecimal("0.01"); + } + + /** + * 获取帮助砍价用户的帮砍次数 + */ + private StoreBargainUserHelp getByUidAndBargainIdAndBargainUserId(Integer uid, Integer bargainId, Integer bargainUserId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getUid, uid); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainId, bargainId); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainUserId, bargainUserId); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 获取用户帮砍次数 + * 用户对商品砍了几次(不包含自己) + * @param uid 用户uid + * @param bargainId 砍价商品id + * @return Integer + */ + private Integer getUserHelpNum(Integer uid, Integer bargainId, List tempUserIdList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(StoreBargainUserHelp::getId); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getUid, uid); + lambdaQueryWrapper.eq(StoreBargainUserHelp::getBargainId, bargainId); + if (CollUtil.isNotEmpty(tempUserIdList)) { + lambdaQueryWrapper.notIn(StoreBargainUserHelp::getBargainUserId, tempUserIdList); + } + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserServiceImpl.java new file mode 100644 index 0000000..8f8a2de --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreBargainUserServiceImpl.java @@ -0,0 +1,604 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.bargain.StoreBargainUser; +import com.yzt.common.model.bargain.StoreBargainUserHelp; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.BargainFrontRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreBargainUserSearchRequest; +import com.yzt.common.response.BargainRecordResponse; +import com.yzt.common.response.BargainUserInfoResponse; +import com.yzt.common.response.StoreBargainUserResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.StoreBargainUserMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreBargainUserService 实现类 + * + */ +@Service +public class StoreBargainUserServiceImpl extends ServiceImpl implements StoreBargainUserService { + + @Resource + private StoreBargainUserMapper mapper; + + @Autowired + private UserService userService; + + @Lazy + @Autowired + private StoreBargainService storeBargainService; + + @Lazy + @Autowired + private StoreBargainUserHelpService storeBargainUserHelpService; + + @Lazy + @Autowired + private StoreOrderService storeOrderService; + + + /** + * 分页展示砍价参与用户列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreBargainUserSearchRequest request, PageParamRequest pageParamRequest) { + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotNull(request.getStatus())) { + lqw.eq(StoreBargainUser::getStatus, request.getStatus()); + } + if (StrUtil.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + lqw.between(StoreBargainUser::getAddTime, YztDateUtil.dateStr2Timestamp(dateLimit.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN), YztDateUtil.dateStr2Timestamp(dateLimit.getEndTime(), Constants.DATE_TIME_TYPE_END)); + } + lqw.orderByDesc(StoreBargainUser::getId); + List bargainUserList = mapper.selectList(lqw); + if (CollUtil.isEmpty(bargainUserList)) { + return CommonPage.copyPageInfo(startPage, CollUtil.newArrayList()); + } + List list = bargainUserList.stream().map(bargainUser -> { + StoreBargainUserResponse bargainUserResponse = new StoreBargainUserResponse(); + BeanUtils.copyProperties(bargainUser, bargainUserResponse); + bargainUserResponse.setAddTime(YztDateUtil.timestamp2DateStr(bargainUser.getAddTime(), Constants.DATE_FORMAT)); + bargainUserResponse.setNowPrice(bargainUser.getBargainPrice().subtract(bargainUser.getPrice())); + // 查询用户信息 + User user = userService.getById(bargainUser.getUid()); + bargainUserResponse.setAvatar(user.getAvatar()); + bargainUserResponse.setNickname(user.getNickname()); + // 查询砍价商品信息 + StoreBargain storeBargain = storeBargainService.getById(bargainUser.getBargainId()); + bargainUserResponse.setTitle(storeBargain.getTitle()); + + bargainUserResponse.setDataTime(YztDateUtil.timestamp2DateStr(storeBargain.getStopTime(), Constants.DATE_FORMAT)); + bargainUserResponse.setPeopleNum(storeBargain.getPeopleNum()); + // 剩余砍价次数 + Long helpCount = storeBargainUserHelpService.getHelpCountByBargainIdAndBargainUid(storeBargain.getId(), bargainUser.getId()); + bargainUserResponse.setNum(storeBargain.getPeopleNum() - helpCount.intValue()); + return bargainUserResponse; + }).collect(Collectors.toList()); + + return CommonPage.copyPageInfo(startPage, list); + } + + /** + * 获取砍价用户列表 + * @param bargainId 砍价商品ID + * @return List + */ + @Override + public List getListByBargainId(Integer bargainId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id", "status"); + qw.eq("bargain_id", bargainId).eq("is_del", false); + return mapper.selectList(qw); + } + + /** + * 通过砍价商品ID + 用户uid 获取用户砍价中砍价商品信息 + * @param bargainId 砍价商品编号 + * @param uid 参与用户uid + * @return StoreBargainUser + */ + @Override + public List getListByBargainIdAndUid(Integer bargainId, Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreBargainUser::getBargainId, bargainId); + lqw.eq(StoreBargainUser::getUid, uid); + lqw.eq(StoreBargainUser::getIsDel, false); + return mapper.selectList(lqw); + } + + /** + * 砍价商品用户根据实体查询 + * @param bargainUser 砍价活动 + * @return List + */ + @Override + public List getByEntity(StoreBargainUser bargainUser) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.setEntity(bargainUser); + return mapper.selectList(lqw); + } + + /** + * 获取砍价成功列表Header + */ + @Override + public List getHeaderList() { +// LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); +// lqw.eq(StoreBargainUser::getStatus, 3); +// lqw.eq(StoreBargainUser::getIsDel, false); +// lqw.groupBy(StoreBargainUser::getUid); +// lqw.orderByDesc(StoreBargainUser::getId); +// lqw.last(" limit 10"); +// return mapper.selectList(lqw); + return mapper.selectHeaderList(); + } + + /** + * 获取用户砍价信息 + * @param bargainFrontRequest 请求参数 + * @return BargainUserInfoResponse + */ + @Override + public BargainUserInfoResponse getBargainUserInfo(BargainFrontRequest bargainFrontRequest) { + if (ObjectUtil.isNull(bargainFrontRequest.getBargainUserId()) || bargainFrontRequest.getBargainUserId()<= 0) { // 获取自己的砍价信息 + return oneselfBargainActivity(bargainFrontRequest); + } + return otherBargainActivity(bargainFrontRequest); + } + + /** + * 其他途径进入砍价活动 + * @param bargainFrontRequest 请求参数 + * @return BargainUserInfoResponse + */ + private BargainUserInfoResponse otherBargainActivity(BargainFrontRequest bargainFrontRequest) { + User user = userService.getInfoException(); + // 获取砍价商品信息 + StoreBargain storeBargain = storeBargainService.getById(bargainFrontRequest.getBargainId()); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("未找到对应砍价商品信息"); + } + if (!storeBargain.getStatus()) { + throw new YztException("砍价商品已下架"); + } + if (storeBargain.getStock() <= 0 || storeBargain.getQuota() <= 0) { + throw new YztException("砍价商品已售罄"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (storeBargain.getStopTime() < currentTimeMillis) { + throw new YztException("活动已结束"); + } + StoreBargainUser bargainUser = getById(bargainFrontRequest.getBargainUserId()); + if (ObjectUtil.isNull(bargainUser)) { + throw new YztException("用户砍价活动未找到"); + } + if (bargainUser.getIsDel()) { + throw new YztException("用户砍价活动已取消"); + } + if (bargainUser.getStatus().equals(2)) { + throw new YztException("砍价活动已过期"); + } + // 判断是否是自己的砍价活动 + BargainUserInfoResponse infoResponse = new BargainUserInfoResponse(); + int bargainStatus;// 砍价状态 + int percent;// 砍价百分比 + if (bargainUser.getUid().equals(user.getUid())) {// 自己的砍价活动 + if (bargainUser.getStatus().equals(3)) {// 砍价已完成 + // 判断是否生成订单 + StoreOrder bargainOrder = storeOrderService.getByBargainOrder(bargainUser.getBargainId(), bargainUser.getId()); + if (ObjectUtil.isNotNull(bargainOrder)) {// 有订单 + // 判断是否支付 + if (!bargainOrder.getPaid()) {// 未支付 + bargainStatus = 8;// 砍价已生成订单未支付 + if (bargainOrder.getIsDel() || bargainOrder.getIsSystemDel()) { + bargainStatus = 10;// 订单未支付已取消 + } + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + return infoResponse; + } + // 已支付 + bargainStatus = 9;// 砍价订单已支付 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + return infoResponse; + } + // 无订单 + bargainStatus = 4;// 砍价已完成 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + return infoResponse; + } + bargainStatus = 3;// 砍价中 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = bargainUser.getBargainPrice().subtract(storeBargain.getMinPrice()).subtract(alreadyPrice);// 剩余金额 + percent = YztUtil.percentInstanceIntVal(alreadyPrice, alreadyPrice.add(surplusPrice)); + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + return infoResponse; + } + // 其他人的砍价活动 + if (bargainUser.getStatus().equals(3)) { + bargainStatus = 4;// 砍价已完成 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + User tempUser = userService.getById(bargainUser.getUid()); + infoResponse.setStoreBargainUserName(tempUser.getNickname()); + infoResponse.setStoreBargainUserAvatar(tempUser.getAvatar()); + return infoResponse; + } + // 是否帮ta砍过 + Boolean isHelp = storeBargainUserHelpService.getIsHelp(bargainUser.getId(), user.getUid()); + if (isHelp) { // 帮砍过 + bargainStatus = 6;// 已帮砍 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = bargainUser.getBargainPrice().subtract(storeBargain.getMinPrice()).subtract(alreadyPrice);// 剩余金额 + percent = YztUtil.percentInstanceIntVal(alreadyPrice, alreadyPrice.add(surplusPrice)); + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + User tempUser = userService.getById(bargainUser.getUid()); + infoResponse.setStoreBargainUserName(tempUser.getNickname()); + infoResponse.setStoreBargainUserAvatar(tempUser.getAvatar()); + return infoResponse; + } + // 获取该砍价商品用户的帮砍次数 + Integer helpNum = getHelpNumByBargainIdAndUid(bargainFrontRequest.getBargainId(), user.getUid()); + if (storeBargain.getBargainNum() <= helpNum) { + bargainStatus = 7;// 帮砍次数已满 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = bargainUser.getBargainPrice().subtract(storeBargain.getMinPrice()).subtract(alreadyPrice);// 剩余金额 + percent = YztUtil.percentInstanceIntVal(alreadyPrice, alreadyPrice.add(surplusPrice)); + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + User tempUser = userService.getById(bargainUser.getUid()); + infoResponse.setStoreBargainUserName(tempUser.getNickname()); + infoResponse.setStoreBargainUserAvatar(tempUser.getAvatar()); + return infoResponse; + } + // 没有帮砍过 + bargainStatus = 5;// 可以帮砍 + BigDecimal alreadyPrice = bargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = bargainUser.getBargainPrice().subtract(storeBargain.getMinPrice()).subtract(alreadyPrice);// 剩余金额 + percent = YztUtil.percentInstanceIntVal(alreadyPrice, alreadyPrice.add(surplusPrice)); + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(bargainUser.getId())); + infoResponse.setStoreBargainUserId(bargainUser.getId()); + User tempUser = userService.getById(bargainUser.getUid()); + infoResponse.setStoreBargainUserName(tempUser.getNickname()); + infoResponse.setStoreBargainUserAvatar(tempUser.getAvatar()); + return infoResponse; + } + + /** + * 获取好友助力列表 + * @param bargainUserId 砍价活动id + * @return List + */ + private List getHelpList(Integer bargainUserId) { + List helpList = storeBargainUserHelpService.getHelpListByBargainUserId(bargainUserId); + helpList.forEach(e -> { + User helpUser = userService.getById(e.getUid()); + e.setNickname(helpUser.getNickname()); + e.setAvatar(helpUser.getAvatar()); + e.setAddTimeStr(cn.hutool.core.date.DateUtil.date(e.getAddTime()).toString()); + }); + return helpList; + } + + /** + * 自己的砍价活动 + * @param bargainFrontRequest 请求参数 + * @return BargainUserInfoResponse + */ + private BargainUserInfoResponse oneselfBargainActivity(BargainFrontRequest bargainFrontRequest) { + User user = userService.getInfoException(); + // 获取砍价商品信息 + StoreBargain storeBargain = storeBargainService.getById(bargainFrontRequest.getBargainId()); + if (ObjectUtil.isNull(storeBargain) || storeBargain.getIsDel()) { + throw new YztException("未找到对应砍价商品信息"); + } + if (!storeBargain.getStatus()) { + throw new YztException("砍价商品已下架"); + } + if (storeBargain.getStock() <= 0 || storeBargain.getQuota() <= 0) { + throw new YztException("砍价商品已售罄"); + } + long currentTimeMillis = System.currentTimeMillis(); + if (storeBargain.getStopTime() < currentTimeMillis) { + throw new YztException("活动已结束"); + } + + BargainUserInfoResponse infoResponse = new BargainUserInfoResponse(); + // 查看是否有正在砍价的信息 + StoreBargainUser storeBargainUser = getLastByIdAndUid(bargainFrontRequest.getBargainId(), user.getUid()); + int percent = 0;// 砍价百分比 + int bargainStatus = 1;// 砍价状态:1-可以参与砍价 + if (ObjectUtil.isNull(storeBargainUser)) {// 没有参与该商品的砍价活动 + BigDecimal alreadyPrice = BigDecimal.ZERO;// 已砍金额 + BigDecimal surplusPrice = storeBargain.getPrice().subtract(storeBargain.getMinPrice());// 剩余金额 + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + return infoResponse; + } + if (storeBargainUser.getStatus().equals(2)) {// 活动结束,砍价未完成 + throw new YztException("未在活动期内完成砍价"); + } + // 参与过该商品的砍价 + if (storeBargainUser.getIsDel()) { // 已取消 + // 获取用户参与过的次数 + Integer bargainCount = getCountByBargainIdAndUid(bargainFrontRequest.getBargainId(), user.getUid()); + if (storeBargain.getNum() >= bargainCount) { + bargainStatus = 2;// 参与次数已满 + BigDecimal alreadyPrice = BigDecimal.ZERO;// 已砍金额 + BigDecimal surplusPrice = storeBargain.getPrice().subtract(storeBargain.getMinPrice());// 剩余金额 + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + return infoResponse; + } + // 还可以参与 + BigDecimal alreadyPrice = BigDecimal.ZERO;// 已砍金额 + BigDecimal surplusPrice = storeBargain.getPrice().subtract(storeBargain.getMinPrice());// 剩余金额 + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + return infoResponse; + } + if (storeBargainUser.getStatus().equals(3)) {// 砍价已完成 + // 判断是否生成订单 + StoreOrder bargainOrder = storeOrderService.getByBargainOrder(storeBargainUser.getBargainId(), storeBargainUser.getId()); + if (ObjectUtil.isNotNull(bargainOrder)) {// 有订单 + // 判断是否支付 + if (!bargainOrder.getPaid()) {// 未支付 + bargainStatus = 8;// 砍价已生成订单未支付 + if (bargainOrder.getIsDel()) { + bargainStatus = 10;// 订单未支付已取消 + } + BigDecimal alreadyPrice = storeBargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(storeBargainUser.getId())); + infoResponse.setStoreBargainUserId(storeBargainUser.getId()); + return infoResponse; + } + // 已支付,看起新的活动 + // 获取用户参与过的次数 + Integer bargainCount = getCountByBargainIdAndUid(bargainFrontRequest.getBargainId(), user.getUid()); + if (storeBargain.getNum() <= bargainCount) { + bargainStatus = 2;// 参与次数已满 + BigDecimal alreadyPrice = BigDecimal.ZERO;// 已砍金额 + BigDecimal surplusPrice = storeBargain.getPrice().subtract(storeBargain.getMinPrice());// 剩余金额 + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + return infoResponse; + } + // 还可以参与 + BigDecimal alreadyPrice = BigDecimal.ZERO;// 已砍金额 + BigDecimal surplusPrice = storeBargain.getPrice().subtract(storeBargain.getMinPrice());// 剩余金额 + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + return infoResponse; + } + // 没有订单 + bargainStatus = 4;// 砍价已完成 + BigDecimal alreadyPrice = storeBargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = BigDecimal.ZERO;// 剩余金额 + percent = 100; + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(storeBargainUser.getId())); + infoResponse.setStoreBargainUserId(storeBargainUser.getId()); + return infoResponse; + } + // 有尚未砍完的活动 + bargainStatus = 3;// 砍价中 + BigDecimal alreadyPrice = storeBargainUser.getPrice();// 已砍金额 + BigDecimal surplusPrice = storeBargainUser.getBargainPrice().subtract(storeBargain.getMinPrice()).subtract(alreadyPrice);// 剩余金额 + percent = YztUtil.percentInstanceIntVal(alreadyPrice, alreadyPrice.add(surplusPrice)); + infoResponse.setBargainStatus(bargainStatus); + infoResponse.setAlreadyPrice(alreadyPrice); + infoResponse.setSurplusPrice(surplusPrice); + infoResponse.setBargainPercent(percent); + // 获取好友助力列表 + infoResponse.setUserHelpList(getHelpList(storeBargainUser.getId())); + infoResponse.setStoreBargainUserId(storeBargainUser.getId()); + return infoResponse; + } + + /** + * 获取最后一条砍价信息 + * @return StoreBargainUser + */ + private StoreBargainUser getLastByIdAndUid(Integer id, Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreBargainUser::getBargainId, id); + lqw.eq(StoreBargainUser::getUid, uid); + lqw.orderByDesc(StoreBargainUser::getId); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 砍价记录 + * @return PageInfo + */ + @Override + public PageInfo getRecordList(PageParamRequest pageParamRequest) { + Integer userId = userService.getUserIdException(); + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreBargainUser::getUid, userId); + lqw.orderByDesc(StoreBargainUser::getId); + List bargainUserList = mapper.selectList(lqw); + if (CollUtil.isEmpty(bargainUserList)) { + return new PageInfo<>(); + } + List bargainIdList = bargainUserList.stream().map(StoreBargainUser::getBargainId).distinct().collect(Collectors.toList()); + HashMap bargainMap = storeBargainService.getMapInId(bargainIdList); + List responseList = bargainUserList.stream().map(e -> { + BargainRecordResponse recordResponse = new BargainRecordResponse(); + StoreBargain storeBargain = bargainMap.get(e.getBargainId()); + BeanUtils.copyProperties(storeBargain, recordResponse); + recordResponse.setBargainUserId(e.getId()); + recordResponse.setStatus(e.getStatus()); + recordResponse.setIsDel(e.getIsDel()); + recordResponse.setIsOrder(false); + recordResponse.setIsPay(false); + if (!e.getIsDel() && e.getStatus().equals(3)) { + // 查询是否有订单 + StoreOrder bargainOrder = storeOrderService.getByBargainOrder(e.getBargainId(), e.getId()); + if (ObjectUtil.isNotNull(bargainOrder)) { + recordResponse.setIsOrder(true); + if (bargainOrder.getIsDel()) { + recordResponse.setIsDel(true); + } else if (bargainOrder.getPaid()) { + recordResponse.setIsPay(true); + } else { + recordResponse.setOrderNo(bargainOrder.getOrderId()); + } + } + } + // 剩余金额 + BigDecimal surplusPrice; + if (e.getStatus().equals(3)) { + surplusPrice = e.getBargainPriceMin(); + } else { + surplusPrice = e.getBargainPrice().subtract(e.getPrice()); + } + recordResponse.setSurplusPrice(surplusPrice); + return recordResponse; + }).collect(Collectors.toList()); + + return CommonPage.copyPageInfo(startPage, responseList); + } + + private Integer getHelpNumByBargainIdAndUid(Integer bargainId, Integer uid) { + // 查看是否有正在砍价的信息 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreBargainUser::getId); + lqw.eq(StoreBargainUser::getBargainId, bargainId); + lqw.eq(StoreBargainUser::getUid, uid); + List bargainUserList = mapper.selectList(lqw); + if (CollUtil.isEmpty(bargainUserList)) { + return 0; + } + List bargainUserIdList = bargainUserList.stream().map(StoreBargainUser::getId).collect(Collectors.toList()); + return storeBargainUserHelpService.getHelpCountByBargainIdAndUidInBUserId(bargainId, uid, bargainUserIdList); + } + + /** + * 获取用户参与砍价活动的次数(成功) + * @param bargainId 砍价商品id + * @param uid 用户uid + * @return 用户参与砍价活动的次数(成功) + */ + private Integer getCountByBargainIdAndUid(Integer bargainId, Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreBargainUser::getBargainId, bargainId); + lqw.eq(StoreBargainUser::getUid, uid); + lqw.eq(StoreBargainUser::getIsDel, false); + lqw.eq(StoreBargainUser::getStatus, 3); + return mapper.selectCount(lqw).intValue(); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCartServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCartServiceImpl.java new file mode 100644 index 0000000..cdc30ba --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCartServiceImpl.java @@ -0,0 +1,497 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.RedisConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.cat.StoreCart; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.CartNumRequest; +import com.yzt.common.request.CartRequest; +import com.yzt.common.request.CartResetRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.CartInfoResponse; +import com.yzt.common.response.IndexProductResponse; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.mapper.StoreCartMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StoreCartServiceImpl 接口实现 + * + */ +@Service +public class StoreCartServiceImpl extends ServiceImpl implements StoreCartService { + + @Resource + private StoreCartMapper mapper; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private ActivityStyleService activityStyleService; + + @Autowired + private TenantService tenantService; + + /** + * 列表 + * @param pageParamRequest 分页类参数 + * @param isValid 是否失效 + * @return List + */ + @Override + public PageInfo getList(PageParamRequest pageParamRequest, boolean isValid) { + Integer userId = userService.getUserIdException(); + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + //带 StoreCart 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCart::getUid, userId); + lambdaQueryWrapper.eq(StoreCart::getStatus, isValid); + lambdaQueryWrapper.eq(StoreCart::getIsNew, false); + lambdaQueryWrapper.orderByDesc(StoreCart::getId); + List storeCarts = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeCarts)) { + return CommonPage.copyPageInfo(page, new ArrayList<>()); + } + + User user = userService.getInfo(); + SystemUserLevel userLevel = null; + if (ObjectUtil.isNotNull(user) && user.getLevel() > 0) { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + + List response = new ArrayList<>(); + for (StoreCart storeCart : storeCarts) { + CartInfoResponse cartInfoResponse = new CartInfoResponse(); + BeanUtils.copyProperties(storeCart, cartInfoResponse); + // 获取商品信息 + StoreProduct storeProduct = storeProductService.getCartByProId(storeCart.getProductId()); + cartInfoResponse.setImage(storeProduct.getImage()); + cartInfoResponse.setStoreName(storeProduct.getStoreName()); + + if (!isValid) {// 失效商品直接掠过 + cartInfoResponse.setAttrStatus(false); + response.add(cartInfoResponse); + continue ; + } + + // 获取对应的商品规格信息(只会有一条信息) + List attrValueList = storeProductAttrValueService.getListByProductIdAndAttrId(storeCart.getProductId(), + storeCart.getProductAttrUnique(), Constants.PRODUCT_TYPE_NORMAL); + // 规格不存在即失效 + if (CollUtil.isEmpty(attrValueList)) { + cartInfoResponse.setAttrStatus(false); + response.add(cartInfoResponse); + continue ; + } + StoreProductAttrValue attrValue = attrValueList.get(0); + if (StrUtil.isNotBlank(attrValue.getImage())) { + cartInfoResponse.setImage(attrValue.getImage()); + } + cartInfoResponse.setAttrId(attrValue.getId()); + cartInfoResponse.setSuk(attrValue.getSuk()); + cartInfoResponse.setPrice(attrValue.getPrice()); + cartInfoResponse.setAttrId(attrValue.getId()); + cartInfoResponse.setAttrStatus(attrValue.getStock() > 0); + cartInfoResponse.setStock(attrValue.getStock()); + cartInfoResponse.setTenantName(tenantService.getInfo(userService.getInfoByUid(userId).getTenantId()).getTenantName()); + if (ObjectUtil.isNotNull(userLevel)) { + BigDecimal vipPrice = attrValue.getPrice().multiply(new BigDecimal(userLevel.getDiscount())).divide(new BigDecimal(100), 2 ,BigDecimal.ROUND_HALF_UP); + cartInfoResponse.setVipPrice(vipPrice); + } + response.add(cartInfoResponse); + } + return CommonPage.copyPageInfo(page, response); + } + + /** + * 购物车数量 + * @param request 请求参数 + * @return Map + */ + @Override + public Map getUserCount(CartNumRequest request) { + Integer userId = userService.getUserIdException(); + Map map = new HashMap<>(); + int num; + if (request.getType().equals("total")) { + num = getUserCountByStatus(userId, request.getNumType()); + } else { + num = getUserSumByStatus(userId, request.getNumType()); + } + map.put("count", num); + return map; + } + + /** + * 新增商品至购物车 + * @param storeCartRequest 购物车参数 + * @return 添加后的成功标识 + */ + @Override + public String saveCate(CartRequest storeCartRequest) { + // 判断商品正常 + StoreProduct product = storeProductService.getById(storeCartRequest.getProductId()); + if (ObjectUtil.isNull(product) || product.getIsDel() || !product.getIsShow()) { + throw new YztException("未找到对应商品"); + } + List attrValues = storeProductAttrValueService.getListByProductIdAndAttrId(product.getId(), storeCartRequest.getProductAttrUnique(), Constants.PRODUCT_TYPE_NORMAL); + if (CollUtil.isEmpty(attrValues)) { + throw new YztException("未找到对应的商品SKU"); + } + + // 普通商品部分(只有普通商品才能添加购物车) + // 是否已经有同类型商品在购物车,有则添加数量没有则新增 + User currentUser = userService.getInfo(); + StoreCart storeCartPram = new StoreCart(); + storeCartPram.setProductAttrUnique(storeCartRequest.getProductAttrUnique()); + storeCartPram.setUid(currentUser.getUid()); + List existCarts = getByEntity(storeCartPram); // 这里仅仅能获取一条以信息 + String todayStr = DateUtil.date().toString(Constants.DATE_FORMAT_DATE); + if (existCarts.size() > 0) { // 购物车添加数量 + StoreCart forUpdateStoreCart = existCarts.get(0); + forUpdateStoreCart.setCartNum(forUpdateStoreCart.getCartNum() + storeCartRequest.getCartNum()); + forUpdateStoreCart.setUpdateTime(DateUtil.date()); + boolean updateResult = updateById(forUpdateStoreCart); + if (!updateResult) throw new YztException("添加购物车失败"); + + // 商品加购量统计(每日/商城) + redisUtil.incrAndCreate(RedisConstants.PRO_ADD_CART_KEY + todayStr); + // 商品加购量统计(每日/个体) + redisUtil.incrAndCreate(StrUtil.format(RedisConstants.PRO_PRO_ADD_CART_KEY, todayStr, storeCartRequest.getProductId())); + return forUpdateStoreCart.getId()+""; + } else {// 新增购物车数据 + StoreCart storeCart = new StoreCart(); + BeanUtils.copyProperties(storeCartRequest, storeCart); + storeCart.setUid(currentUser.getUid()); + storeCart.setType("product"); + if (mapper.insert(storeCart) <= 0) throw new YztException("添加购物车失败"); + // 商品加购量统计(每日/商城) + redisUtil.incrAndCreate(RedisConstants.PRO_ADD_CART_KEY + todayStr); + // 商品加购量统计(每日/个体) + redisUtil.incrAndCreate(StrUtil.format(RedisConstants.PRO_PRO_ADD_CART_KEY, todayStr, storeCartRequest.getProductId())); + return storeCart.getId()+""; + } + } + + + /** + * @return 购物车项目数 + */ + public String getCartItemCount(){ + User currentUser = userService.getInfo(); + return mapper.getCartItemCount(currentUser.getUid())+""; + } + + /** + * @return 购物车商品有效状态更新 + */ + public boolean updateCartStatus(Long id, Integer status) { + boolean enable = Integer.valueOf(1).equals(status); // 只有 1 认为是 true + return productStatusEnableFlag(id, enable); + } + + /** + * @return 购物车有效商品 + */ + @Override + public List getProductByCartIds() { + Integer userId = userService.getUserIdException(); + //带 StoreCart 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCart::getUid, userId); + lambdaQueryWrapper.eq(StoreCart::getStatus, true); + lambdaQueryWrapper.eq(StoreCart::getIsNew, false); + lambdaQueryWrapper.orderByDesc(StoreCart::getId); + List storeCarts = mapper.selectList(lambdaQueryWrapper); + List proIdList = storeCarts.stream() + .map(StoreCart::getProductId) + .collect(Collectors.toList()); + + // 构建 productId -> cartNum 映射 + Map productIdToCartNum = storeCarts.stream() + .collect(Collectors.toMap( + StoreCart::getProductId, + StoreCart::getCartNum, + Integer::sum + )); + + if (proIdList.isEmpty()) { + return Collections.emptyList(); + } + List byIdsAndLabel = storeProductService.findByIds(proIdList, "front"); + List productFrontResponses = byIdsAndLabel.stream().map(productItem -> { + IndexProductResponse response = new IndexProductResponse(); + BeanUtils.copyProperties(productItem, response); + response.setCartNum(productIdToCartNum.getOrDefault(productItem.getId(), 0)); + return response; + }).collect(Collectors.toList()); +// productFrontResponses.forEach(e -> { +// // 评论总数 +// Integer sumCount = storeProductReplyService.getCountByScore(e.getId(), ProductConstants.PRODUCT_REPLY_TYPE_ALL); +// // 好评总数 +// Integer goodCount = storeProductReplyService.getCountByScore(e.getId(), ProductConstants.PRODUCT_REPLY_TYPE_GOOD); +// +// +// String replyChance = "0"; +// if (sumCount > 0 && goodCount > 0) { +// replyChance = String.format("%.2f", ((goodCount.doubleValue() / sumCount.doubleValue()))); +// } +// e.setReplyNum(sumCount); +// e.setPositiveRatio(replyChance); +// e.setSales(e.getSales() + e.getFicti()); +// }); + + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + List products = new ArrayList<>(); + productFrontResponses.forEach(response -> { + StoreProduct product = new StoreProduct(); + BeanUtils.copyProperties(response, product); + products.add(product); + }); + List makeProductList = activityStyleService.makeActivityBorderStyle(products); + + makeProductList.forEach(p -> { + productFrontResponses.stream().map(resProduct -> { + if (p.getId().equals(resProduct.getId())) { + resProduct.setActivityStyle(p.getActivityStyle()); + } + return resProduct; + }).collect(Collectors.toList()); + }); + return productFrontResponses; + } + + /** + * 删除购物车信息 + * @param ids 待删除id + * @return 删除结果状态 + */ + @Override + public Boolean deleteCartByIds(List ids) { + return mapper.deleteBatchIds(ids) > 0; + } + + /** + * 购物车基本查询 + * @param storeCart 购物车参数 + * @return 购物车结果数据 + */ + private List getByEntity(StoreCart storeCart) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.setEntity(storeCart); + return mapper.selectList(lqw); + } + + /** + * 检测商品是否有效 更新购物车商品状态 + * @param productId 商品id + * @return 跟新结果 + */ + @Override + public Boolean productStatusNotEnable(Integer productId) { + StoreCart storeCartPram = new StoreCart(); + storeCartPram.setProductId(productId); + List existStoreCartProducts = getByEntity(storeCartPram); + if (null == existStoreCartProducts) return true; + existStoreCartProducts.forEach(e-> e.setStatus(false).setUpdateTime(DateUtil.date())); + return updateBatchById(existStoreCartProducts); + } + + /** + * 购物车重选 + * @param resetRequest 重选数据 + * @return 重选结果 + */ + @Override + public Boolean resetCart(CartResetRequest resetRequest) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCart::getId, resetRequest.getId()); + StoreCart storeCart = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeCart)) throw new YztException("购物车不存在"); + if (ObjectUtil.isNull(resetRequest.getNum()) || resetRequest.getNum() <= 0 || resetRequest.getNum() >= 999) + throw new YztException("数量不合法"); + storeCart.setCartNum(resetRequest.getNum()); + storeCart.setProductAttrUnique(resetRequest.getUnique() + ""); + storeCart.setUpdateTime(DateUtil.date()); + boolean updateResult = mapper.updateById(storeCart) > 0; + if (!updateResult) throw new YztException("重选添加购物车失败"); + productStatusEnableFlag(resetRequest.getId(), true); + return updateResult; + } + + /** + * 对应sku购物车生效 + * @param skuIdList skuIdList + * @return Boolean + */ + @Override + public Boolean productStatusNoEnable(List skuIdList) { + if(ObjectUtil.isEmpty(skuIdList)) return true; + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.set(StoreCart::getStatus, true); + lqw.in(StoreCart::getProductAttrUnique, skuIdList); + lqw.eq(StoreCart::getIsNew, false); + return update(lqw); + } + + /** + * 删除商品对应的购物车 + * @param productId 商品id + */ + @Override + public Boolean productDelete(Integer productId) { + StoreCart storeCartPram = new StoreCart(); + storeCartPram.setProductId(productId); + List existStoreCartProducts = getByEntity(storeCartPram); + if (CollUtil.isNotEmpty(existStoreCartProducts)) return true; + List cartIds = existStoreCartProducts.stream().map(StoreCart::getId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(cartIds)) { + deleteCartByIds(cartIds); + } + return true; + } + + /** + * 通过id和uid获取购物车信息 + * @param id 购物车id + * @param uid 用户uid + * @return StoreCart + */ + @Override + public StoreCart getByIdAndUid(Long id, Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreCart::getId, id); + lqw.eq(StoreCart::getUid, uid); + lqw.eq(StoreCart::getIsNew, false); + lqw.eq(StoreCart::getStatus, true); + return mapper.selectOne(lqw); + } + + /** + * 获取购物车商品数量(不区分规格) + * @param uid 用户uid + * @param proId 商品id + */ + @Override + public Integer getProductNumByUidAndProductId(Integer uid, Integer proId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreCart::getUid, uid); + lqw.eq(StoreCart::getProductId, proId); + lqw.eq(StoreCart::getStatus, true); + List cartList = mapper.selectList(lqw); + if (CollUtil.isNotEmpty(cartList)) { + return cartList.stream().mapToInt(StoreCart::getCartNum).sum(); + } + return 0; + } + + /** + * 修改购物车商品数量 + * @param id 购物车id + * @param number 数量 + */ + @Override + public Boolean updateCartNum(Integer id, Integer number) { + if (ObjectUtil.isNull(number)) throw new YztException("商品数量不合法"); + if (number <=0 || number > 99) throw new YztException("商品数量不能小于1大于99"); + StoreCart storeCart = getById(id); + if (ObjectUtil.isNull(storeCart)) throw new YztException("当前购物车不存在"); + if (storeCart.getCartNum().equals(number)) return true; + storeCart.setCartNum(number); + storeCart.setUpdateTime(DateUtil.date()); + return updateById(storeCart); + } + + ///////////////////////////////////////////////////////////////////自定义方法 + /** + * 购物车商品数量(条数) + * @param userId Integer 用户id + * @param status Boolean 商品类型:true-有效商品,false-无效商品 + * @return Integer + */ + private Integer getUserCountByStatus(Integer userId, Boolean status) { + //购物车商品种类数量 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCart::getUid, userId); + lambdaQueryWrapper.eq(StoreCart::getStatus, status); + lambdaQueryWrapper.eq(StoreCart::getIsNew, false); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 购物车购买商品总数量 + * @param userId Integer 用户id + * @param status 商品类型:true-有效商品,false-无效商品 + * @return Integer + */ + private Integer getUserSumByStatus(Integer userId, Boolean status) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("ifnull(sum(cart_num), 0) as cart_num"); + queryWrapper.eq("uid", userId); + queryWrapper.eq("is_new", false); + queryWrapper.eq("status", status); + StoreCart storeCart = mapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(storeCart)) { + return 0; + } + return storeCart.getCartNum(); + } + + /** + * 根据购物车id更新状态 + * @param carId 购物车id + * @param flag 待更新状态值 + * @return 更新结果 + */ + private Boolean productStatusEnableFlag(Long carId, Boolean flag) { + StoreCart storeCartPram = new StoreCart(); + storeCartPram.setId(carId); + List existStoreCartProducts = getByEntity(storeCartPram); + if(ObjectUtil.isNull(existStoreCartProducts)) return false; + existStoreCartProducts = existStoreCartProducts.stream().map(e->{ + e.setStatus(flag); + e.setUpdateTime(DateUtil.date()); + return e; + }).collect(Collectors.toList()); + return updateBatchById(existStoreCartProducts); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCombinationServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCombinationServiceImpl.java new file mode 100644 index 0000000..ce24401 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCombinationServiceImpl.java @@ -0,0 +1,1140 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.ProductConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.product.StoreProductDescription; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.mapper.StoreCombinationMapper; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StoreCombinationService 实现类 + * + */ +@Service +public class StoreCombinationServiceImpl extends ServiceImpl implements StoreCombinationService { + + @Resource + private StoreCombinationMapper mapper; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private StoreProductAttrService storeProductAttrService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private StoreProductAttrResultService storeProductAttrResultService; + + @Autowired + private StoreProductDescriptionService storeProductDescriptionService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductRelationService storeProductRelationService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private OrderService orderService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + private static final Logger logger = LoggerFactory.getLogger(StoreCombinationServiceImpl.class); + + /** + * 分页显示拼团商品表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreCombinationSearchRequest request, PageParamRequest pageParamRequest) { + Page combinationPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCombination::getIsDel, false); + if (StrUtil.isNotEmpty(request.getKeywords())) { + lambdaQueryWrapper.and(i -> i.like(StoreCombination::getProductId, request.getKeywords()) + .or().like(StoreCombination::getId, request.getKeywords()) + .or().like(StoreCombination::getTitle, request.getKeywords())); + } + if (ObjectUtil.isNotNull(request.getIsShow())) { + lambdaQueryWrapper.eq(StoreCombination::getIsShow, request.getIsShow() == 1); + } + lambdaQueryWrapper.orderByDesc(StoreCombination::getSort, StoreCombination::getId); + List storeCombinationList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeCombinationList)) { + return CommonPage.copyPageInfo(combinationPage, CollUtil.newArrayList()); + } + + List responseList = storeCombinationList.stream().map(combination -> { + //原价 拼团人数 参与人数 成团数量 限量剩余 + StoreCombinationResponse combinationResponse = new StoreCombinationResponse(); + BeanUtils.copyProperties(combination, combinationResponse); + combinationResponse.setRemainingQuota(combination.getQuota()); + List pinkList = storePinkService.getListByCid(combination.getId()); + combinationResponse.setCountPeople(0); + combinationResponse.setCountPeopleAll(0); + combinationResponse.setCountPeoplePink(0); + if (CollUtil.isNotEmpty(pinkList)) { + List teamList = pinkList.stream().filter(i -> i.getKId() == 0).collect(Collectors.toList()); + List successTeam = teamList.stream().filter(i -> i.getStatus() == 2).collect(Collectors.toList()); + combinationResponse.setCountPeople(teamList.size()); + combinationResponse.setCountPeopleAll(pinkList.size()); + combinationResponse.setCountPeoplePink(successTeam.size()); + } + combinationResponse.setStopTimeStr(YztDateUtil.timestamp2DateStr(combination.getStopTime(), Constants.DATE_FORMAT_DATE)); + return combinationResponse; + }).collect(Collectors.toList()); + + return CommonPage.copyPageInfo(combinationPage, responseList); + } + + /** + * 新增拼团商品 + * + * @param request 新增请求参数 + * @return Boolean + */ + @Override + public Boolean saveCombination(StoreCombinationRequest request) { + if (!request.getSpecType()) { + if (request.getAttrValue().size() > 1) { + throw new YztException("单规格商品属性值不能大于1"); + } + } + // 过滤掉checked=false的数据 +// clearNotCheckedAndValidationPrice(request); + + StoreCombination storeCombination = new StoreCombination(); + BeanUtils.copyProperties(request, storeCombination); + // 校验结束时间 + Long stopTime = YztDateUtil.dateStr2Timestamp(request.getStopTime(), Constants.DATE_TIME_TYPE_END); + if (stopTime <= System.currentTimeMillis()) { + throw new YztException("活动结束时间不能小于当前时间"); + } + + storeCombination.setId(null); + // 头图、轮播图 + storeCombination.setImage(systemAttachmentService.clearPrefix(request.getImage())); + storeCombination.setImages(systemAttachmentService.clearPrefix(request.getImages())); + // 活动开始结束时间 + storeCombination.setStartTime(YztDateUtil.dateStr2Timestamp(request.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN)); + storeCombination.setStopTime(stopTime); + storeCombination.setAddTime(System.currentTimeMillis()); + storeCombination.setSales(0); + + List attrValueAddRequestList = request.getAttrValue(); + // 计算价格 + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + storeCombination.setPrice(minAttrValue.getPrice()); + storeCombination.setOtPrice(minAttrValue.getOtPrice()); + storeCombination.setCost(minAttrValue.getCost()); + storeCombination.setStock(attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getStock).sum()); + int quotaTotal = attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getQuota).sum(); + storeCombination.setQuota(quotaTotal); + storeCombination.setQuotaShow(quotaTotal); + + List addRequestList = request.getAttr(); + List attrList = addRequestList.stream().map(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + attr.setId(null); + attr.setType(Constants.PRODUCT_TYPE_PINGTUAN); + return attr; + }).collect(Collectors.toList()); + + List attrValueList = attrValueAddRequestList.stream().map(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setId(null); + attrValue.setSuk(e.getSuk()); + attrValue.setQuota(e.getQuota()); + attrValue.setQuotaShow(e.getQuota()); + attrValue.setType(Constants.PRODUCT_TYPE_PINGTUAN); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + return attrValue; + }).collect(Collectors.toList()); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_PINGTUAN); + + Boolean execute = transactionTemplate.execute(e -> { + save(storeCombination); + + attrList.forEach(attr -> attr.setProductId(storeCombination.getId())); + attrValueList.forEach(value -> value.setProductId(storeCombination.getId())); + storeProductAttrService.saveBatch(attrList); + storeProductAttrValueService.saveBatch(attrValueList); + + spd.setProductId(storeCombination.getId()); + storeProductDescriptionService.deleteByProductId(storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + storeProductDescriptionService.save(spd); + + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 删除拼团商品 + */ + @Override + public Boolean deleteById(Integer id) { + StoreCombination combination = getById(id); + long timeMillis = System.currentTimeMillis(); + if (combination.getIsShow().equals(true) && combination.getStartTime() <= timeMillis && timeMillis <= combination.getStopTime()) { + throw new YztException("活动开启中,商品不支持删除"); + } + + StoreCombination storeCombination = new StoreCombination(); + storeCombination.setId(id).setIsDel(true); + return updateById(storeCombination); + } + + /** + * 编辑拼团商品 + * + * @param request 编辑请求参数 + * @return Boolean + */ + @Override + public Boolean updateCombination(StoreCombinationRequest request) { + if (ObjectUtil.isNull(request.getId())) { + throw new YztException("拼团商品id不能为空"); + } + StoreCombination existCombination = getById(request.getId()); + if (ObjectUtil.isNull(existCombination) || existCombination.getIsDel()) { + throw new YztException("拼团商品不存在"); + } + long timeMillis = System.currentTimeMillis(); + if (existCombination.getIsShow().equals(true) && existCombination.getStartTime() <= timeMillis && timeMillis <= existCombination.getStopTime()) { + throw new YztException("活动开启中,商品不支持修改"); + } + + StoreCombination storeCombination = new StoreCombination(); + BeanUtils.copyProperties(request, storeCombination); + // 头图、轮播图 + storeCombination.setImage(systemAttachmentService.clearPrefix(request.getImage())); + storeCombination.setImages(systemAttachmentService.clearPrefix(request.getImages())); + // 活动开始结束时间 + storeCombination.setStartTime(YztDateUtil.dateStr2Timestamp(request.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN)); + storeCombination.setStopTime(YztDateUtil.dateStr2Timestamp(request.getStopTime(), Constants.DATE_TIME_TYPE_END)); + + List attrValueAddRequestList = request.getAttrValue(); + // 计算价格 + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + storeCombination.setPrice(minAttrValue.getPrice()); + storeCombination.setOtPrice(minAttrValue.getOtPrice()); + storeCombination.setCost(minAttrValue.getCost()); + storeCombination.setStock(attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getStock).sum()); + int quotaTotal = attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getQuota).sum(); + storeCombination.setQuota(quotaTotal); + storeCombination.setQuotaShow(quotaTotal); + + // attr部分 + List addRequestList = request.getAttr(); + List attrAddList = CollUtil.newArrayList(); + List attrUpdateList = CollUtil.newArrayList(); + addRequestList.forEach(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + if (ObjectUtil.isNull(attr.getId())) { + attr.setProductId(storeCombination.getId()); + attr.setType(Constants.PRODUCT_TYPE_PINGTUAN); + attrAddList.add(attr); + } else { + attr.setProductId(storeCombination.getId()); + attr.setIsDel(false); + attrUpdateList.add(attr); + } + }); + + // attrValue部分 + List attrValueAddList = CollUtil.newArrayList(); + List attrValueUpdateList = CollUtil.newArrayList(); + attrValueAddRequestList.forEach(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setSuk(e.getSuk()); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + attrValue.setQuota(e.getQuota()); + attrValue.setQuotaShow(e.getQuota()); + if (ObjectUtil.isNull(attrValue.getId())) { + attrValue.setProductId(storeCombination.getId()); + attrValue.setType(Constants.PRODUCT_TYPE_PINGTUAN); + attrValueAddList.add(attrValue); + } else { + attrValue.setProductId(storeCombination.getId()); + attrValue.setIsDel(false); + attrValueUpdateList.add(attrValue); + } + }); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_PINGTUAN); + spd.setProductId(request.getId()); + + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(storeCombination); + + // 先删除原用attr+value + storeProductAttrService.deleteByProductIdAndType(storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + storeProductAttrValueService.deleteByProductIdAndType(storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + + if (CollUtil.isNotEmpty(attrAddList)) { + storeProductAttrService.saveBatch(attrAddList); + } + if (CollUtil.isNotEmpty(attrUpdateList)) { + storeProductAttrService.saveOrUpdateBatch(attrUpdateList); + } + + if (CollUtil.isNotEmpty(attrValueAddList)) { + storeProductAttrValueService.saveBatch(attrValueAddList); + } + if (CollUtil.isNotEmpty(attrValueUpdateList)) { + storeProductAttrValueService.saveOrUpdateBatch(attrValueUpdateList); + } + + storeProductDescriptionService.deleteByProductId(storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + storeProductDescriptionService.save(spd); + + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 拼团商品详情 + * + * @param id 拼团商品ID + * @return StoreProductInfoResponse + */ + @Override + public StoreProductInfoResponse getAdminDetail(Integer id) { + StoreCombination storeCombination = mapper.selectById(id); + if (ObjectUtil.isNull(storeCombination) || storeCombination.getIsDel()) { + throw new YztException("未找到对应商品信息"); + } + StoreProductInfoResponse storeProductResponse = new StoreProductInfoResponse(); + BeanUtils.copyProperties(storeCombination, storeProductResponse); +// storeProductResponse.setStartTimeStr(DateUtil.timestamp2DateStr(storeCombination.getStartTime(), Constants.DATE_FORMAT_DATE)); +// storeProductResponse.setStopTimeStr(DateUtil.timestamp2DateStr(storeCombination.getStopTime(), Constants.DATE_FORMAT_DATE)); + + // 查询attr + List attrs = storeProductAttrService.getListByProductIdAndType(id, Constants.PRODUCT_TYPE_PINGTUAN); + storeProductResponse.setAttr(attrs); + storeProductResponse.setSliderImage(String.join(",", storeCombination.getImages())); + + boolean specType = true; + if (attrs.size() == 1) { + if (attrs.get(0).getAttrValues().equals("默认")) { + specType = false; + } + } + storeProductResponse.setSpecType(specType); + + List comAttrValueList = storeProductAttrValueService.getListByProductIdAndType(id, ProductConstants.PRODUCT_TYPE_PINGTUAN); + // 查询主商品sku + List attrValueList = storeProductAttrValueService.getListByProductIdAndType(storeCombination.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + + List valueResponseList = attrValueList.stream().map(e -> { + AttrValueResponse valueResponse = new AttrValueResponse(); + Integer tempId = 0; + for (StoreProductAttrValue value : comAttrValueList) { + if (value.getSuk().equals(e.getSuk())) { + tempId = value.getId(); + BeanUtils.copyProperties(value, valueResponse); + break; + } + } + if (tempId.equals(0)) { + BeanUtils.copyProperties(e, valueResponse); + valueResponse.setId(null); + } else { + valueResponse.setId(tempId); + } + return valueResponse; + }).collect(Collectors.toList()); + storeProductResponse.setAttrValue(valueResponseList); + + StoreProductDescription sd = storeProductDescriptionService.getByProductIdAndType(id, Constants.PRODUCT_TYPE_PINGTUAN); + if (ObjectUtil.isNotNull(sd)) { + storeProductResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + return storeProductResponse; + } + + /** + * 修改拼团商品状态 + */ + @Override + public Boolean updateCombinationShow(Integer id, Boolean isShow) { + StoreCombination temp = getById(id); + if (ObjectUtil.isNull(temp) || temp.getIsDel()) { + throw new YztException("拼团商品不存在"); + } + if (isShow) { + // 判断商品是否存在 + StoreProduct product = storeProductService.getById(temp.getProductId()); + if (ObjectUtil.isNull(product)) { + throw new YztException("关联的商品已删除,无法开启活动"); + } + } + + StoreCombination storeCombination = new StoreCombination(); + storeCombination.setId(id).setIsShow(isShow); + return updateById(storeCombination); + } + + /** + * admin拼团统计 + */ + @Override + public Map getAdminStatistics() { + StorePink spavPink = new StorePink(); + spavPink.setKId(0); + List pinkList = storePinkService.getByEntity(spavPink); + Map map = CollUtil.newHashMap(); + map.put("countPeople", 0); + map.put("countTeam", 0); + if (CollUtil.isNotEmpty(pinkList)) { + map.put("countPeople", storePinkService.count()); + long countTeam = pinkList.stream().filter(i -> i.getStatus() == 2).count(); + map.put("countTeam", countTeam); + } + return map; + } + + /** + * H5拼团商品列表 + */ + @Override + public List getH5List(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreCombination::getId, StoreCombination::getProductId, StoreCombination::getImage, StoreCombination::getTitle + , StoreCombination::getPeople, StoreCombination::getOtPrice, StoreCombination::getPrice, StoreCombination::getStock); + lqw.eq(StoreCombination::getIsDel, false); + lqw.eq(StoreCombination::getIsShow, true); + long millis = System.currentTimeMillis(); + lqw.le(StoreCombination::getStartTime, millis); + lqw.ge(StoreCombination::getStopTime, millis); + lqw.orderByDesc(StoreCombination::getSort, StoreCombination::getId); + List combinationList = mapper.selectList(lqw); + if (CollUtil.isEmpty(combinationList)) { + return CollUtil.newArrayList(); + } + List responseList = combinationList.stream().map(e -> { + StoreCombinationH5Response response = new StoreCombinationH5Response(); + BeanUtils.copyProperties(e, response); + return response; + }).collect(Collectors.toList()); + return responseList; + } + + /** + * H5拼团商品详情 + * + * @param comId 拼团商品编号 + * @return CombinationDetailResponse + */ + @Override + public CombinationDetailResponse getH5Detail(Integer comId) { + CombinationDetailResponse detailResponse = new CombinationDetailResponse(); + StoreCombination storeCombination = getById(comId); + if (ObjectUtil.isNull(storeCombination) || storeCombination.getIsDel()) { + throw new YztException("对应拼团商品不存在"); + } + if (!storeCombination.getIsShow()) { + throw new YztException("拼团商品已下架"); + } + CombinationDetailH5Response infoResponse = new CombinationDetailH5Response(); + BeanUtils.copyProperties(storeCombination, infoResponse); + infoResponse.setStoreName(storeCombination.getTitle()); + infoResponse.setSliderImage(storeCombination.getImages()); +// infoResponse.setStoreInfo(storeCombination.getInfo()); + // 详情 + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, comId) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_PINGTUAN)); + if (ObjectUtil.isNotNull(sd)) { + infoResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + + // 获取主商品信息 + StoreProduct storeProduct = storeProductService.getById(storeCombination.getProductId()); + // 主商品状态 + if (storeProduct.getIsDel()) { + detailResponse.setMasterStatus("delete"); + } else if (!storeProduct.getIsShow()) { + detailResponse.setMasterStatus("soldOut"); + } else if (storeProduct.getStock() <= 0) { + detailResponse.setMasterStatus("sellOut"); + } else { + detailResponse.setMasterStatus("normal"); + } + + // 拼团销量 = 原商品销量(包含虚拟销量) + infoResponse.setSales(storeProduct.getSales()); + infoResponse.setFicti(storeProduct.getFicti()); + detailResponse.setStoreCombination(infoResponse); + + // 获取拼团商品规格 + List attrList = storeProductAttrService.getListByProductIdAndType(comId, Constants.PRODUCT_TYPE_PINGTUAN); + // 根据制式设置attr属性 +// List skuAttr = getSkuAttr(attrList); + detailResponse.setProductAttr(attrList); + + // 根据制式设置sku属性 + HashMap skuMap = CollUtil.newHashMap(); + // 获取主商品sku + List storeProductAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeCombination.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + // 获取拼团商品sku + List combinationAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + + for (StoreProductAttrValue productAttrValue : storeProductAttrValues) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + List valueList = combinationAttrValues.stream().filter(e -> productAttrValue.getSuk().equals(e.getSuk())).collect(Collectors.toList()); + if (CollUtil.isEmpty(valueList)) { + BeanUtils.copyProperties(productAttrValue, atr); + } else { + BeanUtils.copyProperties(valueList.get(0), atr); + } + if (ObjectUtil.isNull(atr.getQuota())) { + atr.setQuota(0); + } + skuMap.put(atr.getSuk(), atr); + } + detailResponse.setProductValue(skuMap); + + // 设置点赞和收藏 + User user = userService.getInfo(); + if (ObjectUtil.isNotNull(user) && ObjectUtil.isNotNull(user.getUid())) { + detailResponse.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(), storeCombination.getProductId(), false).size() > 0); + } else { + detailResponse.setUserCollect(false); + } + + detailResponse.setPinkOkSum(0); + // 拼团团长列表 + List headList = storePinkService.getListByCidAndKid(storeCombination.getId(), 0); + if (CollUtil.isNotEmpty(headList)) { + List headPinkList = headList.stream().map(i -> { + StorePinkResponse pinkResponse = new StorePinkResponse(); + BeanUtils.copyProperties(i, pinkResponse); + User teamUser = userService.getById(i.getUid()); + pinkResponse.setAvatar(Optional.ofNullable(teamUser.getAvatar()).orElse("")); + pinkResponse.setNickname(teamUser.getNickname()); + return pinkResponse; + }).collect(Collectors.toList()); + + // 拼团成功部分 + List okList = headPinkList.stream().filter(i -> i.getStatus().equals(2)).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(okList)) { + // 拼团完成的商品总件数 + List pinkOkList = CollUtil.newArrayList(); + okList.forEach(e -> { + List list = storePinkService.getListByCidAndKid(e.getCid(), e.getId()); + if (CollUtil.isNotEmpty(list)) { + pinkOkList.addAll(list); + } + }); + List responseList = pinkOkList.stream().map(i -> { + StorePinkResponse pinkResponse = new StorePinkResponse(); + BeanUtils.copyProperties(i, pinkResponse); + User teamUser = userService.getById(i.getUid()); + pinkResponse.setAvatar(Optional.ofNullable(teamUser.getAvatar()).orElse("")); + pinkResponse.setNickname(teamUser.getNickname()); + return pinkResponse; + }).collect(Collectors.toList()); + okList.addAll(responseList); + int pinkOkSum = okList.stream().mapToInt(StorePinkResponse::getTotalNum).sum(); + detailResponse.setPinkOkSum(pinkOkSum); + //拼团完成的用户 + detailResponse.setPinkOkList(okList); + } + + // 可拼团团长部分 + List pinkingList = headPinkList.stream().filter(i -> { + boolean filter = false; + if (i.getStatus().equals(1) && i.getStopTime() > System.currentTimeMillis()) { + filter = true; + } + return filter; + }).collect(Collectors.toList()); + // 获取还剩几人成团 + pinkingList.forEach(i -> { + Integer countPeople = storePinkService.getCountByKid(i.getId()); + i.setCountPeople(countPeople); + i.setCount(i.getPeople() - countPeople); + }); + + // 所有团长列表 + detailResponse.setPinkList(pinkingList); + } + + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(cn.hutool.core.date.DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(3); + userVisitRecordService.save(visitRecord); + return detailResponse; + } + + /** + * 去拼团 + * + * @param pinkId 拼团团长单ID + * @return GoPinkResponse + */ + @Override + public GoPinkResponse goPink(Integer pinkId) { + int isOk = 0;//判断拼团是否完成 + int userBool = 0;//判断当前用户是否在团内 0未在 1在 + int pinkBool = 0;//判断拼团是否成功 0未成功 1成功 + + StorePink teamPink = storePinkService.getById(pinkId); + if (ObjectUtil.isNull(teamPink) || teamPink.getIsRefund()) throw new YztException("对应的拼团不存在"); + StoreCombination storeCombination = getById(teamPink.getCid()); + if (ObjectUtil.isNull(storeCombination) || storeCombination.getIsDel()) throw new YztException("对应拼团商品不存在"); + + // 判断拼团活动时效 + if (!storeCombination.getIsShow()) { + throw new YztException("拼团活动已结束"); + } + if (System.currentTimeMillis() > storeCombination.getStopTime()) { + throw new YztException("拼团活动已结束"); + } + + User user = userService.getInfo(); + + GoPinkResponse goPinkResponse = new GoPinkResponse(); + List pinkList; + if (teamPink.getKId().equals(0)) { + pinkList = storePinkService.getListByCidAndKid(teamPink.getCid(), teamPink.getId()); + pinkList.add(teamPink); + } else { + pinkList = storePinkService.getListByCidAndKid(teamPink.getCid(), teamPink.getKId()); + pinkList.add(storePinkService.getById(teamPink.getKId())); + } + //拼团剩余人数 + int count = teamPink.getPeople() - (CollUtil.isEmpty(pinkList) ? 0 : pinkList.size()); + + if (teamPink.getStatus() == 2) {//已完成 + isOk = 1; + pinkBool = 1; + } + if (teamPink.getStatus() == 1) {//进行中 + if (count < 1) {// 拼团已完成 + isOk = 1; + pinkBool = 1; + // 拼团完成处理 + storePinkService.pinkSuccess(teamPink.getId()); + } + } + + List uidList = pinkList.stream().map(StorePink::getUid).collect(Collectors.toList()); + uidList.add(teamPink.getUid()); + if (uidList.contains(user.getUid())) { + userBool = 1; + } + + // 处理用户头像昵称 + List pinkResponseList = CollUtil.newArrayList(); + // 团长 + StorePinkResponse storePinkTResponse = new StorePinkResponse(); + for (StorePink pink : pinkList) { + if (pink.getKId().equals(0)) { + BeanUtils.copyProperties(pink, storePinkTResponse); + if (pink.getUid().equals(user.getUid())) { + storePinkTResponse.setNickname(user.getNickname()); + storePinkTResponse.setAvatar(user.getAvatar()); + } else { + User teamUser = userService.getById(pink.getUid()); + storePinkTResponse.setNickname(teamUser.getNickname()); + storePinkTResponse.setAvatar(teamUser.getAvatar()); + } + continue; + } + StorePinkResponse storePinkResponse = new StorePinkResponse(); + BeanUtils.copyProperties(pink, storePinkResponse); + User userOne = userService.getById(pink.getUid()); + storePinkResponse.setNickname(userOne.getNickname()); + storePinkResponse.setAvatar(userOne.getAvatar()); + pinkResponseList.add(storePinkResponse); + } + + goPinkResponse.setCount(count); + goPinkResponse.setIsOk(isOk); + goPinkResponse.setPinkBool(pinkBool); + goPinkResponse.setUserBool(userBool); + if (userBool == 1) { + pinkList.forEach(e -> { + if (e.getUid().equals(user.getUid())) { + goPinkResponse.setCurrentPinkOrder(e.getOrderId()); + } + }); + } + goPinkResponse.setPinkAll(pinkResponseList); + goPinkResponse.setPinkT(storePinkTResponse); + goPinkResponse.setUserInfo(user); + + // storeCombination部分 + StoreCombinationResponse detailResponse = new StoreCombinationResponse(); + BeanUtils.copyProperties(storeCombination, detailResponse); + detailResponse.setSpecType(false); + // sku部分 + StoreProductAttr spavAttr = new StoreProductAttr(); + spavAttr.setProductId(storeCombination.getId()); + spavAttr.setType(Constants.PRODUCT_TYPE_PINGTUAN); + List attrList = storeProductAttrService.getByEntity(spavAttr); + List> skuAttrList = getSkuAttrList(attrList); + detailResponse.setProductAttr(skuAttrList); + if (CollUtil.isNotEmpty(attrList) && attrList.size() > 1) { + detailResponse.setSpecType(true); + } + // 单属性时讲attrValueId 赋值给外层方便前端使用 + if (!detailResponse.getSpecType()) { + detailResponse.setAloneAttrValueId(attrList.get(0).getId()); + } + + + StoreProductAttrValue spavValue = new StoreProductAttrValue(); + spavValue.setProductId(storeCombination.getId()); + spavValue.setType(Constants.PRODUCT_TYPE_PINGTUAN); + List valueList = storeProductAttrValueService.getByEntity(spavValue); + // H5 端用于生成skuList + List sPAVResponses = new ArrayList<>(); + for (StoreProductAttrValue storeProductAttrValue : valueList) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + BeanUtils.copyProperties(storeProductAttrValue, atr); + sPAVResponses.add(atr); + } + HashMap skuMap = new HashMap<>(); + for (StoreProductAttrValueResponse attrValue : sPAVResponses) { + skuMap.put(attrValue.getSuk(), attrValue); + } + + detailResponse.setProductValue(skuMap); + goPinkResponse.setStoreCombination(detailResponse); + return goPinkResponse; + } + + /** + * 更多拼团信息 + */ + @Override + public PageInfo getMore(PageParamRequest pageParamRequest, Integer comId) { + Page combinationPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotNull(comId)) { + lqw.ne(StoreCombination::getId, comId); + } + lqw.eq(StoreCombination::getIsDel, false); + lqw.eq(StoreCombination::getIsShow, true); + long millis = System.currentTimeMillis(); + lqw.le(StoreCombination::getStartTime, millis); + lqw.ge(StoreCombination::getStopTime, millis); + lqw.orderByDesc(StoreCombination::getSort, StoreCombination::getId); + List storeCombinations = mapper.selectList(lqw); + return CommonPage.copyPageInfo(combinationPage, storeCombinations); + } + + /** + * 取消拼团 + * + * @return 此处只是转为申请退款订单 + * 自己是团长,取消后,顺位第一人变为团长 + * 自己不是团长,直接取消 + */ + @Override + public Boolean removePink(StorePinkRequest storePinkRequest) { + StorePink userPink = storePinkService.getById(storePinkRequest.getId()); + if (ObjectUtil.isNull(userPink)) throw new YztException("未查到拼团信息,无法取消"); + if (userPink.getIsRefund()) throw new YztException("拼团订单已退款"); + // 获取是否拼团成功 + if (userPink.getStatus() == 2) { + throw new YztException("拼团已完成,无法取消"); + } + Integer kid = userPink.getKId() > 0 ? userPink.getKId() : userPink.getId(); + Integer count = storePinkService.getCountByKid(kid); + if (count.equals(userPink.getPeople())) { + // 拼团完成操作 + storePinkService.pinkSuccess(kid); + throw new YztException("拼团已完成,无法取消"); + } + if (userPink.getStatus() == 3) { + throw new YztException("拼团已申请取消"); + } + + StoreOrder order = storeOrderService.getByOderId(userPink.getOrderId()); + if (ObjectUtil.isNull(order) || order.getIsDel()) throw new YztException("拼团订单不存在"); + if (order.getStatus() == -1 && order.getRefundStatus() != 0) { + throw new YztException("拼团订单已进入退款流程"); + } + + // 订单申请退款 + OrderRefundApplyRequest refundRequest = new OrderRefundApplyRequest(); + refundRequest.setId(order.getId()); + refundRequest.setUni(order.getOrderId()); + refundRequest.setText("拼团订单取消,申请退款"); + refundRequest.setExplain("用户取消拼团订单,申请退款"); + boolean apply = orderService.refundApply(refundRequest); + if (!apply) throw new YztException("订单申请退款失败"); + + // 拼团改为未完成 + userPink.setStatus(3).setStopTime(System.currentTimeMillis()); + storePinkService.updateById(userPink); + if (userPink.getKId() == 0) {// 是团长 + List pinkList = storePinkService.getListByCidAndKid(userPink.getCid(), userPink.getId()); + if (CollUtil.isNotEmpty(pinkList)) { + // 团员更换团长 + StorePink newHeadPink = pinkList.get(pinkList.size() - 1); + newHeadPink.setKId(0); + pinkList.remove(pinkList.size() - 1); + pinkList.forEach(i -> i.setKId(newHeadPink.getId())); + pinkList.add(newHeadPink); + storePinkService.updateBatchById(pinkList); + } + } + + return true; + } + + @Override + public void consumeProductStock() { + String redisKey = Constants.PRODUCT_COMBINATION_STOCK_UPDATE; + Long size = redisUtil.getListSize(redisKey); + logger.info("StoreProductServiceImpl.doProductStock | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try { + StoreProductStockRequest storeProductStockRequest = + com.alibaba.fastjson.JSONObject.toJavaObject(com.alibaba.fastjson.JSONObject.parseObject(data.toString()), StoreProductStockRequest.class); + boolean result = doProductStock(storeProductStockRequest); + if (!result) { + redisUtil.lPush(redisKey, data); + } + } catch (Exception e) { + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 获取当前时间的拼团商品 + * + * @param productId 商品编号 + */ + @Override + public List getCurrentBargainByProductId(Integer productId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCombination::getProductId, productId); + lqw.eq(StoreCombination::getIsShow, true); + long millis = System.currentTimeMillis(); + lqw.le(StoreCombination::getStartTime, millis); + lqw.ge(StoreCombination::getStopTime, millis); + lqw.orderByDesc(StoreCombination::getSort, StoreCombination::getId); + return mapper.selectList(lqw); + } + + /** + * 商品是否存在拼团活动 + * + * @param productId 商品编号 + */ + @Override + public Boolean isExistActivity(Integer productId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCombination::getProductId, productId); + List combinationList = mapper.selectList(lqw); + if (CollUtil.isEmpty(combinationList)) { + return false; + } + // 判断关联的商品是否处于活动开启状态 + List list = combinationList.stream().filter(i -> i.getIsShow().equals(true)).collect(Collectors.toList()); + return CollUtil.isNotEmpty(list); + } + + /** + * 查询带异常 + * + * @param combinationId 拼团商品id + * @return StoreCombination + */ + @Override + public StoreCombination getByIdException(Integer combinationId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCombination::getId, combinationId); + lqw.eq(StoreCombination::getIsDel, false); + lqw.eq(StoreCombination::getIsShow, true); + StoreCombination storeCombination = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeCombination)) throw new YztException("拼团商品不存在或未开启"); + return storeCombination; + } + + /** + * 添加/扣减库存 + * + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + @Override + public Boolean operationStock(Integer id, Integer num, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota + {}", num)); + } + if (type.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota - {}", num)); + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format(" and (quota - {} >= 0)", num)); + } + updateWrapper.eq("id", id); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新拼团商品库存失败,商品id = " + id); + } + return update; + } + + /** + * 拼团首页数据 + * 拼团数据 + 拼团商品6个 + * 3个用户头像(最多) + * 拼团参与总人数 + * + * @return CombinationIndexResponse + */ + @Override + public CombinationIndexResponse getIndexInfo() { + // 获取最近的3单拼团订单 + List tempPinkList = storePinkService.findSizePink(3); + List avatarList = CollUtil.newArrayList(); + if (CollUtil.isNotEmpty(tempPinkList)) { + // 获取这三个用户头像 + avatarList = tempPinkList.stream().map(StorePink::getAvatar).collect(Collectors.toList()); + } + // 获取拼团参与总人数 + Integer totalPeople = storePinkService.getTotalPeople(); + + // 获取6个拼团商品 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCombination::getIsDel, false); + lqw.eq(StoreCombination::getIsShow, true); + lqw.ge(StoreCombination::getStock, 0); + long millis = System.currentTimeMillis(); + lqw.le(StoreCombination::getStartTime, millis); + lqw.ge(StoreCombination::getStopTime, millis); + lqw.orderByDesc(StoreCombination::getSort, StoreCombination::getId); + lqw.last(" limit 6"); + List combinationList = mapper.selectList(lqw); + if (CollUtil.isEmpty(combinationList)) { + return null; + } + combinationList.forEach(e -> { + int percentIntVal = YztUtil.percentInstanceIntVal(e.getQuota(), e.getQuotaShow()); + e.setQuotaPercent(percentIntVal); + }); + + CombinationIndexResponse response = new CombinationIndexResponse(); + response.setAvatarList(avatarList); + response.setTotalPeople(totalPeople); + response.setProductList(combinationList); + return response; + } + + /** + * 拼团列表header + * + * @return CombinationHeaderResponse + */ + @Override + public CombinationHeaderResponse getHeader() { + // 获取最近的3单拼团订单 + List tempPinkList = storePinkService.findSizePink(7); + List avatarList = CollUtil.newArrayList(); + if (CollUtil.isNotEmpty(tempPinkList)) { + // 获取这三个用户头像 + avatarList = tempPinkList.stream().map(StorePink::getAvatar).collect(Collectors.toList()); + } + // 获取拼团参与总人数 + Integer totalPeople = storePinkService.getTotalPeople(); + + // 获取拼团列表banner + List> bannerList = systemGroupDataService.getListMapByGid(Constants.GROUP_DATA_ID_COMBINATION_LIST_BANNNER); + + CombinationHeaderResponse response = new CombinationHeaderResponse(); + response.setAvatarList(avatarList); + response.setTotalPeople(totalPeople); + response.setBannerList(bannerList); + return response; + } + + /** + * 拼团操作库存 + */ + private boolean doProductStock(StoreProductStockRequest storeProductStockRequest) { + // 砍价商品信息回滚 + StoreCombination existCombination = getById(storeProductStockRequest.getCombinationId()); + List existAttr = + storeProductAttrValueService.getListByProductIdAndAttrId( + storeProductStockRequest.getCombinationId(), + storeProductStockRequest.getAttrId().toString(), + storeProductStockRequest.getType()); + if (ObjectUtil.isNull(existCombination) || ObjectUtil.isNull(existAttr)) { // 未找到商品 + logger.info("库存修改任务未获取到商品信息" + JSON.toJSONString(storeProductStockRequest)); + return true; + } + + // 回滚商品库存/销量 并更新 + boolean isPlus = storeProductStockRequest.getOperationType().equals("add"); + int productStock = isPlus ? existCombination.getStock() + storeProductStockRequest.getNum() : existCombination.getStock() - storeProductStockRequest.getNum(); + existCombination.setStock(productStock); + existCombination.setSales(existCombination.getSales() - storeProductStockRequest.getNum()); + existCombination.setQuota(existCombination.getQuota() + storeProductStockRequest.getNum()); + updateById(existCombination); + + // 回滚sku库存 + for (StoreProductAttrValue attrValue : existAttr) { + int productAttrStock = isPlus ? attrValue.getStock() + storeProductStockRequest.getNum() : attrValue.getStock() - storeProductStockRequest.getNum(); + attrValue.setStock(productAttrStock); + attrValue.setSales(attrValue.getSales() - storeProductStockRequest.getNum()); + attrValue.setQuota(attrValue.getQuota() + storeProductStockRequest.getNum()); + storeProductAttrValueService.updateById(attrValue); + } + + // 商品本身库存回滚 + // StoreProductStockRequest 创建次对象调用商品扣减库存实现扣减上本本身库存 + StoreProductResponse existProductLinkedSeckill = storeProductService.getByProductId(storeProductStockRequest.getProductId()); + for (StoreProductAttrValueResponse attrValueResponse : existProductLinkedSeckill.getAttrValue()) { + if (attrValueResponse.getSuk().equals(storeProductStockRequest.getSuk())) { + StoreProductStockRequest r = new StoreProductStockRequest() + .setAttrId(attrValueResponse.getId()) + .setNum(storeProductStockRequest.getNum()) + .setOperationType("add") + .setProductId(storeProductStockRequest.getProductId()) + .setType(Constants.PRODUCT_TYPE_NORMAL) + .setSuk(storeProductStockRequest.getSuk()); + storeProductService.doProductStock(r); + } + } + + return true; + } + + /** + * 获取制式结构给attr属性 + */ + private List> getSkuAttrList(List attrList) { + List> attrMapList = new ArrayList<>(); + if (CollUtil.isEmpty(attrList)) { + return attrMapList; + } + for (StoreProductAttr attr : attrList) { + HashMap attrMap = new HashMap<>(); + attrMap.put("productId", attr.getProductId()); + attrMap.put("attrName", attr.getAttrName()); + List attrValues = new ArrayList<>(); + String trimAttr = attr.getAttrValues() + .replace("[", "") + .replace("]", ""); + if (attr.getAttrValues().contains(",")) { + attrValues = Arrays.asList(trimAttr.split(",")); + } else { + attrValues.add(trimAttr); + } + attrMap.put("attrValues", attrValues); + + List> attrValueMapList = new ArrayList<>(); + for (String attrValue : attrValues) { + HashMap attrValueMap = new HashMap<>(); + attrValueMap.put("attr", attrValue); + attrValueMapList.add(attrValueMap); + } + attrMap.put("attrValue", attrValueMapList); + attrMapList.add(attrMap); + } + return attrMapList; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponServiceImpl.java new file mode 100644 index 0000000..72769f5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponServiceImpl.java @@ -0,0 +1,461 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.CouponConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.category.Category; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SearchAndPageRequest; +import com.yzt.common.request.StoreCouponRequest; +import com.yzt.common.request.StoreCouponSearchRequest; +import com.yzt.common.response.StoreCouponFrontResponse; +import com.yzt.common.response.StoreCouponInfoResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.StoreCouponMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreCouponServiceImpl 接口实现 + * + */ +@Service +public class StoreCouponServiceImpl extends ServiceImpl implements StoreCouponService { + + @Resource + private StoreCouponMapper mapper; + + @Lazy + @Autowired + private StoreProductService storeProductService; + + @Lazy + @Autowired + private StoreCouponUserService storeCouponUserService; + + @Autowired + private CategoryService categoryService; + + @Lazy + @Autowired + private UserService userService; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(StoreCouponSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreCoupon 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCoupon::getIsDel, false); + + if (null != request.getType()) { + lambdaQueryWrapper.eq(StoreCoupon::getType, request.getType()); + } + + if (null != request.getStatus()) { + lambdaQueryWrapper.eq(StoreCoupon::getStatus, request.getStatus()); + } + + if (StrUtil.isNotBlank(request.getName())) { + lambdaQueryWrapper.like(StoreCoupon::getName, request.getName()); + } + + lambdaQueryWrapper.orderByDesc(StoreCoupon::getSort).orderByDesc(StoreCoupon::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 保存优惠券表 + * @param request StoreCouponRequest 新增参数 + * + * @since 2020-05-18 + */ + @Override + public boolean create(StoreCouponRequest request) { + StoreCoupon storeCoupon = new StoreCoupon(); + BeanUtils.copyProperties(request, storeCoupon); + if (storeCoupon.getIsLimited() && (storeCoupon.getTotal() == null || storeCoupon.getTotal() == 0)) { + throw new YztException("请输入数量!"); + } + + if (request.getUseType() > 1 && (StrUtil.isBlank(request.getPrimaryKey()))) { + throw new YztException("请选择商品/分类!"); + } + + storeCoupon.setLastTotal(storeCoupon.getTotal()); + if (!request.getIsForever()) { + storeCoupon.setReceiveStartTime(YztDateUtil.nowDateTime()); //开始时间设置为当前时间 + }else{ + if (storeCoupon.getReceiveStartTime() == null || storeCoupon.getReceiveEndTime() == null) { + throw new YztException("请选择领取时间范围!"); + } + + int compareDate = YztDateUtil.compareDate(YztDateUtil.dateToStr(storeCoupon.getReceiveStartTime(), Constants.DATE_FORMAT), YztDateUtil.dateToStr(storeCoupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (compareDate > -1) { + throw new YztException("请选择正确的领取时间范围!"); + } + } + + //非固定时间, 领取后多少天 + if (!request.getIsFixedTime()) { + if (storeCoupon.getDay() == null || storeCoupon.getDay() == 0) { + throw new YztException("请输入天数!"); + } + storeCoupon.setUseStartTime(null); + storeCoupon.setUseEndTime(null); + } + return save(storeCoupon); + } + + /** + * 获取详情 + * @param id Integer id + * @return StoreCoupon + */ + @Override + public StoreCoupon getInfoException(Integer id) { + //获取优惠券信息 + StoreCoupon storeCoupon = getById(id); + checkException(storeCoupon); + + return storeCoupon; + } + + /** + * 检测当前优惠券是否正常 + * @param storeCoupon StoreCoupon 优惠券对象` + * + * @since 2020-05-18 + */ + private void checkException(StoreCoupon storeCoupon) { + if (storeCoupon == null || storeCoupon.getIsDel() || !storeCoupon.getStatus()) { + throw new YztException("优惠券信息不存在或者已失效!"); + } + + //看是否过期 + if (!(storeCoupon.getReceiveEndTime() == null || storeCoupon.getReceiveEndTime().equals(""))) { + //非永久可领取 + String date = YztDateUtil.nowDateTimeStr(); + int result = YztDateUtil.compareDate(date, YztDateUtil.dateToStr(storeCoupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (result == 1) { + //过期了 + throw new YztException("已超过优惠券领取最后期限!"); + } + } + + //看是否有剩余数量 + if (storeCoupon.getIsLimited()) { + //考虑到并发溢出的问题用大于等于 + if (storeCoupon.getLastTotal() < 1) { + throw new YztException("此优惠券已经被领完了!"); + } + } + } + + /** + * 优惠券详情 + * @param id Integer 获取可用优惠券的商品id + * @return StoreCouponInfoResponse + */ + @Override + public StoreCouponInfoResponse info(Integer id) { + StoreCoupon storeCoupon = getById(id); + if (ObjectUtil.isNull(storeCoupon) || storeCoupon.getIsDel() || !storeCoupon.getStatus()) { + throw new YztException("优惠券信息不存在或者已失效!"); + } + + List productList = null; + List categoryList = null; + if (StrUtil.isNotBlank(storeCoupon.getPrimaryKey()) && storeCoupon.getUseType() > 1) { + List primaryIdList = YztUtil.stringToArray(storeCoupon.getPrimaryKey()); + if (storeCoupon.getUseType() == 2) { + productList = storeProductService.getListInIds(primaryIdList); + } + if (storeCoupon.getUseType() == 3) { + categoryList = categoryService.getByIds(primaryIdList); + } + } + + StoreCouponRequest coupon = new StoreCouponRequest(); + BeanUtils.copyProperties(storeCoupon, coupon); + coupon.setIsForever(false); + if (ObjectUtil.isNotNull(coupon.getReceiveEndTime())) { + coupon.setIsForever(true); + } + + return new StoreCouponInfoResponse(coupon, productList, categoryList); + } + + /** + * 根据优惠券id获取 + * @param ids 优惠券id集合 + * @return List + */ + @Override + public List getByIds(List ids) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(StoreCoupon::getId, ids); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 扣减数量 + * @param id 优惠券id + * @param num 数量 + * @param isLimited 是否限量 + */ + @Override + public Boolean deduction(Integer id, Integer num, Boolean isLimited) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (isLimited) { + updateWrapper.setSql(StrUtil.format("last_total = last_total - {}", num)); + updateWrapper.last(StrUtil.format(" and (last_total - {} >= 0)", num)); + } else { + updateWrapper.setSql(StrUtil.format("last_total = last_total + {}", num)); + } + updateWrapper.eq("id", id); + return update(updateWrapper); + } + + /** + * 获取用户注册赠送新人券 + * @return List + */ + @Override + public List findRegisterList() { + String dateStr = YztDateUtil.nowDate(Constants.DATE_FORMAT); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCoupon::getType, 2); + lqw.eq(StoreCoupon::getStatus, true); + lqw.eq(StoreCoupon::getIsDel, false); + lqw.le(StoreCoupon::getReceiveStartTime, dateStr); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + List couponList = list.stream().filter(coupon -> { + // 是否限量 + if (coupon.getIsLimited() && coupon.getLastTotal() <= 0) { + return false; + } + // 判断是否达到可领取时间 + if (ObjectUtil.isNotNull(coupon.getReceiveStartTime())) { + //非永久可领取 + int result = YztDateUtil.compareDate(dateStr, YztDateUtil.dateToStr(coupon.getReceiveStartTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (result == -1) { + // 未开始 + return false; + } + } + + // 是否有领取结束时间 + if (ObjectUtil.isNotNull(coupon.getReceiveEndTime())) { + int compareDate = YztDateUtil.compareDate(dateStr, YztDateUtil.dateToStr(coupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (compareDate > 0) { + return false; + } + } + return true; + }).collect(Collectors.toList()); + return couponList; + } + + /** + * 发送优惠券列表 + * @param request 搜索分页参数 + * @return 优惠券列表 + * PC管理员可发送优惠券:手动领取类型,状态开启,且有剩余数量的优惠券 + * 只支持优惠券名称模糊搜索 + */ + @Override + public List getSendList(SearchAndPageRequest request) { + PageHelper.startPage(request.getPage(), request.getLimit()); + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreCoupon::getId, StoreCoupon::getName, StoreCoupon::getMoney, StoreCoupon::getMinPrice, + StoreCoupon::getUseStartTime, StoreCoupon::getUseEndTime, StoreCoupon::getIsFixedTime, StoreCoupon::getDay, + StoreCoupon::getIsLimited, StoreCoupon::getLastTotal); + lqw.eq(StoreCoupon::getIsDel, false); + if (ObjectUtil.isNotNull(request.getType())) { + lqw.eq(StoreCoupon::getType, request.getType()); + } + lqw.eq(StoreCoupon::getStatus, true); + if (StrUtil.isNotBlank(request.getKeywords())) { + lqw.like(StoreCoupon::getName, request.getKeywords()); + } + lqw.and(o -> o.eq(StoreCoupon::getIsLimited, false).or().ge(StoreCoupon::getLastTotal, 0)); + lqw.and(o -> o.isNull(StoreCoupon::getReceiveEndTime).or().gt(StoreCoupon::getReceiveEndTime, YztDateUtil.nowDate(Constants.DATE_FORMAT))); + lqw.orderByDesc(StoreCoupon::getSort, StoreCoupon::getId); + return mapper.selectList(lqw); + } + + /** + * 删除优惠券 + * @param id 优惠券id + * @return Boolean + */ + @Override + public Boolean delete(Integer id) { + StoreCoupon coupon = getById(id); + if (ObjectUtil.isNull(coupon) || coupon.getIsDel()) { + throw new YztException("优惠券不存在"); + } + coupon.setIsDel(true); + coupon.setUpdateTime(DateUtil.date()); + return mapper.updateById(coupon) > 0; + } + + /** + * 移动端优惠券列表 + * + * @param type 类型,1-通用,2-商品,3-品类 + * @param productId 产品id,搜索产品指定优惠券 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getH5List(Integer type, Integer productId, PageParamRequest pageParamRequest) { + // 获取优惠券列表 + PageInfo pageInfo = getListByReceive(type, productId, pageParamRequest); + List list = pageInfo.getList(); + if (CollUtil.isEmpty(list)) { + return CommonPage.copyPageInfo(pageInfo, new ArrayList<>()); + } + //获取用户当前已领取未使用的优惠券 + HashMap couponUserMap = null; + Integer userId = userService.getUserId(); + if (userId > 0) { + couponUserMap = storeCouponUserService.getMapByUserId(userId); + } + List storeCouponFrontResponseArrayList = new ArrayList<>(); + for (StoreCoupon storeCoupon : list) { + StoreCouponFrontResponse response = new StoreCouponFrontResponse(); + BeanUtils.copyProperties(storeCoupon, response); + + if (userId > 0) { + if (CollUtil.isNotEmpty(couponUserMap) && couponUserMap.containsKey(storeCoupon.getId())) { + response.setIsUse(true); + } + } + + if (response.getReceiveEndTime() == null) { + response.setReceiveStartTime(null); + } + + // 更改使用时间格式,去掉时分秒 + response.setUseStartTimeStr(YztDateUtil.dateToStr(storeCoupon.getUseStartTime(), Constants.DATE_FORMAT_DATE)); + response.setUseEndTimeStr(YztDateUtil.dateToStr(storeCoupon.getUseEndTime(), Constants.DATE_FORMAT_DATE)); + storeCouponFrontResponseArrayList.add(response); + } + + return CommonPage.copyPageInfo(pageInfo, storeCouponFrontResponseArrayList); + } + + /** + * 修改优惠券状态 + * @param id 优惠券id + * @param status 状态 + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + StoreCoupon coupon = getById(id); + if (ObjectUtil.isNull(coupon)) { + throw new YztException("优惠券不存在"); + } + if (coupon.getStatus().equals(status)) { + throw new YztException("优惠券状态无需变更"); + } + StoreCoupon storeCoupon = new StoreCoupon(); + storeCoupon.setId(id); + storeCoupon.setStatus(status); + storeCoupon.setUpdateTime(DateUtil.date()); + return updateById(storeCoupon); + } + + /** + * 用户可领取的优惠券 + * + * @return PageInfo + */ + private PageInfo getListByReceive(Integer type, Integer productId, PageParamRequest pageParamRequest) { + Date date = YztDateUtil.nowDateTime(); + //带 StoreCoupon 类的多条件查询 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCoupon::getIsDel, false); + lqw.eq(StoreCoupon::getStatus, 1); + //剩余数量大于0 或者不设置上限 + lqw.and(i -> i.gt(StoreCoupon::getLastTotal, 0).or().eq(StoreCoupon::getIsLimited, false)); + //领取时间范围, 结束时间为null则是不限时 + lqw.and(i -> i.isNull(StoreCoupon::getReceiveEndTime).or( p -> p.lt(StoreCoupon::getReceiveStartTime, date).gt(StoreCoupon::getReceiveEndTime, date))); + // 用户使用时间范围,结束时间为null则是不限时 + lqw.and(i -> i.isNull(StoreCoupon::getUseEndTime).or(p -> p.gt(StoreCoupon::getUseEndTime, date))); + lqw.eq(StoreCoupon::getType, 1); + if (productId > 0) { + //有商品id 通用券可以领取,商品券可以领取,分类券可以领取 + getPrimaryKeySql(lqw, productId.toString()); + } + switch (type) { + case 1: + lqw.eq(StoreCoupon::getUseType, CouponConstants.COUPON_USE_TYPE_COMMON); + break; + case 2: + lqw.eq(StoreCoupon::getUseType, CouponConstants.COUPON_USE_TYPE_PRODUCT); + break; + case 3: + lqw.eq(StoreCoupon::getUseType, CouponConstants.COUPON_USE_TYPE_CATEGORY); + break; + } + + lqw.orderByDesc(StoreCoupon::getSort).orderByDesc(StoreCoupon::getId); + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + List list = mapper.selectList(lqw); + return CommonPage.copyPageInfo(page, list); + } + + private void getPrimaryKeySql(LambdaQueryWrapper lambdaQueryWrapper, String productIdStr) { + if (StrUtil.isBlank(productIdStr)) { + return; + } + + List categoryIdList = storeProductService.getProductAllCategoryIdByProductIds(YztUtil.stringToArray(productIdStr)); + lambdaQueryWrapper.and(i -> i.and( + //通用券 商品券 品类券 + t -> t.eq(StoreCoupon::getUseType, 1) + .or(p -> p.eq(StoreCoupon::getUseType , 2).apply(YztUtil.getFindInSetSql("primary_key", productIdStr))) + .or(c -> c.eq(StoreCoupon::getUseType , 3).apply(YztUtil.getFindInSetSql("primary_key", (ArrayList) categoryIdList))) + )); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponUserServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponUserServiceImpl.java new file mode 100644 index 0000000..2e8e7e8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreCouponUserServiceImpl.java @@ -0,0 +1,582 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.CouponConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreCouponUserRequest; +import com.yzt.common.request.StoreCouponUserSearchRequest; +import com.yzt.common.request.UserCouponReceiveRequest; +import com.yzt.common.response.StoreCouponUserOrder; +import com.yzt.common.response.StoreCouponUserResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.OrderInfoDetailVo; +import com.yzt.common.vo.OrderInfoVo; +import com.yzt.service.mapper.StoreCouponUserMapper; +import com.yzt.service.service.StoreCouponService; +import com.yzt.service.service.StoreCouponUserService; +import com.yzt.service.service.StoreProductService; +import com.yzt.service.service.UserService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StoreCouponUserService 实现类 + * + */ +@Service +public class StoreCouponUserServiceImpl extends ServiceImpl implements StoreCouponUserService { + + @Resource + private StoreCouponUserMapper mapper; + + @Lazy + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private UserService userService; + + @Lazy + @Autowired + private StoreProductService storeProductService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private RedisUtil redisUtil; + + /** + * 列表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreCouponUserSearchRequest request, PageParamRequest pageParamRequest) { + Page storeCouponUserPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreCouponUser 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (!StringUtils.isBlank(request.getName())) { + lambdaQueryWrapper.like(StoreCouponUser::getName, request.getName()); + } + + if (request.getUid() != null && request.getUid() > 0) { + lambdaQueryWrapper.eq(StoreCouponUser::getUid, request.getUid()); + } + + if (request.getStatus() != null) { + lambdaQueryWrapper.eq(StoreCouponUser::getStatus, request.getStatus()); + } + + if (request.getCouponId() != null) { + lambdaQueryWrapper.eq(StoreCouponUser::getCouponId, request.getCouponId()); + } + lambdaQueryWrapper.orderByDesc(StoreCouponUser::getId); + List storeCouponUserList = mapper.selectList(lambdaQueryWrapper); + if (storeCouponUserList.size() < 1) { + return new PageInfo<>(); + } + ArrayList storeCouponUserResponseList = new ArrayList<>(); + + List uidList = storeCouponUserList.stream().map(StoreCouponUser::getUid).distinct().collect(Collectors.toList()); + HashMap userList = userService.getMapListInUid(uidList); + + for (StoreCouponUser storeCouponUser : storeCouponUserList) { + StoreCouponUserResponse storeCouponUserResponse = new StoreCouponUserResponse(); + BeanUtils.copyProperties(storeCouponUser, storeCouponUserResponse); + if (userList.containsKey(storeCouponUser.getUid())) { + storeCouponUserResponse.setNickname(userList.get(storeCouponUser.getUid()).getNickname()); + storeCouponUserResponse.setAvatar(userList.get(storeCouponUser.getUid()).getAvatar()); + } + storeCouponUserResponseList.add(storeCouponUserResponse); + } + return CommonPage.copyPageInfo(storeCouponUserPage, storeCouponUserResponseList); + } + + /** + * 领券/批量领券 + * + * @param request 新增参数 + * @return boolean + */ + @Override + public Boolean receive(StoreCouponUserRequest request) { + //获取优惠券信息 + StoreCoupon storeCoupon = storeCouponService.getInfoException(request.getCouponId()); + + List uidList = YztUtil.stringToArray(request.getUid()); + if (uidList.size() < 1) { + throw new YztException("请选择用户!"); + } + + //看是否有剩余数量 + if (storeCoupon.getIsLimited()) { + //看剩余的是否够给当前用户 + if (storeCoupon.getLastTotal() < uidList.size()) { + throw new YztException("当前剩余数量不够领取!"); + } + } + + //过滤掉已经领取过的用户 + filterReceiveUserInUid(storeCoupon.getId(), uidList); + if (uidList.size() < 1) { + //都已经领取过了 + throw new YztException("当前用户已经领取过此优惠券了!"); + } + + //是否有固定的使用时间 + if (!storeCoupon.getIsFixedTime()) { + String endTime = YztDateUtil.addDay(YztDateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(YztDateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + ArrayList storeCouponUserList = new ArrayList<>(); + + for (Integer uid : uidList) { + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setUid(uid); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType(CouponConstants.STORE_COUPON_USER_TYPE_SEND); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + storeCouponUserList.add(storeCouponUser); + } + + storeCoupon.setLastTotal(storeCoupon.getLastTotal() - uidList.size()); + + Boolean execute = transactionTemplate.execute(e -> { + saveBatch(storeCouponUserList); + storeCoupon.setUpdateTime(DateUtil.date()); + storeCouponService.updateById(storeCoupon); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 过滤已经领取过此优惠券的用户id + * + * @param couponId Integer 优惠券id + * @param uidList List 用户id集合 + */ + private void filterReceiveUserInUid(Integer couponId, List uidList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCouponUser::getCouponId, couponId); + lambdaQueryWrapper.in(StoreCouponUser::getUid, uidList); + List storeCouponUserList = mapper.selectList(lambdaQueryWrapper); + if (storeCouponUserList != null) { + List receiveUidList = storeCouponUserList.stream().map(StoreCouponUser::getUid).distinct().collect(Collectors.toList()); + uidList.removeAll(receiveUidList); + } + } + + /** + * 用户已领取的优惠券 + * + * @param userId Integer 用户id + * @return boolean + * + * @since 2020-05-18 + */ + @Override + public HashMap getMapByUserId(Integer userId) { + List list = findListByUid(userId); + + if (list.size() < 1) { + return null; + } + + HashMap map = new HashMap<>(); + for (StoreCouponUser info : list) { + map.put(info.getCouponId(), info); + } + return map; + } + + private List findListByUid(Integer uid) { + LambdaQueryWrapper lwq = new LambdaQueryWrapper<>(); + lwq.eq(StoreCouponUser::getUid, uid); + return mapper.selectList(lwq); + } + + /** + * 当前订单可用优惠券 + * + * @param preOrderNo 预下单订单号 + * @return 优惠券集合 + */ + @Override + public List getListByPreOrderNo(String preOrderNo) { + // 通过缓存获取预下单对象 + String key = "user_order:" + preOrderNo; + boolean exists = redisUtil.exists(key); + if (!exists) { + throw new YztException("预下单订单不存在"); + } + String orderVoString = redisUtil.get(key).toString(); + OrderInfoVo orderInfoVo = JSONObject.parseObject(orderVoString, OrderInfoVo.class); + //产品id集合 + List productIds = orderInfoVo.getOrderDetailList().stream().map(OrderInfoDetailVo::getProductId).distinct().collect(Collectors.toList()); + + //计算购物车价格 + BigDecimal maxPrice = orderInfoVo.getProTotalFee(); + + Date date = YztDateUtil.nowDateTime(); + Map map = CollUtil.newHashMap(); + map.put("date", date); + map.put("maxPrice", maxPrice); + map.put("uid", userService.getUserIdException()); + map.put("productIds", productIds); + List categoryIdList = storeProductService.getProductAllCategoryIdByProductIds(productIds); + map.put("categoryIdList", categoryIdList); + List storeCouponUserList = mapper.getListByPreOrderNo(map); + if (CollUtil.isEmpty(storeCouponUserList)) { + return CollUtil.newArrayList(); + } + //前端组件统一 转化数据 + List storeCouponUserOrderArrayList = new ArrayList<>(); + for (StoreCouponUser storeCouponUser : storeCouponUserList) { + StoreCouponUserOrder storeCouponUserOrder = new StoreCouponUserOrder(); + BeanUtils.copyProperties(storeCouponUser, storeCouponUserOrder); + storeCouponUserOrderArrayList.add(storeCouponUserOrder); + } + return storeCouponUserOrderArrayList; + } + + /** + * 移动端列表 + * + * @param type 类型,usable-可用,unusable-不可用 + * @param userId 用户id + * @param pageParamRequest 分页类参数 + * @return List + */ + private List getH5List(String type, Integer userId, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreCouponUser 类的多条件查询 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + lqw.eq(StoreCouponUser::getUid, userId); + if (type.equals("usable")) { + lqw.eq(StoreCouponUser::getStatus, CouponConstants.STORE_COUPON_USER_STATUS_USABLE); + lqw.orderByDesc(StoreCouponUser::getId); + } + if (type.equals("unusable")) { + lqw.gt(StoreCouponUser::getStatus, CouponConstants.STORE_COUPON_USER_STATUS_USABLE); + lqw.last(StrUtil.format(" order by case `status` when {} then {} when {} then {} when {} then {} end", 0, 1, 1, 2, 2, 3)); + } + + List storeCouponUserList = mapper.selectList(lqw); + if (CollUtil.isEmpty(storeCouponUserList)) { + return CollUtil.newArrayList(); + } + return storeCouponUserList; + } + + /** + * 优惠券过期定时任务 + */ + @Override + public void overdueTask() { + // 查询所有状态——可用的优惠券 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreCouponUser::getStatus, 0); + List couponList = mapper.selectList(lqw); + if (CollUtil.isEmpty(couponList)) { + return; + } + // 判断优惠券是否过期 + List updateList = CollUtil.newArrayList(); + String nowDateStr = YztDateUtil.nowDate(Constants.DATE_FORMAT); + couponList.forEach(coupon -> { + if (ObjectUtil.isNotNull(coupon.getEndTime())) { + String endDateStr = YztDateUtil.dateToStr(coupon.getEndTime(), Constants.DATE_FORMAT); + if (YztDateUtil.compareDate(nowDateStr, endDateStr, Constants.DATE_FORMAT) >= 0) { + coupon.setStatus(2); + coupon.setUpdateTime(DateUtil.date()); + updateList.add(coupon); + } + } + }); + + if (CollUtil.isEmpty(updateList)) { + return; + } + boolean update = updateBatchById(updateList); + if (!update) throw new YztException("批量更新优惠券过期动作失败"); + } + + /** + * 用户领取优惠券 + */ + @Override + public Boolean receiveCoupon(UserCouponReceiveRequest request) { + // 获取优惠券信息 + StoreCoupon storeCoupon = storeCouponService.getInfoException(request.getCouponId()); + + Integer userId = userService.getUserIdException(); + + //看是否有剩余数量,是否够给当前用户 + if (storeCoupon.getIsLimited() && storeCoupon.getLastTotal() < 1) { + throw new YztException("当前剩余数量不够领取!"); + } + //过滤掉已经领取过的用户 + List uidList = CollUtil.newArrayList(); + uidList.add(userId); + filterReceiveUserInUid(storeCoupon.getId(), uidList); + if (uidList.size() < 1) { + //都已经领取过了 + throw new YztException("当前用户已经领取过此优惠券了!"); + } + //是否有固定的使用时间 + if (!storeCoupon.getIsFixedTime()) { + String endTime = YztDateUtil.addDay(YztDateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(YztDateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setUid(userId); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType(CouponConstants.STORE_COUPON_USER_TYPE_GET); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + Boolean execute = transactionTemplate.execute(e -> { + save(storeCouponUser); + storeCouponService.deduction(storeCoupon.getId(), 1, storeCoupon.getIsLimited()); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 支付成功赠送处理 + * + * @param couponId 优惠券编号 + * @param uid 用户uid + * @return MyRecord + */ + @Override + public MyRecord paySuccessGiveAway(Integer couponId, Integer uid) { + MyRecord record = new MyRecord(); + record.set("status", "fail"); + // 获取优惠券信息 + StoreCoupon storeCoupon = storeCouponService.getById(couponId); + if (ObjectUtil.isNull(storeCoupon) || storeCoupon.getIsDel() || !storeCoupon.getStatus()) { + record.set("errMsg", "优惠券信息不存在或者已失效!"); + return record; + } + + // 判断是否达到可领取时间 + if (ObjectUtil.isNotNull(storeCoupon.getReceiveStartTime())) { + //非永久可领取 + String date = YztDateUtil.nowDateTimeStr(); + int result = YztDateUtil.compareDate(date, YztDateUtil.dateToStr(storeCoupon.getReceiveStartTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (result == -1) { + // 未开始 + record.set("errMsg", "还未达到优惠券领取时间!"); + return record; + } + } + + //看是否过期 + if (storeCoupon.getReceiveEndTime() != null) { + //非永久可领取 + String date = YztDateUtil.nowDateTimeStr(); + int result = YztDateUtil.compareDate(date, YztDateUtil.dateToStr(storeCoupon.getReceiveEndTime(), Constants.DATE_FORMAT), Constants.DATE_FORMAT); + if (result == 1) { + //过期了 + record.set("errMsg", "已超过优惠券领取最后期限!"); + return record; + } + } + + //看是否有剩余数量 + if (storeCoupon.getIsLimited() && storeCoupon.getLastTotal() < 1) { + record.set("errMsg", "此优惠券已经被领完了!"); + return record; + } + + //过滤掉已经领取过的用户 + List uidList = CollUtil.newArrayList(); + uidList.add(uid); + filterReceiveUserInUid(storeCoupon.getId(), uidList); + if (uidList.size() < 1) { + //都已经领取过了 + record.set("errMsg", "当前用户已经领取过此优惠券了!"); + return record; + } + + //是否有固定的使用时间 + if (!storeCoupon.getIsFixedTime()) { + String endTime = YztDateUtil.addDay(YztDateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(YztDateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setUid(uid); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType(CouponConstants.STORE_COUPON_USER_TYPE_BUY); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + record.set("status", "ok"); + record.set("storeCouponUser", storeCouponUser); + record.set("isLimited", storeCoupon.getIsLimited()); + return record; + } + + /** + * 根据uid获取列表 + * + * @param uid uid + * @param pageParamRequest 分页参数 + * @return 优惠券列表 + */ + @Override + public List findListByUid(Integer uid, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreCouponUser 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + + lambdaQueryWrapper.eq(StoreCouponUser::getUid, uid); + lambdaQueryWrapper.orderByDesc(StoreCouponUser::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取可用优惠券数量 + * + * @param uid 用户uid + * @return Integer + */ + @Override + public Integer getUseCount(Integer uid) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreCouponUser::getUid, uid); + lambdaQueryWrapper.eq(StoreCouponUser::getStatus, 0); + List storeCouponUserList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeCouponUserList)) { + return 0; + } + Date date = YztDateUtil.nowDateTime(); + for (int i = 0; i < storeCouponUserList.size(); ) { + StoreCouponUser couponUser = storeCouponUserList.get(i); + //判断是否在使用时间内 + if (ObjectUtil.isNotNull(couponUser.getStartTime()) && ObjectUtil.isNotNull(couponUser.getEndTime())) { + if (date.compareTo(couponUser.getEndTime()) >= 0) { + storeCouponUserList.remove(i); + continue; + } + } + i++; + } + return CollUtil.isEmpty(storeCouponUserList) ? 0 : storeCouponUserList.size(); + } + + /** + * 我的优惠券列表 + * + * @param type 类型,usable-可用,unusable-不可用 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + @Override + public CommonPage getMyCouponList(String type, PageParamRequest pageParamRequest) { + Integer userId = userService.getUserIdException(); + + List couponUserList = getH5List(type, userId, pageParamRequest); + + if (CollUtil.isEmpty(couponUserList)) { + return null; + } + Date date = YztDateUtil.nowDateTime(); + List responseList = CollUtil.newArrayList(); + for (StoreCouponUser storeCouponUser : couponUserList) { + StoreCouponUserResponse storeCouponUserResponse = new StoreCouponUserResponse(); + BeanUtils.copyProperties(storeCouponUser, storeCouponUserResponse); + String validStr = "usable";// 可用 + if (storeCouponUser.getStatus().equals(CouponConstants.STORE_COUPON_USER_STATUS_USED)) { + validStr = "unusable";// 已用 + } + if (storeCouponUser.getStatus().equals(CouponConstants.STORE_COUPON_USER_STATUS_LAPSED)) { + validStr = "overdue";// 过期 + } + + //判断是否在使用时间内 排除已用的优惠券 + if (!storeCouponUser.getStatus().equals(CouponConstants.STORE_COUPON_USER_STATUS_USED) + && null != storeCouponUserResponse.getStartTime() + && null != storeCouponUserResponse.getEndTime()) { + if (storeCouponUserResponse.getStartTime().compareTo(date) > 0) { + validStr = "notStart";// 未开始 + } + if (date.compareTo(storeCouponUserResponse.getEndTime()) >= 0) { + validStr = "overdue";// 过期 + } + } + storeCouponUserResponse.setValidStr(validStr); + + // 更改使用时间格式,去掉时分秒 + storeCouponUserResponse.setUseStartTimeStr(YztDateUtil.dateToStr(storeCouponUserResponse.getStartTime(), Constants.DATE_FORMAT_DATE)); + storeCouponUserResponse.setUseEndTimeStr(YztDateUtil.dateToStr(storeCouponUserResponse.getEndTime(), Constants.DATE_FORMAT_DATE)); + responseList.add(storeCouponUserResponse); + } + return CommonPage.restPage(responseList); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInfoServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInfoServiceImpl.java new file mode 100644 index 0000000..a6dea29 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInfoServiceImpl.java @@ -0,0 +1,257 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.ActivityEnrollSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.ActivityEnrollResponse; +import com.yzt.common.vo.OrderInfoDetailVo; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.common.vo.StoreOrderInfoVo; +import com.yzt.common.vo.VirtualRemarkVo; +import com.yzt.service.mapper.StoreOrderInfoMapper; +import com.yzt.service.service.*; +import io.swagger.models.auth.In; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreOrderInfoServiceImpl 接口实现 + * + */ +@Service +public class StoreOrderInfoServiceImpl extends ServiceImpl + implements StoreOrderInfoService { + + @Resource + private StoreOrderInfoMapper mapper; + + @Autowired + private StoreProductReplyService storeProductReplyService; + + @Autowired + private StoreOrderService storeOrderService; + + /** + * 根据id集合查询数据,返回 map + * @param orderList List id集合 + * @return HashMap + */ + @Override + public HashMap> getMapInId(List orderList){ + HashMap> map = new HashMap<>(); + if(orderList.size() < 1){ + return map; + } + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(StoreOrderInfo::getOrderId, orderList); + List systemStoreStaffList = mapper.selectList(lambdaQueryWrapper); + if(systemStoreStaffList.size() < 1){ + return map; + } + for (StoreOrderInfo storeOrderInfo : systemStoreStaffList) { + //解析商品详情JSON + StoreOrderInfoOldVo StoreOrderInfoVo = new StoreOrderInfoOldVo(); + BeanUtils.copyProperties(storeOrderInfo, StoreOrderInfoVo, "info"); + StoreOrderInfoVo.setInfo(JSON.parseObject(storeOrderInfo.getInfo(), OrderInfoDetailVo.class)); + if(map.containsKey(storeOrderInfo.getOrderId())){ + map.get(storeOrderInfo.getOrderId()).add(StoreOrderInfoVo); + }else{ + List storeOrderInfoVoList = new ArrayList<>(); + storeOrderInfoVoList.add(StoreOrderInfoVo); + map.put(storeOrderInfo.getOrderId(), storeOrderInfoVoList); + } + } + return map; + } + + /** + * 根据id集合查询数据,返回 PageInfo + * @param id List id + * @return PageInfo + */ + @Override + public PageInfo getEnrollmentListByActivity(Integer id, PageParamRequest pageParamRequest) { + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StoreOrderInfo::getProductId,id); + lqw.orderByDesc(StoreOrderInfo::getCreateTime); + List orderList = mapper.selectList(lqw); + List orderIds = orderList.stream().map(StoreOrderInfo::getOrderId).distinct().collect(Collectors.toList()); + if (orderIds.isEmpty()){ + return CommonPage.copyPageInfo(startPage, new ArrayList<>()); + } + List enrollResponses = storeOrderService.getVirtualRemarkVoByIds(orderIds); + return CommonPage.copyPageInfo(startPage, enrollResponses); + } + + //nothing + @Override + public PageInfo getList(ActivityEnrollSearchRequest request, PageParamRequest pageParamRequest) { + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + List orderList = mapper.selectList(lqw); + if(!request.getName().isBlank()){ + lqw.like(StoreOrderInfo::getProductName,request.getName()); + } + List activityEnrollResponses = new ArrayList<>(); + + return CommonPage.copyPageInfo(startPage, activityEnrollResponses); + } + + /** + * 根据id集合查询数据,返回 map + * @param orderId Integer id + * @return HashMap + */ + @Override + public List getOrderListByOrderId(Integer orderId){ + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreOrderInfo::getOrderId, orderId); + List systemStoreStaffList = mapper.selectList(lambdaQueryWrapper); + if(systemStoreStaffList.size() < 1){ + return null; + } + + List storeOrderInfoVoList = new ArrayList<>(); + for (StoreOrderInfo storeOrderInfo : systemStoreStaffList) { + //解析商品详情JSON + StoreOrderInfoOldVo storeOrderInfoVo = new StoreOrderInfoOldVo(); + BeanUtils.copyProperties(storeOrderInfo, storeOrderInfoVo, "info"); + storeOrderInfoVo.setInfo(JSON.parseObject(storeOrderInfo.getInfo(), OrderInfoDetailVo.class)); + storeOrderInfoVo.getInfo().setIsReply( + storeProductReplyService.isReply(storeOrderInfoVo.getUnique(), storeOrderInfoVo.getOrderId()) ? 1 : 0 + ); + storeOrderInfoVoList.add(storeOrderInfoVo); + } + return storeOrderInfoVoList; + } + + /** + * 根据id集合查询数据,返回 map + * @param orderId 订单id + * @return HashMap + */ + @Override + public List getVoListByOrderId(Integer orderId){ + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreOrderInfo::getOrderId, orderId); + List systemStoreStaffList = mapper.selectList(lambdaQueryWrapper); + if(systemStoreStaffList.size() < 1){ + return null; + } + + List storeOrderInfoVoList = new ArrayList<>(); + for (StoreOrderInfo storeOrderInfo : systemStoreStaffList) { + //解析商品详情JSON + StoreOrderInfoVo storeOrderInfoVo = new StoreOrderInfoVo(); + BeanUtils.copyProperties(storeOrderInfo, storeOrderInfoVo, "info"); + storeOrderInfoVo.setInfo(JSON.parseObject(storeOrderInfo.getInfo(), OrderInfoDetailVo.class)); + storeOrderInfoVoList.add(storeOrderInfoVo); + } + return storeOrderInfoVoList; + } + + /** + * 获取订单详情-订单编号 + * @param orderNo 订单编号 + * @return List + */ + @Override + public List getListByOrderNo(String orderNo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrderInfo::getOrderNo, orderNo); + return mapper.selectList(lqw); + } + + /** + * 根据时间、商品id获取销售件数 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + * @return Integer + */ + @Override + public Integer getSalesNumByDateAndProductId(String date, Integer proId) { + return mapper.getSalesNumByDateAndProductId(date, proId); + } + + /** + * 根据时间、商品id获取销售额 + * @param date 时间,格式'yyyy-MM-dd' + * @param proId 商品id + * @return BigDecimal + */ + @Override + public BigDecimal getSalesByDateAndProductId(String date, Integer proId) { + return mapper.getSalesByDateAndProductId(date, proId); + } + + /** + * 新增订单详情 + * @param storeOrderInfos 订单详情集合 + * @return 订单新增结果 + */ + @Override + public boolean saveOrderInfos(List storeOrderInfos) { + return saveBatch(storeOrderInfos); + } + + /** + * 通过订单编号和规格号查询 + * @param uni 规格号 + * @param orderId 订单编号 + * @return StoreOrderInfo + */ + @Override + public StoreOrderInfo getByUniAndOrderId(String uni, Integer orderId) { + //带 StoreOrderInfo 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreOrderInfo::getOrderId, orderId); + lambdaQueryWrapper.eq(StoreOrderInfo::getUnique, uni); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 根据订单id、商品id、商品唯一id更新回复状态 + * + * @param orderId 订单id + * @param productId 商品id + * @param unique 商品唯一id + * @return + */ + @Override + public void updateReply(Integer orderId, Integer productId, String unique) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreOrderInfo::getOrderId, orderId); + lambdaQueryWrapper.eq(StoreOrderInfo::getProductId, productId); + lambdaQueryWrapper.eq(StoreOrderInfo::getUnique, unique); + StoreOrderInfo storeOrderInfo = mapper.selectOne(lambdaQueryWrapper); + if (ObjectUtil.isNotNull(storeOrderInfo)) { + storeOrderInfo.setIsReply(Boolean.TRUE); + storeOrderInfo.setUpdateTime(DateUtil.date()); + mapper.updateById(storeOrderInfo); + } + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInvoiceServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInvoiceServiceImpl.java new file mode 100644 index 0000000..48b172f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderInvoiceServiceImpl.java @@ -0,0 +1,140 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.InvoiceConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.order.StoreOrderInvoice; +import com.yzt.common.vo.InvoiceRequestVo; +import com.yzt.service.mapper.StoreOrderInvoiceMapper; +import com.yzt.service.service.StoreOrderInvoiceService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单发票服务实现类 + */ +@Slf4j +@Service +public class StoreOrderInvoiceServiceImpl extends ServiceImpl + implements StoreOrderInvoiceService { + + /** + * 保存订单发票信息 + */ + @Override + public boolean saveOrderInvoice(String orderId, InvoiceRequestVo invoiceRequestVo, BigDecimal invoiceAmount) { + // 验证发票信息 + validateInvoiceInfo(invoiceRequestVo); + + // 构建发票对象 + StoreOrderInvoice invoice = new StoreOrderInvoice(); + invoice.setOrderId(orderId); + invoice.setInvoiceType(invoiceRequestVo.getInvoiceType()); + invoice.setInvoiceTitle(invoiceRequestVo.getInvoiceTitle()); + invoice.setTaxNumber(invoiceRequestVo.getTaxNumber()); + + // 设置发票内容,如果没有传入则使用默认值 + String invoiceContent = StrUtil.isBlank(invoiceRequestVo.getInvoiceContent()) + ? InvoiceConstants.INVOICE_CONTENT_DEFAULT + : invoiceRequestVo.getInvoiceContent(); + invoice.setInvoiceContent(invoiceContent); + + // 设置开票金额和状态 + invoice.setInvoiceAmount(invoiceAmount); + invoice.setInvoiceStatus(InvoiceConstants.INVOICE_STATUS_PENDING); + invoice.setCreateTime(new Date()); + invoice.setUpdateTime(new Date()); + + // 保存到数据库 + boolean result = save(invoice); + if (result) { + log.info("订单发票信息保存成功,订单号:{}", orderId); + } else { + log.error("订单发票信息保存失败,订单号:{}", orderId); + } + + return result; + } + + /** + * 验证发票信息 + */ + @Override + public void validateInvoiceInfo(InvoiceRequestVo invoiceRequestVo) { + if (invoiceRequestVo == null || !invoiceRequestVo.getNeedInvoice()) { + return; + } + + // 验证发票抬头类型 + if (invoiceRequestVo.getInvoiceType() == null) { + throw new YztException("请选择发票抬头类型"); + } + + if (!invoiceRequestVo.getInvoiceType().equals(InvoiceConstants.INVOICE_TYPE_PERSONAL) + && !invoiceRequestVo.getInvoiceType().equals(InvoiceConstants.INVOICE_TYPE_COMPANY)) { + throw new YztException("发票抬头类型不正确"); + } + + // 验证发票抬头 + if (StrUtil.isBlank(invoiceRequestVo.getInvoiceTitle())) { + throw new YztException("请填写发票抬头"); + } + + // 单位类型必须填写纳税人识别号 + if (invoiceRequestVo.getInvoiceType().equals(InvoiceConstants.INVOICE_TYPE_COMPANY)) { + if (StrUtil.isBlank(invoiceRequestVo.getTaxNumber())) { + throw new YztException("单位发票必须填写纳税人识别号"); + } + + // 验证纳税人识别号格式(15位、17位、18位或20位的字母和数字组合) + String taxNumber = invoiceRequestVo.getTaxNumber().trim(); + if (!taxNumber.matches("^[A-Z0-9]{15}$|^[A-Z0-9]{17}$|^[A-Z0-9]{18}$|^[A-Z0-9]{20}$")) { + throw new YztException("纳税人识别号格式不正确,应为15/17/18/20位的字母或数字"); + } + } + } + + /** + * 根据订单号查询发票信息 + */ + @Override + public StoreOrderInvoice getByOrderId(String orderId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(StoreOrderInvoice::getOrderId, orderId); + return getOne(wrapper); + } + + /** + * 更新发票开票状态 + */ + @Override + public boolean updateInvoiceStatus(String orderId, Integer invoiceStatus, String invoiceCode, + String invoiceNumber, String invoiceUrl) { + StoreOrderInvoice invoice = getByOrderId(orderId); + if (invoice == null) { + log.error("订单发票不存在,订单号:{}", orderId); + return false; + } + + invoice.setInvoiceStatus(invoiceStatus); + invoice.setInvoiceCode(invoiceCode); + invoice.setInvoiceNumber(invoiceNumber); + invoice.setInvoiceUrl(invoiceUrl); + invoice.setInvoiceTime(new Date()); + invoice.setUpdateTime(new Date()); + + boolean result = updateById(invoice); + if (result) { + log.info("订单发票状态更新成功,订单号:{},状态:{}", orderId, invoiceStatus); + } else { + log.error("订单发票状态更新失败,订单号:{}", orderId); + } + + return result; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderRefundServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderRefundServiceImpl.java new file mode 100644 index 0000000..485c20b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderRefundServiceImpl.java @@ -0,0 +1,103 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.request.StoreOrderRefundRequest; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.utils.WxPayUtil; +import com.yzt.common.vo.WxRefundVo; +import com.yzt.service.mapper.StoreOrderMapper; +import com.yzt.service.service.StoreOrderRefundService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.WechatNewService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * StoreOrderServiceImpl 接口实现 + * + */ +@Service +public class StoreOrderRefundServiceImpl extends ServiceImpl implements StoreOrderRefundService { + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private RestTemplateUtil restTemplateUtil; + @Autowired + private WechatNewService wechatNewService; + + /** + * 退款 + */ + @Override + public void refund(StoreOrderRefundRequest request, StoreOrder storeOrder) { + refundWx(request, storeOrder); + } + + /** + * 公众号退款 + * @param request + * @param storeOrder + */ + private void refundWx(StoreOrderRefundRequest request, StoreOrder storeOrder) { + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + String path = ""; + if (storeOrder.getIsChannel() == 0) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); +// path = systemConfigService.getValueByKeyException("pay_routine_client_p12"); + path = systemConfigService.getValueByKeyException("pay_weixin_certificate_path"); + } + if (storeOrder.getIsChannel() == 1) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); +// path = systemConfigService.getValueByKeyException("pay_mini_client_p12"); + path = systemConfigService.getValueByKeyException("pay_routine_certificate_path"); + } + if (storeOrder.getIsChannel() == 2) {// H5, 使用公众号的 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); +// path = systemConfigService.getValueByKeyException("pay_mini_client_p12"); + path = systemConfigService.getValueByKeyException("pay_weixin_certificate_path"); + } + if (storeOrder.getIsChannel() == 4 || storeOrder.getIsChannel() == 5) {// 微信App + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_APP_KEY); +// path = systemConfigService.getValueByKeyException("pay_mini_app_client_p12"); + path = systemConfigService.getValueByKeyException("pay_weixin_app_certificate_path"); + } + + String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL); + + //统一下单数据 + WxRefundVo wxRefundVo = new WxRefundVo(); + wxRefundVo.setAppid(appId); + wxRefundVo.setMch_id(mchId); + wxRefundVo.setNonce_str(WxPayUtil.getNonceStr()); + wxRefundVo.setOut_trade_no(storeOrder.getOutTradeNo()); + wxRefundVo.setOut_refund_no(storeOrder.getOrderId()); + wxRefundVo.setTotal_fee(storeOrder.getPayPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); + wxRefundVo.setRefund_fee(request.getAmount().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); + wxRefundVo.setNotify_url(apiDomain + PayConstants.WX_PAY_REFUND_NOTIFY_API_URI); + String sign = WxPayUtil.getSign(wxRefundVo, signKey); + wxRefundVo.setSign(sign); + + wechatNewService.payRefund(wxRefundVo, path); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderServiceImpl.java new file mode 100644 index 0000000..32735f8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderServiceImpl.java @@ -0,0 +1,2442 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.express.Express; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.model.user.UserToken; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.request.onepass.OnePassShipmentCreateOrderRequest; +import com.yzt.common.response.*; +import com.yzt.common.utils.*; +import com.yzt.common.vo.*; +import com.yzt.service.mapper.StoreOrderMapper; +import com.yzt.service.delete.OrderUtils; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StoreOrderServiceImpl 接口实现 + * + */ +@Service +public class StoreOrderServiceImpl extends ServiceImpl implements StoreOrderService { + + private final Logger logger = LoggerFactory.getLogger(StoreOrderServiceImpl.class); + + @Resource + private StoreOrderMapper mapper; + + @Autowired + private SystemStoreService systemStoreService; + + @Lazy + @Autowired + private UserService userService; + + @Autowired + private UserBillService userBillService; + + @Lazy + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private StoreOrderRefundService storeOrderRefundService; + + @Autowired + private ExpressService expressService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private LogisticService logisticService; + + @Lazy + @Autowired + private OrderUtils orderUtils; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private OnePassService onePassService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private SmsService smsService; + + @Lazy + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private SystemNotificationService systemNotificationService; + + @Autowired + private SmsTemplateService smsTemplateService; + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + +// @Autowired +// private WechatOrderShippingService wechatOrderShippingService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return CommonPage + */ + @Override + public CommonPage getAdminList(StoreOrderSearchRequest request, PageParamRequest pageParamRequest) { + + Integer userId = SecurityUtil.getCurrentUserId(); + Long tenantId = systemAdminService.getDetail(userId).getTenantId(); + + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id", "order_id", "uid", "real_name", "pay_price", "pay_type", "create_time", "status", "refund_status" + , "refund_reason_wap_img", "refund_reason_wap_explain", "refund_reason_wap", "refund_reason", "refund_reason_time" + , "is_del", "combination_id", "pink_id", "seckill_id", "bargain_id", "verify_code", "remark", "paid", "is_system_del" + , "shipping_type", "type", "is_alter_price", "pro_total_price", "is_alter_price", "coupon_price"); + + queryWrapper.eq("tenant_id",tenantId); + + if (StrUtil.isNotBlank(request.getOrderNo())) { + queryWrapper.eq("order_id", request.getOrderNo()); + } + getRequestTimeWhere(queryWrapper, request); + getStatusWhere(queryWrapper, request.getStatus()); + if (!request.getType().equals(3)) { + queryWrapper.eq("type", request.getType()); + } + queryWrapper.orderByDesc("id"); + List orderList = mapper.selectList(queryWrapper); + List detailResponseList = new ArrayList<>(); + if (CollUtil.isNotEmpty(orderList)) { + detailResponseList = formatOrder1(orderList); + } + return CommonPage.restPage(CommonPage.copyPageInfo(startPage, detailResponseList)); + } + + + /** + * H5订单列表 + * @param uid 用户uid + * @param status 评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成,-3=售后/退款 + * @param pageParamRequest 分页参数 + * @return 订单结果列表 + */ + @Override + public List getUserOrderList(Integer uid, Integer status, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + orderUtils.statusApiByWhere(lqw, status); + lqw.eq(StoreOrder::getUid, uid); + lqw.orderByDesc(StoreOrder::getId); + return mapper.selectList(lqw); + } + + /** + * 订单列表 + * @param keywords 搜索条件 + * @param uid 用户uid + * @param status 评价等级|0=未支付,1=待发货,2=待收货,3=待评价,4=已完成,-3=售后/退款 + * @param pageParamRequest 分页参数 + * @return 订单结果列表 + */ + public PageInfo getUserOrderList_2_3(String keywords, + Integer uid, Integer status, PageParamRequest pageParamRequest) { + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + Map searchMap = new HashMap<>(); + String searchKey = URLUtil.decode(keywords); + searchMap.put("keywords", searchKey); + searchMap.put("status", status); + searchMap.put("uid", uid); + List orderList = mapper.findFrontList(searchMap); + + return CommonPage.copyPageInfo(page, orderList); + } + + /** + * 创建订单 + * @param storeOrder 订单参数 + * @return 结果标识 + */ + @Override + public boolean create(StoreOrder storeOrder) { + return mapper.insert(storeOrder) > 0; + } + + /** + * 订单基本查询一条 + * @param storeOrder 参数 + * @return 查询结果 + */ + @Override + public StoreOrder getByEntityOne(StoreOrder storeOrder) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.setEntity(storeOrder); + return mapper.selectOne(lqw); + } + + /** + * 核销列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public SystemWriteOffOrderResponse getWriteOffList(SystemWriteOffOrderSearchRequest request, PageParamRequest pageParamRequest) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + String where = " is_del = 0 and shipping_type = 2"; + //时间 + if (!StringUtils.isBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + where += " and (create_time between '" + dateLimit.getStartTime() + "' and '" + dateLimit.getEndTime() + "' )"; + } + + if (!StringUtils.isBlank(request.getKeywords())) { + where += " and (real_name like '%"+ request.getKeywords() +"%' or user_phone = '"+ request.getKeywords() +"' or order_id = '" + request.getKeywords() + "' or id = '" + request.getKeywords() + "' )"; + } + + if (request.getStoreId() != null && request.getStoreId() > 0) { + where += " and store_id = " + request.getStoreId(); + } + + SystemWriteOffOrderResponse systemWriteOffOrderResponse = new SystemWriteOffOrderResponse(); + BigDecimal totalPrice = mapper.getTotalPrice(where); + if (ObjectUtil.isNull(totalPrice)) { + totalPrice = BigDecimal.ZERO; + } + systemWriteOffOrderResponse.setOrderTotalPrice(totalPrice); //订单总金额 + + BigDecimal refundPrice = mapper.getRefundPrice(where); + if (ObjectUtil.isNull(refundPrice)) { + refundPrice = BigDecimal.ZERO; + } + systemWriteOffOrderResponse.setRefundTotalPrice(refundPrice); //退款总金额 + systemWriteOffOrderResponse.setRefundTotal(mapper.getRefundTotal(where)); //退款总单数 + + Page storeOrderPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + lambdaQueryWrapper.apply(where); + lambdaQueryWrapper.orderByDesc(StoreOrder::getId); + List storeOrderList = mapper.selectList(lambdaQueryWrapper); + + if (storeOrderList.size() < 1) { + systemWriteOffOrderResponse.setList(CommonPage.restPage(new PageInfo<>())); + return systemWriteOffOrderResponse; + } + + List storeOrderItemResponseArrayList = formatOrder(storeOrderList); + + systemWriteOffOrderResponse.setTotal(storeOrderPage.getTotal()); //总单数 + systemWriteOffOrderResponse.setList(CommonPage.restPage(CommonPage.copyPageInfo(storeOrderPage, storeOrderItemResponseArrayList))); + + return systemWriteOffOrderResponse; + } + + /** + * 格式化订单信息,对外输出一致 + * @param orderList List 订单列表 + * @return List + */ + private List formatOrder1(List orderList) { + List detailResponseList = new ArrayList<>(); + if (CollUtil.isEmpty(orderList)) { + return detailResponseList; + } + + //订单id集合 + List orderIdList = orderList.stream().map(StoreOrder::getId).distinct().collect(Collectors.toList()); + + //获取订单详情map + HashMap> orderInfoList = storeOrderInfoService.getMapInId(orderIdList); + + for (StoreOrder storeOrder : orderList) { + StoreOrderDetailResponse storeOrderItemResponse = new StoreOrderDetailResponse(); + BeanUtils.copyProperties(storeOrder, storeOrderItemResponse); + + storeOrderItemResponse.setProductList(orderInfoList.get(storeOrder.getId())); + + //订单状态 + storeOrderItemResponse.setStatusStr(getStatus(storeOrder)); + storeOrderItemResponse.setStatus(storeOrder.getStatus()); + //支付方式 + storeOrderItemResponse.setPayTypeStr(getPayType(storeOrder.getPayType())); + + // 添加订单类型信息 + storeOrderItemResponse.setOrderType(getOrderTypeStr(storeOrder)); + detailResponseList.add(storeOrderItemResponse); + } + return detailResponseList; + } + + /** + * 获取订单类型(前端展示) + * @param storeOrder 订单 + * @return String + */ + private String getOrderTypeStr(StoreOrder storeOrder) { + String orderTypeFormat = "[{}订单]{}"; + String orderType = StrUtil.format(orderTypeFormat, "普通", ""); + // 核销 + if (StrUtil.isNotBlank(storeOrder.getVerifyCode())) { + orderType = StrUtil.format(orderTypeFormat, "核销", ""); + } + // 秒杀 + if (ObjectUtil.isNotNull(storeOrder.getSeckillId()) && storeOrder.getSeckillId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "秒杀", ""); + } + // 砍价 + if (ObjectUtil.isNotNull(storeOrder.getBargainId()) && storeOrder.getBargainId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "砍价", ""); + } + // 拼团 + if (ObjectUtil.isNotNull(storeOrder.getCombinationId()) && storeOrder.getCombinationId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (ObjectUtil.isNotNull(storePink)) { + String pinkstatus = ""; + if (storePink.getStatus() == 2) { + pinkstatus = "已完成"; + } else if (storePink.getStatus() == 3) { + pinkstatus = "未完成"; + } else { + pinkstatus = "正在进行中"; + } + orderType = StrUtil.format(orderTypeFormat, "拼团", pinkstatus); + } + } + if (storeOrder.getType().equals(1)) {// 视频订单 + orderType = StrUtil.format(orderTypeFormat, "视频号", ""); + } + return orderType; + } + + /** + * 格式化订单信息,对外输出一致 + * @param storeOrderList List 订单列表 + * + * @since 2020-05-28 + * @return List + */ + private List formatOrder(List storeOrderList) { + List storeOrderItemResponseArrayList = new ArrayList<>(); + if (null == storeOrderList || storeOrderList.size() < 1) { + return storeOrderItemResponseArrayList; + } + //门店id + List storeIdList = storeOrderList.stream().map(StoreOrder::getStoreId).distinct().collect(Collectors.toList()); + //店员id / 核销员id + List clerkIdList = storeOrderList.stream().map(StoreOrder::getClerkId).distinct().collect(Collectors.toList()); + + //订单id集合 + List orderIdList = storeOrderList.stream().map(StoreOrder::getId).distinct().collect(Collectors.toList()); + + //获取门店map + HashMap systemStoreList = systemStoreService.getMapInId(storeIdList); + //获取店员map +// HashMap systemStoreStaffList = systemStoreStaffService.getMapInId(clerkIdList); + HashMap systemStoreStaffList = systemAdminService.getMapInId(clerkIdList); + //获取订单详情map + HashMap> orderInfoList = storeOrderInfoService.getMapInId(orderIdList); + + //根据用户获取信息 + List userIdList = storeOrderList.stream().map(StoreOrder::getUid).distinct().collect(Collectors.toList()); + //订单用户信息 + HashMap userList = userService.getMapListInUid(userIdList); + + //获取推广人id集合 + List spreadPeopleUidList = new ArrayList<>(); + for(Map.Entry entry : userList.entrySet()) { + spreadPeopleUidList.add(entry.getValue().getSpreadUid()); + } + + //推广信息 + HashMap mapListInUid = new HashMap<>(); + if (userIdList.size() > 0 && spreadPeopleUidList.size() > 0) { + //推广人信息 + mapListInUid = userService.getMapListInUid(spreadPeopleUidList); + } + + for (StoreOrder storeOrder : storeOrderList) { + StoreOrderItemResponse storeOrderItemResponse = new StoreOrderItemResponse(); + BeanUtils.copyProperties(storeOrder, storeOrderItemResponse); + String storeName = ""; + if (systemStoreList.containsKey(storeOrder.getStoreId())) { + storeName = systemStoreList.get(storeOrder.getStoreId()).getName(); + } + storeOrderItemResponse.setStoreName(storeName); + + // 添加核销人信息 + String clerkName = ""; + if (systemStoreStaffList.containsKey(storeOrder.getClerkId())) { + clerkName = systemStoreStaffList.get(storeOrder.getClerkId()).getRealName(); + } + storeOrderItemResponse.setProductList(orderInfoList.get(storeOrder.getId())); + storeOrderItemResponse.setTotalNum(storeOrder.getTotalNum()); + + //订单状态 + storeOrderItemResponse.setStatusStr(getStatus(storeOrder)); + storeOrderItemResponse.setStatus(storeOrder.getStatus()); + //支付方式 + storeOrderItemResponse.setPayTypeStr(getPayType(storeOrder.getPayType())); + + //推广人信息 + if (!userList.isEmpty() && null != userList.get(storeOrder.getUid()) && mapListInUid.containsKey(userList.get(storeOrder.getUid()).getSpreadUid())) { + storeOrderItemResponse.getSpreadInfo().setId(mapListInUid.get(userList.get(storeOrder.getUid()).getSpreadUid()).getUid()); + storeOrderItemResponse.getSpreadInfo().setName(mapListInUid.get(userList.get(storeOrder.getUid()).getSpreadUid()).getNickname()); + } + storeOrderItemResponse.setRefundStatus(storeOrder.getRefundStatus()); + + storeOrderItemResponse.setClerkName(clerkName); + + // 添加订单类型信息 + String orderTypeFormat = "[{}订单]{}"; + String orderType = ""; + // 核销 + if (StrUtil.isNotBlank(storeOrder.getVerifyCode())) { + orderType = StrUtil.format(orderTypeFormat, "核销", ""); + } + // 秒杀 + if (ObjectUtil.isNotNull(storeOrder.getSeckillId()) && storeOrder.getSeckillId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "秒杀", ""); + } + // 砍价 + if (ObjectUtil.isNotNull(storeOrder.getBargainId()) && storeOrder.getBargainId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "砍价", ""); + } + // 拼团 + if (ObjectUtil.isNotNull(storeOrder.getPinkId()) && storeOrder.getPinkId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (ObjectUtil.isNotNull(storePink)) { + String pinkstatus = ""; + if (storePink.getStatus() == 2) { + pinkstatus = "已完成"; + } else if (storePink.getStatus() == 3) { + pinkstatus = "未完成"; + } else { + pinkstatus = "正在进行中"; + } + orderType = StrUtil.format(orderTypeFormat, "拼团", pinkstatus); + } + } + if (StrUtil.isBlank(orderType)) { + orderType = StrUtil.format(orderTypeFormat, "普通", ""); + } + storeOrderItemResponse.setOrderType(orderType); + storeOrderItemResponseArrayList.add(storeOrderItemResponse); + } + return storeOrderItemResponseArrayList; + } + + /** + * 累计消费 + * @param userId Integer 用户id + * @return UserBalanceResponse + */ + @Override + public BigDecimal getSumBigDecimal(Integer userId, String date) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("sum(pay_price) as pay_price"). + eq("paid", 1). + eq("is_del", 0); + if (null != userId) { + queryWrapper.eq("uid", userId); + } + if (null != date) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + StoreOrder storeOrder = mapper.selectOne(queryWrapper); + if (null == storeOrder || null == storeOrder.getPayPrice()) { + return BigDecimal.ZERO; + } + return storeOrder.getPayPrice(); + } + + /** + * 统计在指定完成时间区间内且状态为已完成(status=3)的订单支付金额总和 + * @param startTime 开始时间(含) + * @param endTime 结束时间(含) + * @return BigDecimal + */ + @Override + public BigDecimal getCompletedPayPriceByFinishTimeRange(Date startTime, Date endTime) { + if (startTime == null || endTime == null) { + return BigDecimal.ZERO; + } + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("IFNULL(sum(pay_price), 0) as pay_price"); + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", Constants.ORDER_STATUS_INT_COMPLETE); + queryWrapper.eq("is_del", 0); + queryWrapper.between("finish_time", startTime, endTime); + StoreOrder storeOrder = mapper.selectOne(queryWrapper); + if (storeOrder == null || storeOrder.getPayPrice() == null) { + return BigDecimal.ZERO; + } + return storeOrder.getPayPrice(); + } + + /** + * 按开始结束时间分组订单 + * @param date String 时间范围 + * @param lefTime int 截取创建时间长度 + * + * @return HashMap + */ + public List getOrderGroupByDate(String date, int lefTime) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("sum(pay_price) as pay_price", "left(create_time, "+lefTime+") as orderId", "count(id) as id"); + if (StringUtils.isNotBlank(date)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + queryWrapper.groupBy("orderId").orderByAsc("orderId"); + return mapper.selectList(queryWrapper); + } + + /** 退款 + * @param request StoreOrderRefundRequest 退款参数 + * @return boolean + * 这里只处理订单状态 + * 余额支付需要把余额给用户加回去 + * 其余处理放入redis中处理 + */ + @Override + public boolean refund(StoreOrderRefundRequest request) { + StoreOrder storeOrder = getInfoException(request.getOrderNo()); + if (!storeOrder.getPaid()) { + throw new YztException("未支付无法退款"); + } + if (storeOrder.getRefundPrice().add(request.getAmount()).compareTo(storeOrder.getPayPrice()) > 0) { + throw new YztException("退款金额大于支付金额,请修改退款金额"); + } + if (request.getAmount().compareTo(BigDecimal.ZERO) <= 0) { + if (storeOrder.getPayPrice().compareTo(BigDecimal.ZERO) != 0) { + throw new YztException("退款金额不能为0,请修改退款金额"); + } + } + request.setOrderId(storeOrder.getId()); + //用户 + User user = userService.getById(storeOrder.getUid()); + + //退款 + if (storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT) && request.getAmount().compareTo(BigDecimal.ZERO) > 0) { + try { + storeOrderRefundService.refund(request, storeOrder); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("微信申请退款失败!"); + } + } + //修改订单退款状态 + storeOrder.setRefundStatus(3); + storeOrder.setRefundPrice(request.getAmount()); + + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(e -> { + updateById(storeOrder); + if (storeOrder.getPayType().equals(Constants.PAY_TYPE_YUE)) { + //新增日志 + request.setOrderId(storeOrder.getId()); + userBillService.saveRefundBill(request, user); + + // 更新用户金额 + userService.operationNowMoney(user.getUid(), request.getAmount(), user.getNowMoney(), "add"); + + // 退款task + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, storeOrder.getId()); + } + if (storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT) && request.getAmount().compareTo(BigDecimal.ZERO) == 0) { + //新增日志 + userBillService.saveRefundBill(request, user); + + // 退款task + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, storeOrder.getId()); + } + if (storeOrder.getPayType().equals(Constants.PAY_TYPE_ALI_PAY) && request.getAmount().compareTo(BigDecimal.ZERO) == 0) { + //新增日志 + userBillService.saveRefundBill(request, user); + + // 退款task + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_REFUND_BY_USER, storeOrder.getId()); + } + return Boolean.TRUE; + }); + if (!execute) { + storeOrderStatusService.saveRefund(storeOrder.getId(), request.getAmount(), "失败"); + throw new YztException("订单更新失败"); + } + // 退款成功后:使该订单相关的排队失效并重新计算队列;同时将该订单相关的佣金记录标记为失效 + try { + storePinkService.invalidateQueueByOrderId(storeOrder.getOrderId()); + } catch (Exception e) { + logger.error("invalidateQueueByOrderId error for orderNo=" + storeOrder.getOrderId(), e); + } + try { + userBrokerageRecordService.invalidateByOrderId(storeOrder.getOrderId()); + } catch (Exception e) { + logger.error("invalidateByOrderId error for orderNo=" + storeOrder.getOrderId(), e); + } + return execute; + } + + + + /** + * 订单详情(PC) + * @param orderNo 订单编号 + * @return StoreOrderInfoResponse + */ + @Override + public StoreOrderInfoResponse info(String orderNo) { + StoreOrder storeOrder = getInfoException(orderNo); + if (storeOrder.getIsSystemDel()) { + throw new YztException("未找到对应订单信息"); + } + StoreOrderInfoResponse storeOrderInfoResponse = new StoreOrderInfoResponse(); + BeanUtils.copyProperties(storeOrder, storeOrderInfoResponse); + List orderInfos = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + storeOrderInfoResponse.setOrderInfo(orderInfos); + storeOrderInfoResponse.setPayTypeStr(getPayType(storeOrder.getPayType())); + storeOrderInfoResponse.setStatusStr(getStatus(storeOrder)); + storeOrderInfoResponse.setRefundReasonWapImg(storeOrder.getRefundReasonWapImg()); + if (ObjectUtil.isNotNull(storeOrder.getStoreId()) && storeOrder.getStoreId() > 0) { + SystemStore systemStorePram = new SystemStore(); + systemStorePram.setId(storeOrder.getStoreId()); + storeOrderInfoResponse.setSystemStore(systemStoreService.getByCondition(systemStorePram)); + } + // 添加订单类型信息 + storeOrderInfoResponse.setOrderTypeText(getOrderTypeTextStr(storeOrder)); + + //用户信息 + User user = userService.getById(storeOrder.getUid()); + storeOrderInfoResponse.setNikeName(user.getNickname()); + storeOrderInfoResponse.setPhone(user.getPhone()); + + UserBrokerageRecord brokerageRecord = userBrokerageRecordService.getByLinkIdAndLinkType(orderNo, "order"); + if (ObjectUtil.isNotNull(brokerageRecord)) { + User spread = userService.getById(brokerageRecord.getUid()); + storeOrderInfoResponse.setSpreadName(spread.getNickname()); + } + + storeOrderInfoResponse.setProTotalPrice(storeOrder.getTotalPrice().subtract(storeOrder.getTotalPostage())); + + // 手机号脱敏处理 + storeOrderInfoResponse.setUserPhone(YztUtil.maskMobile(storeOrderInfoResponse.getUserPhone())); + storeOrderInfoResponse.setPhone(YztUtil.maskMobile(storeOrderInfoResponse.getPhone())); + return storeOrderInfoResponse; + } + + /** + * 获取订单类型(前端后台展示) + * @param storeOrder 订单 + * @return String 订单类型 + */ + private String getOrderTypeTextStr(StoreOrder storeOrder) { + String orderTypeFormat = "{}订单"; + String orderType = StrUtil.format(orderTypeFormat, "普通"); + // 核销 + if (StrUtil.isNotBlank(storeOrder.getVerifyCode())) { + orderType = StrUtil.format(orderTypeFormat, "核销"); + } + // 秒杀 + if (ObjectUtil.isNotNull(storeOrder.getSeckillId()) && storeOrder.getSeckillId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "秒杀"); + } + // 砍价 + if (ObjectUtil.isNotNull(storeOrder.getBargainId()) && storeOrder.getBargainId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "砍价"); + } + // 拼团 + if (ObjectUtil.isNotNull(storeOrder.getCombinationId()) && storeOrder.getCombinationId() > 0) { + orderType = StrUtil.format(orderTypeFormat, "拼团"); + } + if (storeOrder.getType().equals(1)) {// 视频订单 + orderType = StrUtil.format(orderTypeFormat, "视频号"); + } + return orderType; + } + + /** 发送货物 + * @param request StoreOrderSendRequest 发货参数 + * @return boolean + */ + @Override + public String send(StoreOrderSendRequest request) { + String mianDanResult = ""; + //订单信息 + StoreOrder storeOrder = getInfoException(request.getOrderNo()); + if (storeOrder.getIsDel()) throw new YztException("订单已删除,不能发货!"); + if (storeOrder.getStatus() > 0) throw new YztException("订单已发货请勿重复操作!"); + if (ObjectUtil.isNotNull(storeOrder.getCombinationId()) && storeOrder.getCombinationId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (storePink.getStatus() != 2) throw new YztException("当前订单正在拼团中不能发货!"); + } + request.setId(storeOrder.getId()); + switch (request.getDeliveryType()) { + case "express":// 发货 + mianDanResult = express(request, storeOrder); + break; + case "send":// 送货 + delivery(request, storeOrder); + break; + case "fictitious":// 虚拟 + virtual(request, storeOrder); + break; + default: + throw new YztException("类型错误"); + } + return mianDanResult; + } + + /** + * 订单备注 + * @param orderNo 订单编号 + * @param mark 备注 + * @return Boolean + */ + @Override + public Boolean mark(String orderNo, String mark) { + StoreOrder storeOrder = getInfoException(orderNo); + storeOrder.setRemark(mark); + storeOrder.setUpdateTime(DateUtil.date()); + return updateById(storeOrder); + } + + /** + * 拒绝退款 + * @param orderNo 订单编号 + * @param reason String 原因 + * @return Boolean + */ + @Override + public Boolean refundRefuse(String orderNo, String reason) { + if (StrUtil.isBlank(reason)) { + throw new YztException("请填写拒绝退款原因"); + } + StoreOrder storeOrder = getInfoException(orderNo); + storeOrder.setRefundReason(reason); + storeOrder.setRefundStatus(0); + + User user = userService.getById(storeOrder.getUid()); + + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(e -> { + updateById(storeOrder); + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_REFUND_REFUSE, Constants.ORDER_LOG_MESSAGE_REFUND_REFUSE.replace("{reason}", reason)); + return Boolean.TRUE; + }); + if (execute) { + // 如果是拼团订单要将拼团状态改回去 + if (ObjectUtil.isNotNull(storeOrder) && storeOrder.getPinkId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (storePink.getStatus().equals(3)) { + storePink.setStatus(1); + storePinkService.updateById(storePink); + } + } + } + return execute; + } + + /** + * 查询单条 + * @param storeOrder StoreOrder 订单参数 + * + * @since 2020-05-28 + * @return StoreOrder + */ + @Override + public StoreOrder getInfoByEntity(StoreOrder storeOrder) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.setEntity(storeOrder); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 获取订单快递信息 + * @param orderNo 订单编号 + * @return LogisticsResultVo + */ + @Override + public LogisticsResultVo getLogisticsInfo(String orderNo) { + StoreOrder info = getInfoException(orderNo); + if (info.getType().equals(1)) {// 视频号订单 + Express express = expressService.getByName(info.getDeliveryName()); + if (ObjectUtil.isNotNull(express)) { + info.setDeliveryCode(express.getCode()); + } else { + info.setDeliveryCode(""); + } + } + return logisticService.info(info.getDeliveryId(), null, Optional.ofNullable(info.getDeliveryCode()).orElse(""), info.getUserPhone()); + } + + /** + * 订单 top 查询参数 + * @param status 状态参数 + * @return 订单查询结果 + */ + @Override + public Integer getTopDataUtil(Integer status, Integer userId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + orderUtils.statusApiByWhere(lqw, status); + lqw.eq(StoreOrder::getUid,userId); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 改价 + * @param orderNo 订单编号 + * @param price 修改后的价格 + * @param oldPrice 原支付金额 + */ + private Boolean orderEditPrice(String orderNo, BigDecimal price, BigDecimal oldPrice) { + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(StoreOrder::getPayPrice, price); + luw.set(StoreOrder::getBeforePayPrice, oldPrice); + luw.set(StoreOrder::getIsAlterPrice, 1); + luw.eq(StoreOrder::getOrderId, orderNo); + luw.eq(StoreOrder::getPaid, false); + return update(luw); + } + + /** + * 根据时间参数统计订单销售额 + * + * @param dateLimit 时间区间 + * @param type 类型 + * @return 统计订单信息 + */ + @Override + public StoreOrderStatisticsResponse orderStatisticsByTime(String dateLimit, Integer type) { + StoreOrderStatisticsResponse response = new StoreOrderStatisticsResponse(); + // 根据开始时间和结束时间获取时间差 再根据时间差获取上一个时间段 查询当前和上一个时间段的数据 进行比较且返回 + DateLimitUtilVo dateRange = YztDateUtil.getDateLimit(dateLimit); + String dateStartD = dateRange.getStartTime(); + String dateEndD = dateRange.getEndTime(); + int days = YztDateUtil.daysBetween( + YztDateUtil.strToDate(dateStartD,Constants.DATE_FORMAT_DATE), + YztDateUtil.strToDate(dateEndD,Constants.DATE_FORMAT_DATE) + ); + // 同时间区间的上一个时间起点 + String perDateStart = YztDateUtil.addDay( + YztDateUtil.strToDate(dateStartD,Constants.DATE_FORMAT_DATE), -days, Constants.DATE_FORMAT_START); + // 当前时间区间 + String dateStart = YztDateUtil.addDay( + YztDateUtil.strToDate(dateStartD,Constants.DATE_FORMAT_DATE),0,Constants.DATE_FORMAT_START); + String dateEnd = YztDateUtil.addDay( + YztDateUtil.strToDate(dateEndD,Constants.DATE_FORMAT_DATE),0,Constants.DATE_FORMAT_END); + + // 上一个时间段查询 + List orderPerList = getOrderPayedByDateLimit(perDateStart,dateStart); + + // 当前时间段 + List orderCurrentList = getOrderPayedByDateLimit(dateStart, dateEnd); + double increasePrice = 0; + if (type == 1) { + double perSumPrice = orderPerList.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum(); + double currentSumPrice = orderCurrentList.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum(); + + response.setChart(mapper.getOrderStatisticsPriceDetail(new StoreDateRangeSqlPram(dateStart,dateEnd))); + response.setTime(BigDecimal.valueOf(currentSumPrice).setScale(2,BigDecimal.ROUND_HALF_UP)); + // 当前营业额和上一个同比营业额增长区间 + increasePrice = currentSumPrice - perSumPrice; + if (increasePrice <= 0) response.setGrowthRate(0); + else if (perSumPrice == 0) response.setGrowthRate((int) increasePrice * 100); + else response.setGrowthRate((int)((increasePrice * perSumPrice) * 100)); + }else if (type ==2) { + response.setChart(mapper.getOrderStatisticsOrderCountDetail(new StoreDateRangeSqlPram(dateStart,dateEnd))); + response.setTime(BigDecimal.valueOf(orderCurrentList.size())); + increasePrice = orderCurrentList.size() - orderPerList.size(); + if (increasePrice <= 0) response.setGrowthRate(0); + else if (orderPerList.size() == 0) response.setGrowthRate((int) increasePrice); + else response.setGrowthRate((int)((increasePrice / orderPerList.size()) * 100)); + } + response.setIncreaseTime(increasePrice+""); + response.setIncreaseTimeStatus(increasePrice >= 0 ? 1:2); + return response; + } + + /** + * 获取用户当天的秒杀数量 + * + * @param uid 用户uid + * @param seckillId 秒杀商品id + * @return 用户当天的秒杀商品订单数量 + */ + @Override + public List getUserCurrentDaySecKillOrders(Integer uid, Integer seckillId) { + String dayStart = YztDateUtil.nowDateTime(Constants.DATE_FORMAT_START); + String dayEnd = YztDateUtil.nowDateTime(Constants.DATE_FORMAT_END); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getUid, uid); + lqw.eq(StoreOrder::getSeckillId, seckillId); + lqw.between(StoreOrder::getCreateTime, dayStart, dayEnd); + lqw.eq(StoreOrder::getIsDel, false); + return mapper.selectList(lqw); + } + + /** + * 获取用户当前的砍价订单 + * @param uid 用户uid + * @return 用户当前的砍价订单 + */ + @Override + public List getUserCurrentBargainOrders(Integer uid, Integer bargainId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getUid, uid); + lqw.eq(StoreOrder::getBargainId, bargainId); + lqw.eq(StoreOrder::getIsDel, false); + return mapper.selectList(lqw); + } + + /** + * 获取用户当前的拼团订单 + * @param uid 用户uid + * @return 用户当前的拼团订单 + */ + @Override + public List getUserCurrentCombinationOrders(Integer uid, Integer combinationId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getUid, uid); + lqw.eq(StoreOrder::getCombinationId, combinationId); + lqw.eq(StoreOrder::getIsDel, false); + return mapper.selectList(lqw); + } + + @Override + public StoreOrder getByOderId(String orderId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getOrderId, orderId); + return mapper.selectOne(lqw); + } + + /** + * 获取面单默认配置信息 + * @return ExpressSheetVo + */ + @Override + public ExpressSheetVo getDeliveryInfo() { + return systemConfigService.getDeliveryInfo(); + } + + /** + * 更新支付结果 + * @param orderNo 订单编号 + * @return Boolean + */ + @Override + public Boolean updatePaid(String orderNo) { + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.set(StoreOrder::getPaid, true); + lqw.set(StoreOrder::getPayTime, YztDateUtil.nowDateTime()); + lqw.eq(StoreOrder::getOrderId, orderNo); + lqw.eq(StoreOrder::getPaid,false); + return update(lqw); + } + + /** + * 跟据订单号列表获取订单列表Map + * @param orderNoList 订单号列表 + * @return Map + */ + @Override + public Map getMapInOrderNo(List orderNoList) { + Map map = CollUtil.newHashMap(); + LambdaUpdateWrapper lqw = new LambdaUpdateWrapper<>(); + lqw.in(StoreOrder::getOrderId, orderNoList); + List orderList = mapper.selectList(lqw); + orderList.forEach(order -> { + map.put(order.getOrderId(), order); + }); + return map; + } + + /** + * 获取推广订单总金额 + * @param orderNoList 订单编号列表 + * @return BigDecimal + */ + @Override + public BigDecimal getSpreadOrderTotalPriceByOrderList(List orderNoList) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreOrder::getPayPrice); + lqw.in(StoreOrder::getOrderId, orderNoList); + List orderList = mapper.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取所有收货订单id集合 + * @return List + */ + @Override + public List findIdAndUidListByReceipt() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreOrder::getId, StoreOrder::getUid); + lqw.eq(StoreOrder::getStatus, 2); + lqw.eq(StoreOrder::getRefundStatus, 0); + lqw.eq(StoreOrder::getIsDel, false); + List orderList = mapper.selectList(lqw); + if (CollUtil.isEmpty(orderList)) { + return CollUtil.newArrayList(); + } + return orderList; + } + + /** + * + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List findPaidListByUid(Integer userId, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreOrder::getUid, userId); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.lt(StoreOrder::getRefundStatus, 2); + lqw.orderByDesc(StoreOrder::getId); + return mapper.selectList(lqw); + } + + /** + * 订单改价 + * @param request 改价请求对象 + * @return 改价结果 + */ + @Override + public Boolean updatePrice(StoreOrderUpdatePriceRequest request) { + StoreOrder existOrder = getInfoException(request.getOrderNo()); + // 订单已支付 + if (existOrder.getPaid()) { + throw new YztException(StrUtil.format("订单号为 {} 的订单已支付", existOrder.getOrderId())); + } + if (existOrder.getIsAlterPrice()) { + throw new YztException("系统只支持一次改价"); + } + // 修改价格和原来价格相同 + if (existOrder.getPayPrice().compareTo(request.getPayPrice()) ==0) { + throw new YztException(StrUtil.format("修改价格不能和原支付价格相同 原价 {} 修改价 {}", existOrder.getPayPrice(), request.getPayPrice())); + } + String oldPrice = existOrder.getPayPrice().toString(); + + Boolean execute = transactionTemplate.execute(e -> { + // 修改订单价格 + orderEditPrice(existOrder.getOrderId(), request.getPayPrice(), existOrder.getPayPrice()); + // 订单修改状态操作 + storeOrderStatusService.createLog(existOrder.getId(), Constants.ORDER_LOG_EDIT, + Constants.RESULT_ORDER_EDIT_PRICE_LOGS.replace("${orderPrice}", oldPrice) + .replace("${price}", request.getPayPrice().toString())); + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException(Constants.RESULT_ORDER_EDIT_PRICE_SUCCESS + .replace("${orderNo}", existOrder.getOrderId()).replace("${price}", request.getPayPrice().toString())); + } + // 发送改价短信提醒 + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.MODIFY_ORDER_PRICE_MARK); + if (notification.getIsSms().equals(1)) { + User user = userService.getById(existOrder.getUid()); + if (StrUtil.isNotBlank(user.getPhone())) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + // 发送改价短信提醒 + smsService.sendOrderEditPriceNotice(user.getPhone(), existOrder.getOrderId(), request.getPayPrice(), Integer.valueOf(smsTemplate.getTempId())); + } + } + + return execute; + } + + /** + * 获取订单总数量 + * @param uid 用户uid + * @return Integer + */ + @Override + public Integer getOrderCountByUid(Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.eq(StoreOrder::getUid, uid); + lqw.lt(StoreOrder::getRefundStatus, 2); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 获取用户总消费金额 + * @param userId 用户uid + * @return BigDecimal + */ + @Override + public BigDecimal getSumPayPriceByUid(Integer userId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreOrder::getPayPrice); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.eq(StoreOrder::getUid, userId); + lqw.lt(StoreOrder::getRefundStatus, 2); + List orderList = mapper.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取用户总消费金额 + * @param uid 用户uid + * @return BigDecimal + */ + public BigDecimal getTotalPaidAmountByUid(Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreOrder::getPayPrice); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.eq(StoreOrder::getUid, uid); + lqw.lt(StoreOrder::getType, 0); + List orderList = mapper.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 用于查询用户所有下级的订单金额总计 + * + * @param uids 下级用户ID列表 + * @return 总支付金额,永不为 null + */ + public BigDecimal getTotalPaidAmountByUids(List uids) { + if (uids == null || uids.isEmpty()) { + return BigDecimal.ZERO; + } + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreOrder::getPayPrice); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.in(StoreOrder::getUid, uids); + lqw.lt(StoreOrder::getType, 0); + List orderList = mapper.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取订单数量(时间) + * @param uid 用户uid + * @return Integer + */ + @Override + public Integer getOrderCountByUidAndDate(Integer uid, String date) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.eq(StoreOrder::getUid, uid); + lqw.lt(StoreOrder::getRefundStatus, 2); + if (StrUtil.isNotBlank(date)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + lqw.between(StoreOrder::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + return mapper.selectCount(lqw).intValue(); + } + + /** + * 获取用户消费金额(时间) + * @param userId 用户uid + * @return BigDecimal + */ + @Override + public BigDecimal getSumPayPriceByUidAndDate(Integer userId, String date) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreOrder::getPayPrice); + lqw.eq(StoreOrder::getPaid, true); + lqw.eq(StoreOrder::getIsDel, false); + lqw.eq(StoreOrder::getUid, userId); + lqw.lt(StoreOrder::getRefundStatus, 2); + if (StrUtil.isNotBlank(date)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + lqw.between(StoreOrder::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + List orderList = mapper.selectList(lqw); + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取砍价订单 + * @param bargainId 砍价商品id + * @param bargainUserId 用户砍价活动id + * @return StoreOrder + */ + @Override + public StoreOrder getByBargainOrder(Integer bargainId, Integer bargainUserId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getBargainId, bargainId); + lqw.eq(StoreOrder::getBargainUserId, bargainUserId); + lqw.orderByDesc(StoreOrder::getId); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 获取订单状态数量 + * @return StoreOrderCountItemResponse + */ + @Override + public StoreOrderCountItemResponse getOrderStatusNum(String dateLimit, Integer type, String orderNo) { + StoreOrderCountItemResponse response = new StoreOrderCountItemResponse(); + if (type.equals(3)) { + type = null; + } + // 全部订单 + response.setAll(getCount(dateLimit, Constants.ORDER_STATUS_ALL, type, orderNo)); + // 未支付订单 + response.setUnPaid(getCount(dateLimit, Constants.ORDER_STATUS_UNPAID, type, orderNo)); + // 未发货订单 + response.setNotShipped(getCount(dateLimit, Constants.ORDER_STATUS_NOT_SHIPPED, type, orderNo)); + // 待收货订单 + response.setSpike(getCount(dateLimit, Constants.ORDER_STATUS_SPIKE, type, orderNo)); + // 待评价订单 + response.setBargain(getCount(dateLimit, Constants.ORDER_STATUS_BARGAIN, type, orderNo)); + // 交易完成订单 + response.setComplete(getCount(dateLimit, Constants.ORDER_STATUS_COMPLETE, type, orderNo)); + // 待核销订单 + response.setToBeWrittenOff(getCount(dateLimit, Constants.ORDER_STATUS_TOBE_WRITTEN_OFF, type, orderNo)); + // 退款中订单 + response.setRefunding(getCount(dateLimit, Constants.ORDER_STATUS_REFUNDING, type, orderNo)); + // 已退款订单 + response.setRefunded(getCount(dateLimit, Constants.ORDER_STATUS_REFUNDED, type, orderNo)); + // 已删除订单 + response.setDeleted(getCount(dateLimit, Constants.ORDER_STATUS_DELETED, type, orderNo)); + return response; + } + + /** + * 获取订单统计数据 + * @param dateLimit 时间端 + * @return StoreOrderTopItemResponse + */ + @Override + public StoreOrderTopItemResponse getOrderData(String dateLimit) { + StoreOrderTopItemResponse itemResponse = new StoreOrderTopItemResponse(); + // 订单数量 + itemResponse.setCount(getCount(dateLimit, Constants.ORDER_STATUS_ALL)); + // 订单金额 + itemResponse.setAmount(getAmount(dateLimit, "")); + // 微信支付金额 + itemResponse.setWeChatAmount(getAmount(dateLimit, Constants.PAY_TYPE_WE_CHAT)); + // 余额支付金额 + itemResponse.setYueAmount(getAmount(dateLimit, Constants.PAY_TYPE_YUE)); + return itemResponse; + } + + /** + * 订单删除 + * @param orderNo 订单编号 + * @return Boolean + */ + @Override + public Boolean delete(String orderNo) { + StoreOrder storeOrder = getInfoException(orderNo); + if (!storeOrder.getIsDel()) { + throw new YztException("您选择的的订单存在用户未删除的订单,无法删除用户未删除的订单!"); + } + if (storeOrder.getIsSystemDel()) { + throw new YztException("此订单已经被删除了!"); + } + storeOrder.setIsSystemDel(true); + storeOrder.setUpdateTime(DateUtil.date()); + return updateById(storeOrder); + } + + /** + * 通过日期获取商品交易件数 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getOrderProductNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(total_num), 0) as total_num"); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getTotalNum(); + } + + /** + * 通过日期获取商品交易成功件数 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getOrderSuccessProductNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(total_num), 0) as total_num"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getTotalNum(); + } + + /** + * 通过日期获取订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getOrderNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("id"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 通过日期获取支付订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getPayOrderNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("id"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 通过日期获取支付订单金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + @Override + public BigDecimal getPayOrderAmountByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(pay_price), 0) as pay_price"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getPayPrice(); + } + + /** + * 通过日期获取支付订单金额 + * @param startDate 日期 + * @param endDate 日期 + * @return BigDecimal + */ + @Override + public BigDecimal getPayOrderAmountByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(pay_price), 0) as pay_price"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') between {0} and {1}", startDate, endDate); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getPayPrice(); + } + + /** + * 通过日期获取余额支付订单支付金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + @Override + public BigDecimal getYuePayOrderAmountByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(pay_price), 0) as pay_price"); + wrapper.eq("paid", 1); + wrapper.eq("pay_type", "yue"); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getPayPrice(); + } + + /** + * 获取累计消费金额 + * @return BigDecimal + */ + @Override + public BigDecimal getTotalPrice() { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(pay_price), 0) as pay_price"); + wrapper.eq("paid", 1); + StoreOrder storeOrder = mapper.selectOne(wrapper); + return storeOrder.getPayPrice(); + } + + /** + * 根据日期获取下单用户数量 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getOrderUserNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + wrapper.groupBy("uid"); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return 0; + } + return orderList.size(); + } + + /** + * 根据日期获取下单用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + @Override + public Integer getOrderUserNumByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = new QueryWrapper<>(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.apply("date_format(create_time, '%Y-%m-%d') between {0} and {1}", startDate, endDate); + wrapper.groupBy("uid"); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return 0; + } + return orderList.size(); + } + + /** + * 根据日期获取成交用户数量 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getOrderPayUserNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + wrapper.groupBy("uid"); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return 0; + } + return orderList.size(); + } + + /** + * 根据日期获取成交用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + @Override + public Integer getOrderPayUserNumByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = new QueryWrapper<>(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') between {0} and {1}", startDate, endDate); + wrapper.groupBy("uid"); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return 0; + } + return orderList.size(); + } + + /** + * 根据用户uid列表获取成交用户数量 + * @param uidList 用户列表 + * @return Integer + */ + @Override + public Integer getOrderPayUserNumByUidList(List uidList) { + QueryWrapper wrapper = new QueryWrapper<>(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.in("uid", uidList); + wrapper.groupBy("uid"); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return 0; + } + return orderList.size(); + } + + /** + * 根据用户uid列表获取支付金额 + * @param uidList 用户列表 + * @return BigDecimal + */ + @Override + public BigDecimal getPayOrderAmountByUidList(List uidList) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("IFNULL(sum(pay_price), 0.00) as pay_price"); +// wrapper.select("ifnull(if(sum(pay_price) = 0.00, 0, sum(pay_price)), 0) as pay_price"); + wrapper.eq("paid", 1); + wrapper.in("uid", uidList); + List orderList = mapper.selectList(wrapper); + if (CollUtil.isEmpty(orderList)) { + return BigDecimal.ZERO; + } + return orderList.stream().map(StoreOrder::getPayPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取待发货订单数量 + * @return Integer + */ + @Override + public Integer getNotShippingNum() { + return getCount("", Constants.ORDER_STATUS_NOT_SHIPPED); + } + + /** + * 获取退款中订单数量 + */ + @Override + public Integer getRefundingNum() { + return getCount("", Constants.ORDER_STATUS_REFUNDING); + } + + /** + * 获取待核销订单数量 + */ + @Override + public Integer getNotWriteOffNum() { + return getCount("", Constants.ORDER_STATUS_TOBE_WRITTEN_OFF); + } + + /** + * 获取佣金相关数据 + * @param uid 用户uid + * @param spreadId 推广人uid + */ + @Override + public OrderBrokerageData getBrokerageData(Integer uid, Integer spreadId) { + return mapper.getBrokerageData(uid, spreadId); + } + + /** + * 获取待收货订单 + * @param sendTime 发货时间 + * @return List + */ + @Override + public List findAwaitTakeDeliveryOrderList(String sendTime) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getStatus, Constants.ORDER_STATUS_INT_SPIKE); + lqw.ne(StoreOrder::getRefundStatus, 3); + lqw.le(StoreOrder::getUpdateTime, sendTime); + lqw.eq(StoreOrder::getIsDel, false); + return mapper.selectList(lqw); + } + + /** + * 更改订单运单号 + */ + @Override + public Boolean updateTrackingNumber(StoreOrderSendRequest request) { + StoreOrder storeOrder = getInfoException(request.getOrderNo()); + if (storeOrder.getIsDel()) throw new YztException("订单已删除,不能修改运单号!"); + if (storeOrder.getStatus() != 1) throw new YztException("待收货订单才能修改运单号"); + + switch (storeOrder.getDeliveryType()) { + case "express":// 发货 + express(request, storeOrder); + break; + case "send":// 送货 + delivery(request, storeOrder); + break; + case "fictitious":// 虚拟 + virtual(request, storeOrder); + break; + default: + throw new YztException("类型错误"); + } + + storeOrder.setUpdateTime(DateUtil.date()); + return transactionTemplate.execute(e -> { + updateById(storeOrder); + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_EXPRESS, StrUtil.format("变更运单号,快递公司:{},运单号:{}", storeOrder.getDeliveryName(), storeOrder.getDeliveryId())); + return Boolean.TRUE; + }); + } + + + + /** + * 一号通商家寄件 + * @param request 订单发货请求对象 + * @param storeOrder 主订单请求对象 + */ + @Override + public void expressForOnePassShipment(StoreOrderSendRequest request, StoreOrder storeOrder) { + // 校验快递发货参数 +// validateExpressSend(request); + OnePassShipmentCreateOrderRequest shipment = request.getShipment(); + shipment.setManName(storeOrder.getRealName()); + shipment.setPhone(storeOrder.getUserPhone()); + shipment.setAddress(storeOrder.getUserAddress()); + + if(ObjectUtil.isNotNull(shipment.getKuaidicom()) && + (shipment.getKuaidicom().equalsIgnoreCase("jd") || shipment.getKuaidicom().equalsIgnoreCase("yuantong"))){ + List listByOrderNo = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + shipment.setCargo(listByOrderNo.get(0).getProductName().substring(0,10)); + } + JSONObject jsonObject = onePassService.shipmentCreateOrder(shipment); + // 任务订单号(需要在系统回调中使用 + String orderId = jsonObject.getString("order_id"); + // 任务ID(需要在系统回调中使用) + String taskId = jsonObject.getString("task_id"); + // 物流单号 + String kuaidinum = jsonObject.getString("kuaidinum"); + + logger.info("一号通-商家寄件结果:{}", jsonObject); + storeOrder.setShipmentTaskId(taskId); + storeOrder.setShipmentOrderId(orderId); + storeOrder.setShipmentPic(kuaidinum); + storeOrder.setDeliveryCode(request.getShipment().getKuaidicom()); + storeOrder.setDeliveryName(request.getShipment().getSendRealName()); + // 更新商家发货结果到数据库,再根据任务订单id在回调中更新最终的发货状态 + storeOrder.setUpdateTime(DateUtil.date()); + updateById(storeOrder); + } + + /** + * 商家寄件 取件 回调方法 + * @param jsonObject 回调数据 + */ + @Override + public void expressForOnePassShipmentTakeCallBack(JSONObject jsonObject){ + String orderId = jsonObject.getString("id"); + StoreOrder currentStoreOrder = getByOderId(orderId); + currentStoreOrder.setStatus(1); + currentStoreOrder.setDeliveryType(Constants.ORDER_LOG_SHIPMENT); + + String message = Constants.ORDER_LOG_MESSAGE_EXPRESS.replace("{deliveryName}", currentStoreOrder.getShipmentNum()).replace("{deliveryCode}", currentStoreOrder.getShipmentNum()); + + Boolean execute = transactionTemplate.execute(i -> { + currentStoreOrder.setUpdateTime(DateUtil.date()); + updateById(currentStoreOrder); + //订单记录增加 + storeOrderStatusService.createLog(currentStoreOrder.getId(), Constants.ORDER_LOG_SHIPMENT, message); + return Boolean.TRUE; + }); + + if (!execute) throw new YztException("一号通-商家寄件 发货失败!"); + + sendGoodsNotify(currentStoreOrder); + } + + /** + * 一号通商家寄件 取消寄件回调 + * + * @param jsonObject 回调结果 + */ + @Override + public void expressForOnePassShipmentCancelCallBack(JSONObject jsonObject) { + String orderId = jsonObject.getString("id"); + StoreOrder currentStoreOrder = getByOderId(orderId); + currentStoreOrder.setStatus(0); + currentStoreOrder.setDeliveryType(""); + currentStoreOrder.setShipmentPic(""); + currentStoreOrder.setShipmentOrderId(""); + currentStoreOrder.setShipmentNum(""); + currentStoreOrder.setShipmentTaskId(""); + + Boolean execute = transactionTemplate.execute(i -> { + currentStoreOrder.setUpdateTime(DateUtil.date()); + updateById(currentStoreOrder); + //订单记录增加 + storeOrderStatusService.createLog(currentStoreOrder.getId(), Constants.ORDER_LOG_SHIPMENT, "一号通 商家寄件 取消寄件"); + return Boolean.TRUE; + }); + + if (!execute) throw new YztException("一号通-商家寄件 取消失败!"); + } + + @Override + public List getVirtualRemarkVoByIds(List ids) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getStatus, Constants.ORDER_STATUS_INT_COMPLETE); + lqw.eq(StoreOrder::getRefundStatus, 0); + lqw.eq(StoreOrder::getIsDel, false); + lqw.in(StoreOrder::getId,ids); + List storeOrders = mapper.selectList(lqw); + List allVos = storeOrders.stream().map(e -> { + List vos = new ArrayList<>(); + if (StrUtil.isNotBlank(e.getVirtualRemark())) { + try { + vos = JSONObject.parseObject(e.getVirtualRemark(), new TypeReference>() { + }); + } catch (Exception ex) { + throw new YztException("解析 virtualRemark 失败, orderId: " + e.getId() + ex); + } + } + return vos; + }).flatMap(List::stream).collect(Collectors.toList()); + for (int i = 0; i < allVos.size(); i++) { + allVos.get(i).setId(i+1); + allVos.get(i).setSku(storeProductAttrValueService.getById(allVos.get(i).getSkuId()).getSuk()); + } + return allVos; + } + + ///////////////////////////////////////////////////////////////////////////////////////////////////// 以下为自定义方法 + + /** + * 根据时间参数获取有效订单 + * @return 有效订单列表 + */ + private List getOrderPayedByDateLimit(String startTime, String endTime) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getIsDel, false).eq(StoreOrder::getPaid, true).eq(StoreOrder::getRefundStatus,0) + .between(StoreOrder::getCreateTime, startTime, endTime); + return mapper.selectList(lqw); + } + + private StoreOrder getInfoException(String orderNo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreOrder::getOrderId, orderNo); + StoreOrder storeOrder = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("没有找到订单信息"); + } + return storeOrder; + } + + /** 快递 + * @param request StoreOrderSendRequest 发货参数 + * @param storeOrder StoreOrder 订单信息 + */ + private String express(StoreOrderSendRequest request, StoreOrder storeOrder) { + String mianDianResult = ""; + //快递公司信息 + Express express = expressService.getByCode(request.getExpressCode()); + if (request.getExpressRecordType().equals("1")) { // 正常发货 + validateExpressSend(request); // 校验快递发货参数 + deliverGoods(request, storeOrder); + } + if (request.getExpressRecordType().equals("2")) { // 电子面单 + request.setExpressName(express.getName()); + validateExpressSend(request); // 校验快递发货参数 + mianDianResult = expressDump(request, storeOrder, express); + } + if(request.getExpressRecordType().equals("3")){ // 一号通-商家发货 + expressForOnePassShipment(request, storeOrder); + } + + storeOrder.setDeliveryCode(express.getCode()); + storeOrder.setDeliveryName(express.getName()); + storeOrder.setStatus(1); + storeOrder.setDeliveryType("express"); + storeOrder.setExpressRecordType(request.getExpressRecordType()); + + String message = Constants.ORDER_LOG_MESSAGE_EXPRESS.replace("{deliveryName}", express.getName()).replace("{deliveryCode}", storeOrder.getDeliveryId()); + + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(i -> { + updateById(storeOrder); + //订单记录增加 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_EXPRESS, message); + return Boolean.TRUE; + }); + + if (!execute) throw new YztException("快递发货失败!"); + + sendGoodsNotify(storeOrder); + + return mianDianResult; + } + + /** + * 发货通知 + * @param storeOrder 订单 + */ + private void sendGoodsNotify(StoreOrder storeOrder) { + User user = userService.getById(storeOrder.getUid()); + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.DELIVER_GOODS_MARK); + if (notification.getIsSms().equals(1)) { + // 发货短信提醒 + if (StrUtil.isNotBlank(user.getPhone())) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + String proName = ""; + List voList = storeOrderInfoService.getOrderListByOrderId(storeOrder.getId()); + proName = voList.get(0).getInfo().getProductName(); + if (voList.size() > 1) { + proName = proName.concat("等"); + } + smsService.sendOrderDeliverNotice(user.getPhone(), user.getNickname(), proName, storeOrder.getOrderId(), Integer.valueOf(smsTemplate.getTempId())); + } + } + + // 发送消息通知 + pushMessageOrder(storeOrder, user, notification); + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageOrder(StoreOrder storeOrder, User user, SystemNotification notification) { + if (storeOrder.getIsChannel().equals(2)) { + return; + } + if (!storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT)) { + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + + // 公众号 + if (storeOrder.getIsChannel().equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单发货提醒"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", DateUtil.now()); + temMap.put("keyword3", storeOrder.getDeliveryName()); + temMap.put("keyword4", storeOrder.getDeliveryId()); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); + templateMessageService.pushTemplateMessage(notification.getWechatId(), temMap, userToken.getToken()); + return; + } else if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + // 注释部分为丰享汇小程序 +// temMap.put("character_string1", storeOrder.getOrderId()); +// temMap.put("name3", storeOrder.getDeliveryName()); +// temMap.put("character_string4", storeOrder.getDeliveryId()); +// temMap.put("thing7", "您的订单已发货"); + // 放开部分为一码秦川小程序 + temMap.put("character_string1", storeOrder.getOrderId()); + temMap.put("name6", storeOrder.getDeliveryName()); + temMap.put("character_string7", storeOrder.getDeliveryId()); + temMap.put("thing11", "您的订单已发货"); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), temMap, userToken.getToken()); + } + } + + /** + * 电子面单 + * @param request + * @param storeOrder + * @param express + */ + private String expressDump(StoreOrderSendRequest request, StoreOrder storeOrder, Express express) { + String configExportOpen = systemConfigService.getValueByKeyException("config_export_open"); + if (!configExportOpen.equals("1")) {// 电子面单未开启 + throw new YztException("请先开启电子面单"); + } + MyRecord record = new MyRecord(); + record.set("com", express.getCode());// 快递公司编码 + record.set("to_name", storeOrder.getRealName());// 收件人 + record.set("to_tel", storeOrder.getUserPhone());// 收件人电话 + record.set("to_addr", storeOrder.getUserAddress());// 收件人详细地址 + record.set("from_name", request.getToName());// 寄件人 + record.set("from_tel", request.getToTel());// 寄件人电话 + record.set("from_addr", request.getToAddr());// 寄件人详细地址 + record.set("temp_id", request.getExpressTempId());// 电子面单模板ID + String siid = systemConfigService.getValueByKeyException("config_export_siid"); + record.set("siid", "");// 云打印机编号 + record.set("print_type", "IMAGE");// 打印图片 + record.set("count", storeOrder.getTotalNum());// 商品数量 + + //获取购买商品名称 + List orderIdList = new ArrayList<>(); + orderIdList.add(storeOrder.getId()); + HashMap> orderInfoMap = storeOrderInfoService.getMapInId(orderIdList); + if (orderInfoMap.isEmpty() || !orderInfoMap.containsKey(storeOrder.getId())) { + throw new YztException("没有找到购买的商品信息"); + } + List productNameList = new ArrayList<>(); + for (StoreOrderInfoOldVo storeOrderInfoVo : orderInfoMap.get(storeOrder.getId())) { + productNameList.add(storeOrderInfoVo.getInfo().getProductName()); + } + + record.set("cargo", String.join(",", productNameList));// 物品名称 + if (express.getPartnerId()) { + record.set("partner_id", express.getAccount());// 电子面单月结账号(部分快递公司必选) + } + if (express.getPartnerKey()) { + record.set("partner_key", express.getPassword());// 电子面单密码(部分快递公司必选) + } + if (express.getNet()) { + record.set("net", express.getNetName());// 收件网点名称(部分快递公司必选) + } + + MyRecord myRecord = onePassService.expressDump(record); + logger.info("电子面单的返回数据:{}", JSONObject.toJSONString(myRecord)); + storeOrder.setDeliveryId(myRecord.getStr("kuaidinum")); + return myRecord.getStr("label"); + } + + /** + * 正常发货 + */ + private void deliverGoods(StoreOrderSendRequest request, StoreOrder storeOrder) { + storeOrder.setDeliveryId(request.getExpressNumber()); + } + + /** + * 校验快递发货参数 + */ + private void validateExpressSend(StoreOrderSendRequest request) { + if (request.getExpressRecordType().equals("1")) { + if (StrUtil.isBlank(request.getExpressNumber())) throw new YztException("请填写快递单号"); + return; + } + if (StrUtil.isBlank(request.getExpressCode())) throw new YztException("请选择快递公司"); + if (StrUtil.isBlank(request.getExpressRecordType())) throw new YztException("请选择发货记录类型"); + if (StrUtil.isBlank(request.getExpressTempId())) throw new YztException("请选择电子面单"); + if (StrUtil.isBlank(request.getToName())) throw new YztException("请填写寄件人姓名"); + if (StrUtil.isBlank(request.getToTel())) throw new YztException("请填写寄件人电话"); + if (StrUtil.isBlank(request.getToAddr())) throw new YztException("请填写寄件人地址"); + } + + /** 送货上门 + * @param request StoreOrderSendRequest 发货参数 + * @param storeOrder StoreOrder 订单信息 + */ + private void delivery(StoreOrderSendRequest request, StoreOrder storeOrder) { + if (StrUtil.isBlank(request.getDeliveryName())) throw new YztException("请输入送货人姓名"); + if (StrUtil.isBlank(request.getDeliveryTel())) throw new YztException("请输入送货人电话号码"); + ValidateFormUtil.isPhone(request.getDeliveryTel(), "送货人联系方式"); + + //送货信息 + storeOrder.setDeliveryName(request.getDeliveryName()); + storeOrder.setDeliveryId(request.getDeliveryTel()); + storeOrder.setStatus(1); + storeOrder.setDeliveryType("send"); + storeOrder.setExpressRecordType(request.getExpressRecordType()); + + //获取购买商品名称 + List orderIdList = new ArrayList<>(); + orderIdList.add(storeOrder.getId()); + HashMap> orderInfoMap = storeOrderInfoService.getMapInId(orderIdList); + if (orderInfoMap.isEmpty() || !orderInfoMap.containsKey(storeOrder.getId())) { + throw new YztException("没有找到购买的商品信息"); + } + List productNameList = new ArrayList<>(); + for (StoreOrderInfoOldVo storeOrderInfoVo : orderInfoMap.get(storeOrder.getId())) { + productNameList.add(storeOrderInfoVo.getInfo().getProductName()); + } + + String message = Constants.ORDER_LOG_MESSAGE_DELIVERY.replace("{deliveryName}", request.getDeliveryName()).replace("{deliveryCode}", request.getDeliveryTel()); + + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(i -> { + // 更新订单 + updateById(storeOrder); + // 订单记录增加 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_DELIVERY, message); + return Boolean.TRUE; + }); + if (!execute) throw new YztException("订单更新送货失败"); + + User user = userService.getById(storeOrder.getUid()); + // 发送消息通知 + pushMessageDeliveryOrder(storeOrder, user, request, productNameList); + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageDeliveryOrder(StoreOrder storeOrder, User user, StoreOrderSendRequest request, List productNameList) { + if (storeOrder.getIsChannel().equals(2)) { + return; + } + if (!storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT)) { + return; + } + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.FULFILLMENT_ORDER_MARK); + UserToken userToken; + HashMap map = new HashMap<>(); + String proName = ""; + if (CollUtil.isNotEmpty(productNameList)) { + proName = StringUtils.join(productNameList, "|"); + } + // 公众号 + if (storeOrder.getIsChannel().equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + map.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "订单配送提醒"); + map.put("keyword1", storeOrder.getOrderId()); + map.put("keyword2", YztDateUtil.dateToStr(storeOrder.getCreateTime(), Constants.DATE_FORMAT)); + map.put("keyword3", storeOrder.getUserAddress()); + map.put("keyword4", request.getDeliveryName()); + map.put("keyword5", request.getDeliveryTel()); + map.put(Constants.WE_CHAT_TEMP_KEY_END, "欢迎再次购买!"); + // 发送微信模板消息 + templateMessageService.pushTemplateMessage(notification.getWechatId(), map, userToken.getToken()); + } else if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + + if (proName.length() > 20) { + proName = proName.substring(0, 15) + "***"; + } +// map.put("thing8", proName); +// map.put("character_string1", storeOrder.getOrderId()); +// map.put("name4", request.getDeliveryName()); +// map.put("phone_number10", request.getDeliveryTel()); + map.put("thing8", proName); + map.put("character_string1", storeOrder.getOrderId()); + map.put("name4", request.getDeliveryName()); + map.put("phone_number10", request.getDeliveryTel()); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), map, userToken.getToken()); + } + } + + /** 虚拟 + * @param request StoreOrderSendRequest 发货参数 + * @param storeOrder StoreOrder 订单信息 + */ + private void virtual(StoreOrderSendRequest request, StoreOrder storeOrder) { + //快递信息 + storeOrder.setDeliveryType(request.getDeliveryType()); + storeOrder.setStatus(1); + storeOrder.setExpressRecordType(request.getExpressRecordType()); + + storeOrder.setUpdateTime(DateUtil.date()); + Boolean execute = transactionTemplate.execute(i -> { + updateById(storeOrder); + //订单记录增加 + storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_DELIVERY_VI, "虚拟物品发货"); + return Boolean.TRUE; + }); + if (!execute) throw new YztException("虚拟物品发货失败"); + } + + /** + * 获取订单总数 + * @param dateLimit 时间端 + * @param status String 状态 + * @return Integer + */ + private Integer getCount(String dateLimit, String status) { + //总数只计算时间 + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StrUtil.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitUtilVo = YztDateUtil.getDateLimit(dateLimit); + queryWrapper.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); + } + getStatusWhereNew(queryWrapper, status); + return mapper.selectCount(queryWrapper).intValue(); + } + + /** + * 获取订单总数 + * @param dateLimit 时间端 + * @param status String 状态 + * @param orderNo 订单号 + * @return Integer + */ + private Integer getCount(String dateLimit, String status, Integer type, String orderNo) { + + Integer userId = SecurityUtil.getCurrentUserId(); + Long tenantId = systemAdminService.getDetail(userId).getTenantId(); + + //总数只计算时间 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("tenant_id",tenantId); + if (StrUtil.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitUtilVo = YztDateUtil.getDateLimit(dateLimit); + queryWrapper.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); + } + getStatusWhereNew(queryWrapper, status); + if (ObjectUtil.isNotNull(type)) { + queryWrapper.eq("type", type); + } + if (StringUtils.isNotBlank(orderNo)) { + queryWrapper.eq("order_id", orderNo); + } + return mapper.selectCount(queryWrapper).intValue(); + } + + /** + * 获取订单金额 + * @param dateLimit 时间端 + * @param type 支付类型 + * @return Integer + */ + private BigDecimal getAmount(String dateLimit, String type) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("sum(pay_price) as pay_price"); + if (StringUtils.isNotBlank(type)) { + queryWrapper.eq("pay_type", type); + } + queryWrapper.isNotNull("pay_time"); + queryWrapper.eq("paid", 1); + if (StringUtils.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitUtilVo = YztDateUtil.getDateLimit(dateLimit); + queryWrapper.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); + } + StoreOrder storeOrder = mapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(storeOrder)) { + return BigDecimal.ZERO; + } + return storeOrder.getPayPrice(); + } + + /** + * 获取request的where条件 + * @param queryWrapper QueryWrapper 表达式 + * @param request StoreOrderSearchRequest 请求参数 + */ + private void getRequestTimeWhere(QueryWrapper queryWrapper, StoreOrderSearchRequest request) { + if (StringUtils.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimitUtilVo = YztDateUtil.getDateLimit(request.getDateLimit()); + queryWrapper.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); + } + } + + /** + * 根据订单状态获取where条件 + * @param queryWrapper QueryWrapper 表达式 + * @param status String 类型 + */ + private void getStatusWhereNew(QueryWrapper queryWrapper, String status) { + if (StrUtil.isBlank(status)) { + return; + } + switch (status) { + case Constants.ORDER_STATUS_ALL: //全部 + break; + case Constants.ORDER_STATUS_UNPAID: //未支付 + queryWrapper.eq("paid", 0);//支付状态 + queryWrapper.eq("status", 0); //订单状态 + queryWrapper.eq("is_del", 0);//删除状态 + break; + case Constants.ORDER_STATUS_NOT_SHIPPED: //未发货 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 0); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("shipping_type", 1);//配送方式 + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_SPIKE: //待收货 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 1); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_BARGAIN: //待评价 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 2); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_COMPLETE: //交易完成 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 3); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_TOBE_WRITTEN_OFF: //待核销 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 0); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("shipping_type", 2);//配送方式 + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_REFUNDING: //退款中 + queryWrapper.eq("paid", 1); + queryWrapper.in("refund_status", 1,3); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_REFUNDED: //已退款 + queryWrapper.eq("paid", 1); + queryWrapper.eq("refund_status", 2); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_DELETED: //已删除 + queryWrapper.eq("is_del", 1); + break; + default: + queryWrapper.eq("paid", 1); + queryWrapper.ne("refund_status", 2); + break; + } + queryWrapper.eq("is_system_del", 0); + } + + /** + * 根据订单状态获取where条件 + * @param queryWrapper QueryWrapper 表达式 + * @param status String 类型 + */ + private void getStatusWhere(QueryWrapper queryWrapper, String status) { + if (StrUtil.isBlank(status)) { + return; + } + switch (status) { + case Constants.ORDER_STATUS_UNPAID: //未支付 + queryWrapper.eq("paid", 0);//支付状态 + queryWrapper.eq("status", 0); //订单状态 + queryWrapper.eq("is_del", 0);//删除状态 + break; + case Constants.ORDER_STATUS_NOT_SHIPPED: //未发货 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 0); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("shipping_type", 1);//配送方式 + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_SPIKE: //待收货 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 1); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_BARGAIN: //待评价 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 2); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_COMPLETE: //交易完成 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 3); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_TOBE_WRITTEN_OFF: //待核销 + queryWrapper.eq("paid", 1); + queryWrapper.eq("status", 0); + queryWrapper.eq("refund_status", 0); + queryWrapper.eq("shipping_type", 2);//配送方式 + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_REFUNDING: //退款中 + queryWrapper.eq("paid", 1); + queryWrapper.in("refund_status", 1,3); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_REFUNDED: //已退款 + queryWrapper.eq("paid", 1); + queryWrapper.eq("refund_status", 2); + queryWrapper.eq("is_del", 0); + break; + case Constants.ORDER_STATUS_DELETED: //已删除 + queryWrapper.eq("is_del", 1); + break; + default: + //queryWrapper.eq("paid", 1); + //queryWrapper.ne("refund_status", 2); + break; + } + queryWrapper.eq("is_system_del", 0); + } + + /** + * 获取订单状态 + * @param storeOrder StoreOrder 订单信息 + * + * @since 2020-06-12 + */ + private Map getStatus(StoreOrder storeOrder) { + Map map = new HashMap<>(); + map.put("key", ""); + map.put("value", ""); + if (null == storeOrder) { + return map; + } + // 未支付 + if (!storeOrder.getPaid() + && storeOrder.getStatus() == 0 + && storeOrder.getRefundStatus() == 0 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_UNPAID); + map.put("value", Constants.ORDER_STATUS_STR_UNPAID); + return map; + } + // 未发货 + if (storeOrder.getPaid() + && storeOrder.getStatus() == 0 + && storeOrder.getRefundStatus() == 0 + && storeOrder.getShippingType() == 1 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_NOT_SHIPPED); + map.put("value", Constants.ORDER_STATUS_STR_NOT_SHIPPED); + return map; + } + // 待收货 + if (storeOrder.getPaid() + && storeOrder.getStatus() == 1 + && storeOrder.getRefundStatus() == 0 + && storeOrder.getShippingType() == 1 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_SPIKE); + map.put("value", Constants.ORDER_STATUS_STR_SPIKE); + return map; + } + // 待评价 + if (storeOrder.getPaid() + && storeOrder.getStatus() == 2 + && storeOrder.getRefundStatus() == 0 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_BARGAIN); + map.put("value", Constants.ORDER_STATUS_STR_BARGAIN); + return map; + } + // 交易完成 + if (storeOrder.getPaid() + && storeOrder.getStatus() == 3 + && storeOrder.getRefundStatus() == 0 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_COMPLETE); + map.put("value", Constants.ORDER_STATUS_STR_COMPLETE); + return map; + } + // 待核销 + if (storeOrder.getPaid() + && storeOrder.getStatus() == 0 + && storeOrder.getRefundStatus() == 0 + && storeOrder.getShippingType() == 2 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_TOBE_WRITTEN_OFF); + map.put("value", Constants.ORDER_STATUS_STR_TOBE_WRITTEN_OFF); + return map; + } + + //申请退款 + if (storeOrder.getPaid() + && storeOrder.getRefundStatus() == 1 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_APPLY_REFUNDING); + map.put("value", Constants.ORDER_STATUS_STR_APPLY_REFUNDING); + return map; + } + + //退款中 + if (storeOrder.getPaid() + && storeOrder.getRefundStatus() == 3 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_REFUNDING); + map.put("value", Constants.ORDER_STATUS_STR_REFUNDING); + return map; + } + + //已退款 + if (storeOrder.getPaid() + && storeOrder.getRefundStatus() == 2 + && !storeOrder.getIsDel() + && !storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_REFUNDED); + map.put("value", Constants.ORDER_STATUS_STR_REFUNDED); + } + + //已删除 + if (storeOrder.getIsDel() || storeOrder.getIsSystemDel()) { + map.put("key", Constants.ORDER_STATUS_DELETED); + map.put("value", Constants.ORDER_STATUS_STR_DELETED); + } + + return map; + } + /** + * 获取支付文字 + * @param payType String 支付方式 + */ + private String getPayType(String payType) { + switch (payType) { + case Constants.PAY_TYPE_WE_CHAT: + return Constants.PAY_TYPE_STR_WE_CHAT; + case Constants.PAY_TYPE_YUE: + return Constants.PAY_TYPE_STR_YUE; + case Constants.PAY_TYPE_ALI_PAY: + return Constants.PAY_TYPE_STR_ALI_PAY; + default: + return Constants.PAY_TYPE_STR_OTHER; + } + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderStatusServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderStatusServiceImpl.java new file mode 100644 index 0000000..b247aa2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderStatusServiceImpl.java @@ -0,0 +1,147 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderStatus; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreOrderStatusSearchRequest; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.mapper.StoreOrderStatusMapper; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.StoreOrderStatusService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +/** + * StoreOrderStatusServiceImpl 接口实现 + * + */ +@Service +public class StoreOrderStatusServiceImpl extends ServiceImpl implements StoreOrderStatusService { + + @Resource + private StoreOrderStatusMapper mapper; + + @Autowired + private StoreOrderService storeOrderService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(StoreOrderStatusSearchRequest request, PageParamRequest pageParamRequest) { + StoreOrder storeOrder = storeOrderService.getByOderId(request.getOrderNo()); + if (ObjectUtil.isNull(storeOrder)) { + return CollUtil.newArrayList(); + } + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreOrderStatus::getOid, storeOrder.getId()); + lqw.orderByDesc(StoreOrderStatus::getCreateTime); + return mapper.selectList(lqw); + } + + /** + * 保存订单退款记录 + * @param orderId 订单号 + * @param amount 金额 + * @param message 备注 + * @return {@link Boolean} + */ + @Override + public Boolean saveRefund(Integer orderId, BigDecimal amount, String message) { + //此处更新订单状态 + String changeMessage = Constants.ORDER_LOG_MESSAGE_REFUND_PRICE.replace("{amount}", amount.toString()); + if(StringUtils.isNotBlank(message)){ + changeMessage += message; + } + StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); + storeOrderStatus.setOid(orderId); + storeOrderStatus.setChangeType(Constants.ORDER_LOG_REFUND_PRICE); + storeOrderStatus.setChangeMessage(changeMessage); + return save(storeOrderStatus); + } + + /** + * 创建记录日志 + * @param orderId Integer 订单号 + * @param type String 类型 + * @param message String 消息 + * @return Boolean + */ + @Override + public Boolean createLog(Integer orderId, String type, String message) { + StoreOrderStatus storeOrderStatus = new StoreOrderStatus(); + storeOrderStatus.setOid(orderId); + storeOrderStatus.setChangeType(type); + storeOrderStatus.setChangeMessage(message); + storeOrderStatus.setCreateTime(YztDateUtil.nowDateTime()); + return save(storeOrderStatus); + } + + /** + * 根据实体获取 + * @param storeOrderStatus 订单状态参数 + * @return 查询结果 + */ + @Override + public List getByEntity(StoreOrderStatus storeOrderStatus) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.setEntity(storeOrderStatus); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 根据订单id获取最后一条记录 + * @param orderId 订单id + * @return StoreOrderStatus + */ + @Override + public StoreOrderStatus getLastByOrderId(Integer orderId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("oid", orderId); + queryWrapper.orderByDesc("create_time"); + queryWrapper.last(" limit 1"); + return mapper.selectOne(queryWrapper); + } + + /** + * 通过日期获取订单退款数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getRefundOrderNumByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("oid"); + wrapper.eq("change_type", "refund_price"); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 通过日期获取订单退款金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + @Override + public BigDecimal getRefundOrderAmountByDate(String date) { + return mapper.getRefundOrderAmountByDate(date); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderTaskServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderTaskServiceImpl.java new file mode 100644 index 0000000..5b0fd4d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderTaskServiceImpl.java @@ -0,0 +1,718 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.bargain.StoreBargain; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.order.StoreOrderInfo; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.seckill.StoreSeckill; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.user.*; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.delete.OrderUtils; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreOrderTaskService实现类 + * + */ +@Service +public class StoreOrderTaskServiceImpl implements StoreOrderTaskService { + //日志 + private static final Logger logger = LoggerFactory.getLogger(StoreOrderTaskServiceImpl.class); + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreOrderStatusService storeOrderStatusService; + + @Autowired + private UserService userService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreSeckillService storeSeckillService; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private UserBillService userBillService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private SmsService smsService; + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private OrderUtils orderUtils; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private UserLevelUpgradeAuditService userLevelUpgradeAuditService; + + @Autowired + private StoreProductAttrValueService attrValueService; + + @Autowired + private StoreCouponUserService couponUserService; + + @Autowired + private UserExperienceRecordService userExperienceRecordService; + + @Autowired + private SystemNotificationService systemNotificationService; + + @Autowired + private SmsTemplateService smsTemplateService; + + /** + * 用户取消订单 + * + * @since 2020-07-09 + */ + @Override + @Transactional(rollbackFor = {RuntimeException.class, Error.class, YztException.class}) + public Boolean cancelByUser(StoreOrder storeOrder) { + try{ + /* + * 1、修改订单状态 (用户操作的时候已处理) + * 2、写订单日志 + * 3、回滚库存 + * 4、回滚优惠券 + * 5、回滚积分 + * */ + + Boolean execute = transactionTemplate.execute(e -> { + //写订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), "cancel_order", "取消订单"); + // 退优惠券 + if (storeOrder.getCouponId() > 0) { + StoreCouponUser couponUser = couponUserService.getById(storeOrder.getCouponId()); + couponUser.setStatus(CouponConstants.STORE_COUPON_USER_STATUS_USABLE); + couponUser.setUpdateTime(DateUtil.date()); + couponUserService.updateById(couponUser); + } + Boolean rollbackStock = rollbackStock(storeOrder); + if (!rollbackStock) { + throw new YztException("回滚库存失败"); + } + return Boolean.TRUE; + }); + return execute; + }catch (Exception e){ + return false; + } + } + + /** + * 完成订单 + * + * @since 2020-07-09 + */ + @Override + @Transactional(rollbackFor = {RuntimeException.class, Error.class, YztException.class}) + public Boolean complete(StoreOrder storeOrder) { + /* + * 1、修改订单状态 (用户操作的时候已处理) + * 2、写订单日志 + * */ + try{ + storeOrderStatusService.createLog(storeOrder.getId(), "check_order_over", "用户评价"); + return true; + }catch (Exception e){ + return false; + } + } + + /** + * 回滚库存 + * @param storeOrder 订单信息 + */ + private Boolean rollbackStock(StoreOrder storeOrder) { + try{ + // 查找出商品详情 + List orderInfoList = storeOrderInfoService.getListByOrderNo(storeOrder.getOrderId()); + if(null == orderInfoList || orderInfoList.size() < 1){ + return true; + } + + // 兼容处理秒杀数据退款 + // 秒杀商品回滚库存和销量 + if(null != storeOrder.getSeckillId() && storeOrder.getSeckillId() > 0){ + // 秒杀只会有一个商品 + StoreOrderInfo orderInfo = orderInfoList.get(0); + StoreSeckill storeSeckill = storeSeckillService.getById(storeOrder.getSeckillId()); + storeSeckillService.operationStock(storeOrder.getSeckillId(), orderInfo.getPayNum(), "add"); + StoreProductAttrValue seckillAttrValue = attrValueService.getByIdAndProductIdAndType(orderInfo.getAttrValueId(), storeSeckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + attrValueService.operationStock(seckillAttrValue.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_SECKILL, seckillAttrValue.getVersion()); + StoreProduct storeProduct = storeProductService.getById(storeSeckill.getProductId()); + storeProductService.operationStock(storeProduct.getId(), orderInfo.getPayNum(), "add", storeProduct.getVersion()); + List attrValueList = attrValueService.getListByProductIdAndType(storeSeckill.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + attrValueList.forEach(e -> { + if (e.getSuk().equals(orderInfo.getSku())) { + attrValueService.operationStock(e.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_NORMAL, e.getVersion()); + } + }); + } else if (ObjectUtil.isNotNull(storeOrder.getBargainId()) && storeOrder.getBargainId() > 0) { // 砍价商品回滚销量库存 + StoreOrderInfo orderInfo = orderInfoList.get(0); + StoreBargain storeBargain = storeBargainService.getById(storeOrder.getBargainId()); + storeBargainService.operationStock(storeBargain.getId(), orderInfo.getPayNum(), "add"); + StoreProductAttrValue bargainAttrValue = attrValueService.getByIdAndProductIdAndType(orderInfo.getAttrValueId(), storeBargain.getId(), Constants.PRODUCT_TYPE_BARGAIN); + attrValueService.operationStock(bargainAttrValue.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_BARGAIN, bargainAttrValue.getVersion()); + StoreProduct storeProduct = storeProductService.getById(storeBargain.getProductId()); + storeProductService.operationStock(storeProduct.getId(), orderInfo.getPayNum(), "add", storeProduct.getVersion()); + List attrValueList = attrValueService.getListByProductIdAndType(storeBargain.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + attrValueList.forEach(e -> { + if (e.getSuk().equals(orderInfo.getSku())) { + attrValueService.operationStock(e.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_NORMAL, e.getVersion()); + } + }); + } else if (ObjectUtil.isNotNull(storeOrder.getCombinationId()) && storeOrder.getCombinationId() > 0) { // 拼团商品回滚销量库存 + StoreOrderInfo orderInfo = orderInfoList.get(0); + StoreCombination storeCombination = storeCombinationService.getById(storeOrder.getCombinationId()); + storeCombinationService.operationStock(storeCombination.getId(), orderInfo.getPayNum(), "add"); + StoreProductAttrValue combinationAttrValue = attrValueService.getByIdAndProductIdAndType(orderInfo.getAttrValueId(), storeCombination.getId(), Constants.PRODUCT_TYPE_PINGTUAN); + attrValueService.operationStock(combinationAttrValue.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_PINGTUAN, combinationAttrValue.getVersion()); + StoreProduct storeProduct = storeProductService.getById(storeCombination.getProductId()); + storeProductService.operationStock(storeProduct.getId(), orderInfo.getPayNum(), "add", storeProduct.getVersion()); + List attrValueList = attrValueService.getListByProductIdAndType(storeCombination.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + attrValueList.forEach(e -> { + if (e.getSuk().equals(orderInfo.getSku())) { + attrValueService.operationStock(e.getId(), orderInfo.getPayNum(), "add", Constants.PRODUCT_TYPE_NORMAL, e.getVersion()); + } + }); + } + else { // 正常商品回滚销量库存 + for (StoreOrderInfo orderInfoVo : orderInfoList) { + StoreProduct storeProduct = storeProductService.getById(orderInfoVo.getProductId()); + storeProductService.operationStock(storeProduct.getId(), orderInfoVo.getPayNum(), "add", storeProduct.getVersion()); + StoreProductAttrValue productAttrValue = attrValueService.getById(orderInfoVo.getAttrValueId()); + attrValueService.operationStock(productAttrValue.getId(), orderInfoVo.getPayNum(), "add", Constants.PRODUCT_TYPE_NORMAL, productAttrValue.getVersion()); + } + } + } catch (Exception e) { + logger.error("回滚库存失败,error = " + e.getMessage()); + return false; + } + + return true; + } + + /** + * 订单退款处理 + * 退款得时候根据userBill 来进行回滚 + */ + @Override + public Boolean refundOrder(StoreOrder storeOrder) { + /** + * 1、写订单日志 + * 2、回滚消耗积分 + * 3、回滚获得积分 + * 4、回滚冻结期佣金 + * 5、回滚经验 + * 6、回滚库存 + * 7、发送通知 + * 实际上2-5就是user数据的处理+userBill的记录 + */ + // 获取用户对象 + User user = userService.getById(storeOrder.getUid()); + if (ObjectUtil.isNull(user)) { + logger.error("订单退款处理,对应的用户不存在,storeOrder===>" + storeOrder); + return Boolean.FALSE; + } + + // 回滚经验 + UserExperienceRecord userExperienceRecord = userExperienceRecordService.getByOrderNoAndUid(storeOrder.getOrderId(), storeOrder.getUid()); + user.setExperience(user.getExperience() - userExperienceRecord.getExperience()); + + UserExperienceRecord experienceRecord = new UserExperienceRecord(); + BeanUtils.copyProperties(userExperienceRecord, experienceRecord); + experienceRecord.setId(null); + experienceRecord.setTitle(ExperienceRecordConstants.EXPERIENCE_RECORD_TITLE_REFUND); + experienceRecord.setType(ExperienceRecordConstants.EXPERIENCE_RECORD_TYPE_SUB); + experienceRecord.setBalance(user.getExperience()); + experienceRecord.setMark(StrUtil.format("订单退款,扣除{}赠送经验", userExperienceRecord.getExperience())); + experienceRecord.setCreateTime(DateUtil.date()); + + // 回滚积分 + List integralRecordList = userIntegralRecordService.findListByOrderIdAndUid(storeOrder.getOrderId(), storeOrder.getUid()); + integralRecordList.forEach(record -> { + if (record.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_SUB)) {// 订单抵扣部分 + user.setIntegral(user.getIntegral().add(record.getIntegral())); + record.setId(null); + record.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_REFUND); + record.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + record.setBalance(user.getIntegral()); + record.setMark(StrUtil.format("订单退款,返还支付扣除得{}积分", record.getIntegral())); + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + record.setUpdateTime(DateUtil.date()); + } else if (record.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD)) {// 冻结积分部分 + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_INVALIDATION); + record.setUpdateTime(DateUtil.date()); + } + }); + List addIntegralList = integralRecordList.stream().filter(e -> ObjectUtil.isNull(e.getId())).collect(Collectors.toList()); + List updateIntegralList = integralRecordList.stream() + .filter(e -> ObjectUtil.isNotNull(e.getId())) + .collect(Collectors.toList()); + + StoreOrder tempOrder = new StoreOrder(); + tempOrder.setId(storeOrder.getId()); + tempOrder.setRefundStatus(2); + // 佣金处理:只处理冻结期佣金 + // 查询佣金记录 + List brokerageRecordList = CollUtil.newArrayList(); + List recordList = userBrokerageRecordService.findListByLinkIdAndLinkType(storeOrder.getOrderId(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + if (CollUtil.isNotEmpty(recordList)) { + recordList.forEach(r -> { + //创建、冻结期佣金置为失效状态 + if (r.getStatus() < BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE) { + r.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_INVALIDATION); + r.setUpdateTime(DateUtil.date()); + brokerageRecordList.add(r); + } + }); + } + + Boolean execute = transactionTemplate.execute(e -> { + //写订单日志 + storeOrderStatusService.saveRefund(storeOrder.getId(), storeOrder.getRefundPrice(), "成功"); + + // 更新用户数据 + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + + // 积分部分 + if (CollUtil.isNotEmpty(addIntegralList)) { + userIntegralRecordService.saveBatch(addIntegralList); + } + if (CollUtil.isNotEmpty(updateIntegralList)) { + userIntegralRecordService.updateBatchById(updateIntegralList); + } + + // 佣金处理 + if (CollUtil.isNotEmpty(brokerageRecordList)) { + userBrokerageRecordService.updateBatchById(brokerageRecordList); + } + + // 经验处理 + userExperienceRecordService.save(experienceRecord); + userLevelService.downLevel(user); + + // 等级回退处理(基于订单的升级回退) + handleLevelDowngradeOnRefund(storeOrder, user); + + // 回滚库存 + Boolean rollbackStock = rollbackStock(storeOrder); + if (!rollbackStock) { + throw new YztException("回滚库存失败"); + } + + tempOrder.setUpdateTime(DateUtil.date()); + storeOrderService.updateById(tempOrder); + + // 拼团状态处理 + if (storeOrder.getCombinationId() > 0) { + StorePink storePink = storePinkService.getByOrderId(storeOrder.getOrderId()); + storePink.setStatus(3); + storePink.setIsRefund(true); + storePinkService.updateById(storePink); + } + + // 排队记录失效处理:标记为退款、队列前移、重新计算进度 + storePinkService.invalidateQueueByOrderId(storeOrder.getOrderId()); + + // 退优惠券 + if (storeOrder.getCouponId() > 0 ) { + StoreCouponUser couponUser = couponUserService.getById(storeOrder.getCouponId()); + couponUser.setStatus(CouponConstants.STORE_COUPON_USER_STATUS_USABLE); + couponUser.setUpdateTime(DateUtil.date()); + couponUserService.updateById(couponUser); + } + return Boolean.TRUE; + }); + return execute; + } + + /** + * 超时未支付系统自动取消 + */ + @Override + public Boolean autoCancel(StoreOrder storeOrder) { + // 判断订单是否支付 + if (storeOrder.getPaid()) { + return Boolean.TRUE; + } + if (storeOrder.getIsDel() || storeOrder.getIsSystemDel()) { + return Boolean.TRUE; + } + // 获取过期时间 + String cancelStr; + DateTime cancelTime; + if (storeOrder.getType().equals(1)) { + cancelStr = "3"; + cancelTime = DateUtil.offset(storeOrder.getCreateTime(), DateField.MINUTE, Integer.parseInt(cancelStr)); + } else { + if (storeOrder.getBargainId() > 0 || storeOrder.getSeckillId() > 0 || storeOrder.getCombinationId() > 0) { + cancelStr = systemConfigService.getValueByKey("order_activity_time"); + } else { + cancelStr = systemConfigService.getValueByKey("order_cancel_time"); + } + if (StrUtil.isBlank(cancelStr)) { + cancelStr = "1"; + } + cancelTime = DateUtil.offset(storeOrder.getCreateTime(), DateField.HOUR_OF_DAY, Integer.parseInt(cancelStr)); + } + long between = DateUtil.between(cancelTime, DateUtil.date(), DateUnit.SECOND, false); + if (between < 0) {// 未到过期时间继续循环 + return Boolean.FALSE; + } + storeOrder.setIsDel(true).setIsSystemDel(true); + Boolean execute = false; + + execute = transactionTemplate.execute(e -> { + storeOrder.setUpdateTime(DateUtil.date()); + storeOrderService.updateById(storeOrder); + //写订单日志 + storeOrderStatusService.createLog(storeOrder.getId(), "cancel", "到期未支付系统自动取消"); + // 退优惠券 + if (storeOrder.getCouponId() > 0 ) { + StoreCouponUser couponUser = couponUserService.getById(storeOrder.getCouponId()); + couponUser.setStatus(CouponConstants.STORE_COUPON_USER_STATUS_USABLE); + couponUser.setUpdateTime(DateUtil.date()); + couponUserService.updateById(couponUser); + } + // 回滚库存 + Boolean rollbackStock = rollbackStock(storeOrder); + if (!rollbackStock) { + throw new YztException("回滚库存失败"); + } + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 订单收货task处理 + * @param orderId 订单id + * @return Boolean + * 1.写订单日志 + * 2.分佣-佣金进入冻结期 + */ + @Override + public Boolean orderReceiving(Integer orderId) { + StoreOrder storeOrder = storeOrderService.getById(orderId); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException(StrUtil.format("订单收货task处理,未找到订单,id={}", orderId)); + } + User user = userService.getById(storeOrder.getUid()); + + // 获取佣金记录 + List recordList = userBrokerageRecordService.findListByLinkIdAndLinkType(storeOrder.getOrderId(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + logger.info("收货处理佣金条数:" + recordList.size()); + for (UserBrokerageRecord record : recordList) { + if (!record.getStatus().equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE)) { + throw new YztException(StrUtil.format("订单收货task处理,订单佣金记录不是创建状态,id={}", orderId)); + } + // 佣金进入冻结期 + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + // 计算解冻时间 + Long thawTime = DateUtil.current(false); + if (record.getFrozenTime() > 0) { + DateTime dateTime = DateUtil.offsetDay(new Date(), record.getFrozenTime()); + thawTime = dateTime.getTime(); + } + record.setThawTime(thawTime); + record.setUpdateTime(DateUtil.date()); + } + + // 获取积分记录 + List integralRecordList = userIntegralRecordService.findListByOrderIdAndUid(storeOrder.getOrderId(), storeOrder.getUid()); + + logger.info("收货处理积分条数:" + integralRecordList.size()); + List userIntegralRecordList = integralRecordList.stream().filter(e -> e.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD)).collect(Collectors.toList()); + for (UserIntegralRecord record : userIntegralRecordList) { + // 佣金进入冻结期 + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN); + // 计算解冻时间 + Long thawTime = DateUtil.current(false); + if (record.getFrozenTime() > 0) { + DateTime dateTime = DateUtil.offsetDay(new Date(), record.getFrozenTime()); + thawTime = dateTime.getTime(); + } + record.setThawTime(thawTime); + record.setUpdateTime(DateUtil.date()); + } + + Boolean execute = transactionTemplate.execute(e -> { + // 日志 + storeOrderStatusService.createLog(storeOrder.getId(), "user_take_delivery", Constants.ORDER_STATUS_STR_TAKE); + // 分佣-佣金进入冻结期 + if (CollUtil.isNotEmpty(recordList)) { + userBrokerageRecordService.updateBatchById(recordList); + } + // 积分进入冻结期 + if (CollUtil.isNotEmpty(userIntegralRecordList)) { + userIntegralRecordService.updateBatchById(userIntegralRecordList); + } + return Boolean.TRUE; + }); + if (execute) { + // 发送用户确认收货管理员提醒短信 + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.RECEIPT_GOODS_ADMIN_MARK); + if (notification.getIsSms().equals(1)) { + // 查询可已发送短信的管理员 + List systemAdminList = systemAdminService.findIsSmsList(); + if (CollUtil.isNotEmpty(systemAdminList)) { + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + Integer tempId = Integer.valueOf(smsTemplate.getTempId()); + // 发送短信 + systemAdminList.forEach(admin -> { + smsService.sendOrderReceiptNotice(admin.getPhone(), storeOrder.getOrderId(), admin.getRealName(), tempId); + }); + } + } + + // 发送消息通知 + pushMessageOrder(storeOrder, user); + } + + return execute; + } + + /** + * 发送消息通知 + * 根据用户类型发送 + * 公众号模板消息 + * 小程序订阅消息 + */ + private void pushMessageOrder(StoreOrder storeOrder, User user) { + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.RECEIPT_GOODS_MARK); + if (storeOrder.getIsChannel().equals(2)) { + return; + } + if (!storeOrder.getPayType().equals(Constants.PAY_TYPE_WE_CHAT)) { + return; + } + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (storeOrder.getIsChannel().equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "您购买的商品已确认收货!"); + temMap.put("keyword1", storeOrder.getOrderId()); + temMap.put("keyword2", "已收货"); + temMap.put("keyword3", YztDateUtil.nowDateTimeStr()); + temMap.put("keyword4", "详情请进入订单查看"); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用。"); + templateMessageService.pushTemplateMessage(notification.getWechatId(), temMap, userToken.getToken()); + } else if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 + // 获取商品名称 + String storeNameAndCarNumString = orderUtils.getStoreNameAndCarNumString(storeOrder.getId()); + if (StrUtil.isBlank(storeNameAndCarNumString)) { + return ; + } + if (storeNameAndCarNumString.length() > 20) { + storeNameAndCarNumString = storeNameAndCarNumString.substring(0, 15) + "***"; + } +// temMap.put("character_string6", storeOrder.getOrderId()); +// temMap.put("phrase4", "已收货"); +// temMap.put("time7", DateUtil.nowDateTimeStr()); +// temMap.put("thing1", storeNameAndCarNumString); +// temMap.put("thing5", "您购买的商品已确认收货!"); + temMap.put("character_string6", storeOrder.getOrderId()); + temMap.put("date5", YztDateUtil.nowDateTimeStr()); + temMap.put("thing2", storeNameAndCarNumString); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), temMap, userToken.getToken()); + } + } + + /** + * 处理退款时的等级回退 + * @param storeOrder 订单 + * @param user 用户 + */ + private void handleLevelDowngradeOnRefund(StoreOrder storeOrder, User user) { + try { + String orderId = storeOrder.getOrderId(); + + // 1. 将待审核的升级记录标记为拒绝(软删除) + userLevelUpgradeAuditService.rejectByOrderIdForRefund(orderId, 0L); + logger.info("退款处理:将订单{}的待审核升级记录标记为拒绝(订单已退款)", orderId); + + // 2. 查询该订单是否导致过等级升级(从mark字段中查找订单号) + com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper wrapper = + com.baomidou.mybatisplus.core.toolkit.Wrappers.lambdaQuery(); + wrapper.eq(UserLevel::getUid, user.getUid()) + .like(UserLevel::getMark, orderId) + .eq(UserLevel::getIsDel, false) + .orderByDesc(UserLevel::getCreateTime); + + List levelRecords = userLevelService.list(wrapper); + if (CollUtil.isEmpty(levelRecords)) { + logger.info("退款处理:订单{}未导致等级变化,无需回退", orderId); + return; + } + + // 3. 检查是否是"普通会员→拼团会员"的升级(不回退) + UserLevel upgradeRecord = levelRecords.get(0); + if (upgradeRecord.getLevelId() == 2 && upgradeRecord.getMark().contains("升级为拼团会员")) { + logger.info("退款处理:订单{}导致的是普通会员→拼团会员升级,不回退等级", orderId); + return; + } + + // 4. 需要回退等级 + // 查询升级前的等级(该记录之前的最后一条有效记录) + com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper previousWrapper = + com.baomidou.mybatisplus.core.toolkit.Wrappers.lambdaQuery(); + previousWrapper.eq(UserLevel::getUid, user.getUid()) + .eq(UserLevel::getIsDel, false) + .lt(UserLevel::getId, upgradeRecord.getId()) + .orderByDesc(UserLevel::getCreateTime) + .last("limit 1"); + + UserLevel previousLevel = userLevelService.getOne(previousWrapper); + if (previousLevel == null) { + logger.warn("退款处理:未找到用户{}的前一等级记录,默认回退到普通会员", user.getUid()); + rollbackToLevel(user, 1, orderId, upgradeRecord); + } else { + logger.info("退款处理:用户{}从等级{}回退到等级{}", user.getUid(), upgradeRecord.getLevelId(), previousLevel.getLevelId()); + rollbackToLevel(user, previousLevel.getLevelId(), orderId, upgradeRecord); + } + + } catch (Exception e) { + logger.error("处理退款等级回退失败,订单号:{}", storeOrder.getOrderId(), e); + } + } + + /** + * 回退到指定等级 + * @param user 用户 + * @param targetLevel 目标等级 + * @param orderId 订单号 + * @param originalRecord 原升级记录 + */ + private void rollbackToLevel(User user, Integer targetLevel, String orderId, UserLevel originalRecord) { + // 标记原升级记录为已删除 + originalRecord.setIsDel(true); + originalRecord.setUpdateTime(DateUtil.date()); + userLevelService.updateById(originalRecord); + + // 创建降级记录 + UserLevel downgradeLevel = new UserLevel(); + downgradeLevel.setUid(user.getUid()); + downgradeLevel.setLevelId(targetLevel); + downgradeLevel.setGrade(targetLevel); + downgradeLevel.setStatus(true); + downgradeLevel.setIsDel(false); + downgradeLevel.setDiscount(100); + downgradeLevel.setCreateTime(DateUtil.date()); + + String levelName = getLevelNameById(targetLevel); + String mark = StrUtil.format("尊敬的用户【{}】,在{}因订单{}退款,等级回退为{}", + user.getNickname(), + YztDateUtil.nowDateTimeStr(), + orderId, + levelName); + downgradeLevel.setMark(mark); + + userLevelService.save(downgradeLevel); + + // 更新用户等级 + user.setLevel(targetLevel); + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + + logger.info("用户{}等级已回退到{},订单号:{}", user.getUid(), levelName, orderId); + } + + /** + * 根据等级ID获取等级名称 + */ + private String getLevelNameById(Integer levelId) { + switch (levelId) { + case 1: return "普通会员"; + case 2: return "拼团会员"; + case 3: return "加盟店"; + case 4: return "会馆"; + case 5: return "金奖会馆"; + case 6: return "成义会馆"; + default: return "未知等级"; + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderVerificationImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderVerificationImpl.java new file mode 100644 index 0000000..f2dfb77 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreOrderVerificationImpl.java @@ -0,0 +1,209 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.TaskConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.request.StoreOrderStaticsticsRequest; +import com.yzt.common.response.StoreOrderVerificationConfirmResponse; +import com.yzt.common.response.StoreStaffDetail; +import com.yzt.common.response.StoreStaffTopDetail; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.service.mapper.StoreOrderMapper; +import com.yzt.service.delete.OrderUtils; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * StoreOrderVerificationImpl 接口实现 核销订单 + * + */ +@Service +public class StoreOrderVerificationImpl implements StoreOrderVerification { + + @Resource + private StoreOrderMapper mapper; + + @Autowired + private OrderUtils orderUtils; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private StorePinkService storePinkService; + /** + * 获取订单核销数据 + */ + @Override + public StoreStaffTopDetail getOrderVerificationData() { + StoreStaffTopDetail storeStaffTopDetail = new StoreStaffTopDetail(); + //订单支付没有退款 数量- + LambdaQueryWrapper lqwOrderCount = Wrappers.lambdaQuery(); + lqwOrderCount.eq(StoreOrder::getIsDel,false).eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0); + storeStaffTopDetail.setOrderCount(mapper.selectCount(lqwOrderCount).intValue()); + //订单支付没有退款 支付总金额 + LambdaQueryWrapper lqwSumPrice = Wrappers.lambdaQuery(); + lqwSumPrice.eq(StoreOrder::getIsDel,false).eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0); + List storeOrdersSumPrice = mapper.selectList(lqwSumPrice); + Double sumPrice = storeOrdersSumPrice.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum(); + storeStaffTopDetail.setSumPrice(BigDecimal.valueOf(sumPrice).setScale(2,BigDecimal.ROUND_HALF_UP)); + //订单待支付 数量 + LambdaQueryWrapper lqwUnPaidCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(lqwUnPaidCount,0); + storeStaffTopDetail.setUnpaidCount(mapper.selectCount(lqwUnPaidCount).intValue()); + //订单待发货 数量 + LambdaQueryWrapper lqwUnShippedCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(lqwUnShippedCount,1); + storeStaffTopDetail.setUnshippedCount(mapper.selectCount(lqwUnShippedCount).intValue()); + //订单待收货 数量 + LambdaQueryWrapper lqwReceivedCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(lqwReceivedCount,2); + storeStaffTopDetail.setReceivedCount(mapper.selectCount(lqwReceivedCount).intValue()); + // 订单待核销数量 + LambdaQueryWrapper verificationCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(verificationCount,3); + storeStaffTopDetail.setVerificationCount(mapper.selectCount(verificationCount).intValue()); + //订单已完成 数量 + LambdaQueryWrapper lqwCompleteCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(lqwCompleteCount,4); + storeStaffTopDetail.setCompleteCount(mapper.selectCount(lqwCompleteCount).intValue()); + //订单退款 数量 + LambdaQueryWrapper lqwRefundCount = Wrappers.lambdaQuery(); + orderUtils.statusApiByWhere(lqwRefundCount,-3); + storeStaffTopDetail.setRefundCount(mapper.selectCount(lqwRefundCount).intValue()); + + // 获取今日,昨日,本月,订单金额 + String dayStart = YztDateUtil.nowDateTime(Constants.DATE_FORMAT_START); + String dayEnd = YztDateUtil.nowDateTime(Constants.DATE_FORMAT_END); + String yesterdayStart = YztDateUtil.addDay(dayStart,-1,Constants.DATE_FORMAT_START); + String yesterdayEnd = YztDateUtil.addDay(dayEnd,-1,Constants.DATE_FORMAT_END); + String monthStart = YztDateUtil.nowDateTime(Constants.DATE_FORMAT_MONTH_START); + String monthEnd = YztDateUtil.getMonthEndDay(); + + // 今日订单数量 + LambdaQueryWrapper lqwTodayCount = Wrappers.lambdaQuery(); + lqwTodayCount.eq(StoreOrder::getIsDel,false).between(StoreOrder::getPayTime,dayStart,dayEnd) + .eq(StoreOrder::getPaid,1).eq(StoreOrder::getRefundStatus,0); + List storeOrdersTodayCount = mapper.selectList(lqwTodayCount); + if(null == storeOrdersTodayCount) storeOrdersTodayCount = new ArrayList<>(); + storeStaffTopDetail.setTodayCount(storeOrdersTodayCount.size()); + + // 今日成交额 + double todayPrice = storeOrdersTodayCount.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum(); + storeStaffTopDetail.setTodayPrice(BigDecimal.valueOf(todayPrice).setScale(2,BigDecimal.ROUND_HALF_UP)); + + // 昨日订单数 + LambdaQueryWrapper lqwPro = Wrappers.lambdaQuery(); + lqwPro.eq(StoreOrder::getIsDel,false).between(StoreOrder::getCreateTime,yesterdayStart,yesterdayEnd) + .eq(StoreOrder::getPaid, true).eq(StoreOrder::getRefundStatus,0); + List storeOrdersPro = mapper.selectList(lqwPro); + if(null == storeOrdersPro) storeOrdersPro = new ArrayList<>(); + storeStaffTopDetail.setProCount(storeOrdersPro.size()); + + // 昨日成交额 + double proPrice = storeOrdersPro.stream().mapToDouble(e->e.getPayPrice().doubleValue()).sum(); + storeStaffTopDetail.setProPrice(BigDecimal.valueOf(proPrice).setScale(2,BigDecimal.ROUND_HALF_UP)); + + // 本月成交订单数量 + LambdaQueryWrapper lqwMonth = Wrappers.lambdaQuery(); + lqwMonth.eq(StoreOrder::getIsDel,false).between(StoreOrder::getPayTime,monthStart, monthEnd) + .eq(StoreOrder::getPaid,true).eq(StoreOrder::getRefundStatus,0); + List storeOrdersMonth = mapper.selectList(lqwMonth); + if(null == storeOrdersMonth) storeOrdersMonth = new ArrayList<>(); + storeStaffTopDetail.setMonthCount(storeOrdersMonth.size()); + + // 本月成交额 + double monthTotalPrice = storeOrdersMonth.stream().mapToDouble(e -> e.getPayPrice().doubleValue()).sum(); + storeStaffTopDetail.setMonthPrice(BigDecimal.valueOf(monthTotalPrice).setScale(2,BigDecimal.ROUND_HALF_UP)); + + return storeStaffTopDetail; + } + + /** + * 核销月详情 + * @return 月详情 + */ + @Override + public List getOrderVerificationDetail(StoreOrderStaticsticsRequest request) { + request.setPage((request.getPage() - 1) * request.getLimit()); + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + request.setStartTime(dateLimit.getStartTime()); + request.setEndTime(dateLimit.getEndTime()); + return mapper.getOrderVerificationDetail(request); + } + + + /** + * 根据核销码核销订单(相当于收货) + * + * @param vCode 核销码 + * @return 核销结果 + */ + @Override + public boolean verificationOrderByCode(String vCode) { + StoreOrderVerificationConfirmResponse existOrder = getVerificationOrderByCode(vCode); + // 判断当前用户是否有权限核销 + LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); + SystemAdmin currentAdmin = loginUserVo.getUser(); + // 添加核销人员后执行核销操作 + StoreOrder storeOrder = new StoreOrder(); + BeanUtils.copyProperties(existOrder,storeOrder); + if (ObjectUtil.isNotNull(storeOrder.getCombinationId()) && storeOrder.getCombinationId() > 0) { + StorePink storePink = storePinkService.getById(storeOrder.getPinkId()); + if (storePink.getStatus() != 2) throw new YztException("当前订单正在拼团中不能核销!"); + } + storeOrder.setStatus(Constants.ORDER_STATUS_INT_BARGAIN); + storeOrder.setClerkId(currentAdmin.getId()); + storeOrder.setUpdateTime(DateUtil.date()); + boolean saveStatus = mapper.updateById(storeOrder) > 0; + + // 小程序订阅消息发送 + if(saveStatus){ + //后续操作放入redis + redisUtil.lPush(TaskConstants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER, storeOrder.getId()); + } + return saveStatus; + } + + /** + * 根据核销码查询待核销订单 + * + * @param vCode 核销码 + * @return 待核销订单详情 + */ + @Override + public StoreOrderVerificationConfirmResponse getVerificationOrderByCode(String vCode) { + StoreOrderVerificationConfirmResponse response = new StoreOrderVerificationConfirmResponse(); + StoreOrder storeOrderPram = new StoreOrder().setVerifyCode(vCode).setPaid(true).setRefundStatus(0); + StoreOrder existOrder = storeOrderService.getByEntityOne(storeOrderPram); + if(null == existOrder) throw new YztException(Constants.RESULT_VERIFICATION_ORDER_NOT_FUND.replace("${vCode}",vCode)); + if(existOrder.getStatus() > 0) throw new YztException(Constants.RESULT_VERIFICATION_ORDER_VED.replace("${vCode}",vCode)); + BeanUtils.copyProperties(existOrder, response); + response.setStoreOrderInfoVos(storeOrderInfoService.getOrderListByOrderId(existOrder.getId())); + return response; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StorePinkServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StorePinkServiceImpl.java new file mode 100644 index 0000000..7172192 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StorePinkServiceImpl.java @@ -0,0 +1,660 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.NotifyConstants; +import com.yzt.common.constants.UserConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.model.user.UserToken; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.OrderRefundApplyRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StorePinkSearchRequest; +import com.yzt.common.response.StorePinkAdminListResponse; +import com.yzt.common.response.StorePinkDetailResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.common.vo.MyRecord; +import com.yzt.service.mapper.StorePinkMapper; +import com.yzt.service.service.*; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StorePinkService 实现类 + * + */ +@Service +public class StorePinkServiceImpl extends ServiceImpl implements StorePinkService { + + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StorePinkServiceImpl.class); + + @Resource + private StorePinkMapper mapper; + + @Autowired + private UserService userService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + @Autowired + private com.yzt.common.utils.RedisUtil redisUtil; + + @Lazy + @Autowired + private OrderService orderService; + + @Lazy + @Autowired + private StoreOrderService storeOrderService; + + @Lazy + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private SystemNotificationService systemNotificationService; + + @Autowired + private TenantService tenantService; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StorePinkSearchRequest request, PageParamRequest pageParamRequest) { + + // 1. 先根据 phone / name 查询符合条件的用户 IDs + List filteredUids = null; + + if (StrUtil.isNotBlank(request.getPhone()) || StrUtil.isNotBlank(request.getName())) { + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getPhone())) { + userWrapper.like(User::getPhone, request.getPhone()); + } + if (StrUtil.isNotBlank(request.getName())) { + userWrapper.like(User::getNickname, request.getName()); + } + List matchedUsers = userService.list(userWrapper); + if (CollUtil.isEmpty(matchedUsers)) { + // 没有匹配的用户,直接返回空分页 + Page emptyPage = new Page<>(pageParamRequest.getPage(), pageParamRequest.getLimit()); + return CommonPage.copyPageInfo(emptyPage, CollUtil.newArrayList()); + } + filteredUids = matchedUsers.stream().map(User::getUid).collect(Collectors.toList()); + } + // 2. 开始分页 + Page pinkPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotNull(request.getStatus())) { + lqw.eq(StorePink::getStatus, request.getStatus()); + } + if (StrUtil.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + lqw.between(StorePink::getAddTime, YztDateUtil.dateStr2Timestamp(dateLimit.getStartTime(), Constants.DATE_TIME_TYPE_BEGIN), YztDateUtil.dateStr2Timestamp(dateLimit.getEndTime(), Constants.DATE_TIME_TYPE_END)); + } + if (ObjectUtil.isNotNull(request.getQueueType())) { + lqw.eq(StorePink::getQueueType, request.getQueueType()); + } + lqw.eq(StorePink::getKId, 0); + lqw.orderByDesc(StorePink::getId); + + // 用户 ID 条件(来自 phone/name 查询结果) + if (filteredUids != null) { + if (filteredUids.isEmpty()) { + return CommonPage.copyPageInfo(pinkPage, CollUtil.newArrayList()); + } + lqw.in(StorePink::getUid, filteredUids); + } + + List storePinks = mapper.selectList(lqw); + if (CollUtil.isEmpty(storePinks)) { + return CommonPage.copyPageInfo(pinkPage, CollUtil.newArrayList()); + } + List userIds = storePinks.stream().map(StorePink::getUid).collect(Collectors.toList()); + HashMap userHashMap = userService.getMapListInUid(userIds); + List list = storePinks.stream().map(pink -> { + StorePinkAdminListResponse storePinkResponse = new StorePinkAdminListResponse(); + BeanUtils.copyProperties(pink, storePinkResponse); + Integer countPeople = getCountByKidAndCid(pink.getCid(), pink.getId()); + storePinkResponse.setCountPeople(countPeople); + storePinkResponse.setAddTime(YztDateUtil.timestamp2DateStr(pink.getAddTime()*1000L, Constants.DATE_FORMAT)); + storePinkResponse.setStopTime(YztDateUtil.timestamp2DateStr(pink.getStopTime()*1000L, Constants.DATE_FORMAT)); + StoreCombination combination = storeCombinationService.getById(pink.getCid()); + if(Objects.nonNull(combination)){ + storePinkResponse.setTitle(combination.getTitle()); + } + + User user = userHashMap.get(pink.getUid()); + if (null != user) { + storePinkResponse.setPhone(user.getPhone()); + storePinkResponse.setName(user.getNickname()); + storePinkResponse.setTenantName(tenantService.getInfo(user.getTenantId()).getTenantName()); + } + return storePinkResponse; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(pinkPage, list); + } + + /** + * 获取拼团列表cid + * @param cid 拼团商品id + * @return + */ + @Override + public List getListByCid(Integer cid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getCid, cid); + lqw.orderByDesc(StorePink::getId); + return mapper.selectList(lqw); + } + + /** + * 使指定订单号的所有排队记录失效,并重新计算剩余排队的 queueNo 与进度 + * @param orderId 订单号 + */ + @Override + public void invalidateQueueByOrderId(String orderId) { + if (StrUtil.isBlank(orderId)) return; + // 找到该订单对应的排队记录并标记为已失效 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getOrderId, orderId); + List targetList = mapper.selectList(lqw); + if (CollUtil.isEmpty(targetList)) return; + + List queueTypes = targetList.stream().map(StorePink::getQueueType).distinct().collect(Collectors.toList()); + + for (StorePink p : targetList) { + p.setIsRefund(true); + } + this.updateBatchById(targetList); + + // 对每个受影响队列,重新编号并重新计算进度/处理免单 + for (Integer queueType : queueTypes) { + // 获取被删除记录的 queue_no 列表(用于计算前移量) + List removedRecords = targetList.stream() + .filter(t -> ObjectUtil.isNotNull(t.getQueueNo()) && ObjectUtil.isNotNull(t.getQueueType()) && t.getQueueType().equals(queueType)) + .collect(Collectors.toList()); + if (CollUtil.isEmpty(removedRecords)) continue; + + int minRemovedQueueNo = removedRecords.stream().mapToInt(StorePink::getQueueNo).min().orElse(Integer.MAX_VALUE); + int removedCount = removedRecords.size(); + + // 更新 Redis 全局计数器:减去删除的数量 + String redisKey = queueType != null && queueType == 2 ? "queue:counter:hall" : "queue:counter:member"; + redisUtil.decr(redisKey, removedCount); + + // 查询所有需要前移的记录(queue_no > minRemovedQueueNo 且未退款的记录) + LambdaQueryWrapper shiftWrapper = new LambdaQueryWrapper<>(); + shiftWrapper.eq(StorePink::getQueueType, queueType) + .gt(StorePink::getQueueNo, minRemovedQueueNo) + .eq(StorePink::getIsRefund, false) + .orderByAsc(StorePink::getQueueNo); + List recordsToShift = mapper.selectList(shiftWrapper); + + // 队列前移:减去 removedCount + for (StorePink record : recordsToShift) { + record.setQueueNo(record.getQueueNo() - removedCount); + } + if (!recordsToShift.isEmpty()) { + this.updateBatchById(recordsToShift); + } + + // 查询所有等待中的记录(用于重新计算进度) + LambdaQueryWrapper waitingWrapper = new LambdaQueryWrapper<>(); + waitingWrapper.eq(StorePink::getQueueType, queueType) + .eq(StorePink::getStatus, 1) + .eq(StorePink::getIsRefund, false) + .orderByAsc(StorePink::getQueueNo); + List waitingList = mapper.selectList(waitingWrapper); + if (CollUtil.isEmpty(waitingList)) continue; + + // 读取更新后的 globalY(redis 中的全局计数) + Object globalVal = redisUtil.get(redisKey); + int globalY = 0; + try { + if (globalVal != null) { + globalY = Integer.parseInt(globalVal.toString()); + } + } catch (Exception ignore) {} + if (globalY <= 0) { + // fallback to max queueNo if exists + int maxQueueNo = waitingList.stream().mapToInt(wp -> wp.getQueueNo() == null ? 0 : wp.getQueueNo()).max().orElse(0); + globalY = Math.max(maxQueueNo, waitingList.size()); + } + int newMaxY = globalY; + + // 重新计算进度与处理可能满足免单的用户(注意:若该用户的订单已退款,则**不**生成佣金记录) + List updates = new ArrayList<>(); + for (StorePink xUser : waitingList) { + int x = xUser.getQueueNo(); + if (x >= newMaxY) continue; + + BigDecimal numerator = new BigDecimal(newMaxY - x); + BigDecimal denominator = new BigDecimal(3 * x + 1); + + if (numerator.compareTo(denominator) >= 0) { + xUser.setQueueProgress(BigDecimal.ONE); + xUser.setStatus(2); + xUser.setIsRefund(true); + + // 检查该排队记录关联的订单是否已退款:若已退款则跳过生成佣金/孵化奖 + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(StoreOrder::getOrderId, xUser.getOrderId()).last("limit 1"); + StoreOrder order = storeOrderService.getOne(orderWrapper); + boolean orderRefunded = (order != null && order.getRefundStatus() != null && order.getRefundStatus() != 0); + + BigDecimal recordPrice = xUser.getPrice(); + if (!orderRefunded) { + if (order != null && order.getStatus() == 3) { + int pointsToAdd = recordPrice.intValue(); + if (pointsToAdd > 0) { + com.yzt.common.request.UserOperateIntegralMoneyRequest integralRequest = new com.yzt.common.request.UserOperateIntegralMoneyRequest(); + integralRequest.setUid(xUser.getUid()); + integralRequest.setIntegralType(1); + integralRequest.setIntegralValue(pointsToAdd); + integralRequest.setMoneyType(1); + integralRequest.setMoneyValue(BigDecimal.ZERO); + userService.updateIntegralMoney(integralRequest); + } + + // 丙的上级获得免单孵化奖 + User user = userService.getById(xUser.getUid()); + if (user != null && user.getSpreadUid() != null && user.getSpreadUid() > 0) { + User parent = userService.getById(user.getSpreadUid()); + // 自身等级为2(拼团会员)时,不获得孵化奖 + if (parent != null && parent.getLevel() != 2) { + BigDecimal incubatorPrize = recordPrice.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + UserBrokerageRecord incubatorRecord = new UserBrokerageRecord(); + incubatorRecord.setUid(parent.getUid()); + incubatorRecord.setLinkId(xUser.getOrderId()); + incubatorRecord.setLinkType("queue_incubator"); + incubatorRecord.setType(1); + incubatorRecord.setTitle("排队免单孵化奖励"); + incubatorRecord.setPrice(incubatorPrize); + incubatorRecord.setBalance(BigDecimal.ZERO); + incubatorRecord.setMark("我是" + user.getNickname() + "的上级,获得其免单金额5%(" + incubatorPrize + ")的免单孵化奖"); + incubatorRecord.setStatus(1); + incubatorRecord.setCreateTime(new Date()); + incubatorRecord.setBrokerageLevel(1); + userBrokerageRecordService.save(incubatorRecord); + } + } + } else { + // 丙获得排队免单收益 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(xUser.getUid()); + brokerageRecord.setLinkId(xUser.getOrderId()); + brokerageRecord.setLinkType("queue"); + brokerageRecord.setType(1); + brokerageRecord.setTitle("排队免单收益"); + brokerageRecord.setPrice(recordPrice); + brokerageRecord.setBalance(BigDecimal.ZERO); + brokerageRecord.setMark("排队免单成功(订单未完成),排队号:" + x); + brokerageRecord.setStatus(1); + brokerageRecord.setCreateTime(new Date()); + brokerageRecord.setBrokerageLevel(0); + userBrokerageRecordService.save(brokerageRecord); + + // 丙的上级获得孵化奖 + User user = userService.getById(xUser.getUid()); + if (user != null && user.getSpreadUid() != null && user.getSpreadUid() > 0) { + User parent = userService.getById(user.getSpreadUid()); + // 自身等级为2(拼团会员)时,不获得孵化奖 + if (parent != null && parent.getLevel() != 2) { + BigDecimal incubatorPrize = recordPrice.multiply(new BigDecimal("0.05")).setScale(2, BigDecimal.ROUND_DOWN); + UserBrokerageRecord incubatorRecord = new UserBrokerageRecord(); + incubatorRecord.setUid(parent.getUid()); + incubatorRecord.setLinkId(xUser.getOrderId()); + incubatorRecord.setLinkType("queue_incubator"); + incubatorRecord.setType(1); + incubatorRecord.setTitle("排队免单孵化奖励"); + incubatorRecord.setPrice(incubatorPrize); + incubatorRecord.setBalance(BigDecimal.ZERO); + incubatorRecord.setMark("我是" + user.getNickname() + "的上级,获得其免单金额5%(" + incubatorPrize + ")的免单孵化奖"); + incubatorRecord.setStatus(1); + incubatorRecord.setCreateTime(new Date()); + incubatorRecord.setBrokerageLevel(1); + userBrokerageRecordService.save(incubatorRecord); + } + } + } + } + } else { + BigDecimal progress = numerator.divide(denominator, 6, BigDecimal.ROUND_DOWN); + xUser.setQueueProgress(progress); + } + updates.add(xUser); + } + if (!updates.isEmpty()) { + this.updateBatchById(updates); + } + } + } + + /** + * 获取拼团列表uid + * @param uid 用户uid + * @return + */ + @Override + public List getListByUid(Integer uid,Integer type) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getUid, uid); + lqw.eq(StorePink::getQueueType,type); + lqw.orderByDesc(StorePink::getId); + return mapper.selectList(lqw); + } + + /** + * 拼团实体查询 + * @param storePink + * @return + */ + @Override + public List getByEntity(StorePink storePink) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.setEntity(storePink); + return mapper.selectList(lqw); + } + + /** + * PC拼团详情列表 + * @param pinkId 团长pinkId + * @return + */ + @Override + public List getAdminList(Integer pinkId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StorePink::getId, pinkId).or().eq(StorePink::getKId, pinkId); + lqw.orderByDesc(StorePink::getId); + List pinkList = mapper.selectList(lqw); + // 将拼团状态提换为订单状态 + List responseList = pinkList.stream().map(pink -> { + StorePinkDetailResponse response = new StorePinkDetailResponse(); + BeanUtils.copyProperties(pink, response); + StoreOrder storeOrder = storeOrderService.getByOderId(pink.getOrderId()); + if (ObjectUtil.isNotNull(storeOrder)) { + response.setOrderStatus(storeOrder.getStatus()); + response.setRefundStatus(storeOrder.getRefundStatus()); + } + return response; + }).collect(Collectors.toList()); + return responseList; + } + + @Override + public List getListByCidAndKid(Integer cid, Integer kid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getCid, cid); + lqw.eq(StorePink::getKId, kid); + lqw.eq(StorePink::getIsRefund, false); + lqw.orderByDesc(StorePink::getId); + return mapper.selectList(lqw); + } + + @Override + public Integer getCountByKid(Integer pinkId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StorePink::getId); + lqw.eq(StorePink::getIsRefund, false); + lqw.and(i -> i.eq(StorePink::getKId, pinkId).or().eq(StorePink::getId, pinkId)); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 检查状态,更新数据 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void detectionStatus() { + // 查找所有结束时间小等于当前的进行中拼团团长 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getStatus, 1); + lqw.eq(StorePink::getKId, 0); + lqw.le(StorePink::getStopTime, System.currentTimeMillis()); + List headList = mapper.selectList(lqw); + if (CollUtil.isEmpty(headList)) { + return ; + } + /** + * 1.判断是否拼团成功 + * 2.成功的修改状态 + * 3.失败的拼团改为失败,订单申请退款 + */ + List pinkSuccessList = CollUtil.newArrayList(); + List pinkFailList = CollUtil.newArrayList(); + List applyList = CollUtil.newArrayList(); + for (StorePink headPink : headList) { + // 查询团员 + List memberList = getListByCidAndKid(headPink.getCid(), headPink.getId()); + memberList.add(headPink); + if (headPink.getPeople().equals(memberList.size())) { + memberList.forEach(i -> i.setStatus(2)); + pinkSuccessList.addAll(memberList); + continue; + } + // 计算虚拟比例,判断是否拼团成功 + StoreCombination storeCombination = storeCombinationService.getById(headPink.getCid()); + Integer virtual = storeCombination.getVirtualRation();// 虚拟成团比例 + if (headPink.getPeople() <= memberList.size() + virtual) { + // 可以虚拟成团 + memberList.forEach(i -> i.setStatus(2).setIs_virtual(true)); + pinkSuccessList.addAll(memberList); + continue; + } + // 失败 + headPink.setStatus(3); + // 订单申请退款 + OrderRefundApplyRequest refundRequest = new OrderRefundApplyRequest(); + refundRequest.setId(headPink.getOrderIdKey()); + refundRequest.setText("拼团订单取消,申请退款"); + refundRequest.setExplain("用户取消拼团订单,申请退款"); + pinkFailList.add(headPink); + applyList.add(refundRequest); + + // 团员处理 + if (CollUtil.isNotEmpty(memberList)) { + memberList.forEach(i -> i.setStatus(3)); + List tempApplyList = memberList.stream().map(i -> { + OrderRefundApplyRequest tempRefundRequest = new OrderRefundApplyRequest(); + tempRefundRequest.setId(headPink.getOrderIdKey()); + tempRefundRequest.setText("拼团订单取消,申请退款"); + tempRefundRequest.setExplain("用户取消拼团订单,申请退款"); + return tempRefundRequest; + }).collect(Collectors.toList()); + pinkFailList.addAll(memberList); + applyList.addAll(tempApplyList); + } + } + if (CollUtil.isNotEmpty(pinkFailList) && pinkFailList.size() > 0) { + boolean failUpdate = updateBatchById(pinkFailList, 100); + if (!failUpdate) throw new YztException("批量更新拼团状态,拼团未成功部分,失败"); + } + if (applyList.size() > 0) { + boolean task = orderService.refundApplyTask(applyList); + if (!task) throw new YztException("拼团未成功,订单申请退款失败"); + } + if (CollUtil.isNotEmpty(pinkSuccessList) && pinkSuccessList.size() > 0) { + boolean successUpdate = updateBatchById(pinkSuccessList, 100); + if (!successUpdate) throw new YztException("批量更新拼团状态,拼团成功部分,失败"); + SystemNotification notification = systemNotificationService.getByMark(NotifyConstants.GROUP_SUCCESS_MARK); + if (notification.getIsRoutine().equals(1) || notification.getIsWechat().equals(1)) { + pinkSuccessList.forEach(i -> { + StoreOrder storeOrder = storeOrderService.getByOderId(i.getOrderId()); + StoreCombination storeCombination = storeCombinationService.getById(i.getCid()); + User tempUser = userService.getById(i.getUid()); + // 发送微信模板消息 + MyRecord record = new MyRecord(); + record.set("orderNo", storeOrder.getOrderId()); + record.set("proName", storeCombination.getTitle()); + record.set("payType", storeOrder.getPayType()); + record.set("isChannel", storeOrder.getIsChannel()); + pushMessageOrder(record, tempUser, notification); + }); + } + } + } + + /** + * 发送消息通知 + * @param record 参数 + * @param user 拼团用户 + */ + private void pushMessageOrder(MyRecord record, User user, SystemNotification notification) { + if (!record.getStr("payType").equals(Constants.PAY_TYPE_WE_CHAT)) { + return ; + } + if (record.getInt("isChannel").equals(2)) { + return ; + } + + UserToken userToken; + HashMap temMap = new HashMap<>(); + // 公众号 + if (record.getInt("isChannel").equals(Constants.ORDER_PAY_CHANNEL_PUBLIC) && notification.getIsWechat().equals(1)) { + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_WECHAT); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 发送微信模板消息 + temMap.put(Constants.WE_CHAT_TEMP_KEY_FIRST, "恭喜您拼团成功!我们将尽快为您发货。"); + temMap.put("keyword1", record.getStr("orderNo")); + temMap.put("keyword2", record.getStr("proName")); + temMap.put(Constants.WE_CHAT_TEMP_KEY_END, "感谢你的使用!"); + templateMessageService.pushTemplateMessage(notification.getWechatId(), temMap, userToken.getToken()); + } else if (notification.getIsRoutine().equals(1)) { + // 小程序发送订阅消息 + userToken = userTokenService.getTokenByUserId(user.getUid(), UserConstants.USER_TOKEN_TYPE_ROUTINE); + if (ObjectUtil.isNull(userToken)) { + return ; + } + // 组装数据 +// temMap.put("character_string1", record.getStr("orderNo")); +// temMap.put("thing2", record.getStr("proName")); +// temMap.put("thing5", "恭喜您拼团成功!我们将尽快为您发货。"); + temMap.put("character_string10", record.getStr("orderNo")); + temMap.put("thing7", record.getStr("proName")); + temMap.put("thing9", "恭喜您拼团成功!我们将尽快为您发货。"); + templateMessageService.pushMiniTemplateMessage(notification.getRoutineId(), temMap, userToken.getToken()); + } + } + + /** + * 拼团成功 + * @param kid + * @return + */ + @Override + public boolean pinkSuccess(Integer kid) { + if (ObjectUtil.isNull(kid)) { + return false; + } + StorePink teamPink = getById(kid); + List memberList = getListByCidAndKid(teamPink.getCid(), kid); + long timeMillis = System.currentTimeMillis(); + memberList.add(teamPink); + memberList.forEach(i -> { + i.setStatus(2); + i.setStopTime(timeMillis); + }); + return updateBatchById(memberList); + } + + /** + * 根据订单编号获取 + * @param orderId + * @return + */ + @Override + public StorePink getByOrderId(String orderId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getOrderId, orderId); + return mapper.selectOne(lqw); + } + + /** + * 获取最后3个拼团信息(不同用户) + * @return List + */ + @Override + public List findSizePink(Integer size) { +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.eq(StorePink::getIsRefund, false); +// lqw.in(StorePink::getStatus, 1, 2); +// lqw.groupBy(StorePink::getUid); +// lqw.orderByDesc(StorePink::getId); +// lqw.last(" limit " + size); +// return mapper.selectList(lqw); + return mapper.selectSizePink(size); + } + + /** + * 获取拼团参与总人数 + * @return Integer + */ + @Override + public Integer getTotalPeople() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StorePink::getIsRefund, false); + lqw.in(StorePink::getStatus, 1, 2); + return mapper.selectCount(lqw).intValue(); + } + + private Integer getCountByKidAndCid(Integer cid, Integer kid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StorePink::getId); + lqw.eq(StorePink::getCid, cid); + lqw.and(i -> i.eq(StorePink::getKId, kid).or().eq(StorePink::getId, kid)); + lqw.eq(StorePink::getIsRefund, false); + return mapper.selectCount(lqw).intValue(); + } + + @Override + public boolean saveBatch(java.util.Collection entityList) { + logger.warn("===== StorePinkService.saveBatch CALLED ====="); + logger.warn("Stack trace: ", new Exception("Track saveBatch call")); + for (StorePink entity : entityList) { + logger.warn("SAVE BATCH ITEM: orderId={}, price={}, totalPrice={}, queueNo={}, addTime={}", + entity.getOrderId(), entity.getPrice(), entity.getTotalPrice(), entity.getQueueNo(), entity.getAddTime()); + } + boolean result = super.saveBatch(entityList); + logger.warn("===== StorePinkService.saveBatch COMPLETED: {} records =====", entityList.size()); + return result; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrResultServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrResultServiceImpl.java new file mode 100644 index 0000000..892c550 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrResultServiceImpl.java @@ -0,0 +1,38 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.product.StoreProductAttrResult; +import com.yzt.service.mapper.StoreProductAttrResultMapper; +import com.yzt.service.service.StoreProductAttrResultService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * StoreProductAttrResultService实现类 + * + */ +@Service +public class StoreProductAttrResultServiceImpl extends ServiceImpl + implements StoreProductAttrResultService { + + @Resource + private StoreProductAttrResultMapper mapper; + + /** + * 根据商品属性值集合查询 + * + * @param storeProductAttrResult 查询参数 + * @return 查询结果 + */ + @Override + public List getByEntity(StoreProductAttrResult storeProductAttrResult) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.setEntity(storeProductAttrResult); + return mapper.selectList(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrServiceImpl.java new file mode 100644 index 0000000..06c0ffd --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrServiceImpl.java @@ -0,0 +1,88 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.service.mapper.StoreProductAttrMapper; +import com.yzt.service.service.StoreProductAttrService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * StoreProductAttrServiceImpl 接口实现 + * + */ +@Service +public class StoreProductAttrServiceImpl extends ServiceImpl + implements StoreProductAttrService { + + @Resource + private StoreProductAttrMapper mapper; + + /** + * 根据基本属性查询商品属性详情 + * + * @param storeProductAttr 商品属性 + * @return 查询商品属性集合 + */ + @Override + public List getByEntity(StoreProductAttr storeProductAttr) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if(null != storeProductAttr.getId()) lqw.eq(StoreProductAttr::getId,storeProductAttr.getId()); + if(StringUtils.isNotEmpty(storeProductAttr.getAttrValues())) + lqw.eq(StoreProductAttr::getAttrValues,storeProductAttr.getAttrValues()); + if(StringUtils.isNotEmpty(storeProductAttr.getAttrName())) + lqw.eq(StoreProductAttr::getAttrName,storeProductAttr.getAttrName()); + if(null != storeProductAttr.getProductId()) lqw.eq(StoreProductAttr::getProductId,storeProductAttr.getProductId()); + if(null != storeProductAttr.getType()) lqw.eq(StoreProductAttr::getType,storeProductAttr.getType()); + return mapper.selectList(lqw); + } + + /** + * 根据id删除商品 + * @param productId 待删除商品id + * @param type 类型区分是是否添加营销 + */ + @Override + public void removeByProductId(Integer productId,int type) { + LambdaQueryWrapper lambdaQW = Wrappers.lambdaQuery(); + lambdaQW.eq(StoreProductAttr::getProductId, productId).eq(StoreProductAttr::getType,type); + mapper.delete(lambdaQW); + } + + /** + * 删除商品规格 + * @param productId 商品id + * @param type 商品类型 + * @return Boolean + */ + @Override + public Boolean deleteByProductIdAndType(Integer productId, Integer type) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(StoreProductAttr::getIsDel, true); + luw.eq(StoreProductAttr::getProductId, productId); + luw.eq(StoreProductAttr::getType, type); + return update(luw); + } + + /** + * 获取商品规格列表 + * @param productId 商品id + * @param type 商品类型 + * @return List + */ + @Override + public List getListByProductIdAndType(Integer productId, Integer type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductAttr::getProductId, productId); + lqw.eq(StoreProductAttr::getType, type); + lqw.eq(StoreProductAttr::getIsDel, false); + return mapper.selectList(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrValueServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrValueServiceImpl.java new file mode 100644 index 0000000..6ef56d1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductAttrValueServiceImpl.java @@ -0,0 +1,225 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.service.mapper.StoreProductAttrValueMapper; +import com.yzt.service.service.StoreProductAttrValueService; +import com.yzt.service.service.SystemConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * StoreProductAttrValueServiceImpl 接口实现 + * + */ +@Service +public class StoreProductAttrValueServiceImpl extends ServiceImpl + implements StoreProductAttrValueService { + + @Resource + private StoreProductAttrValueMapper mapper; + + @Autowired + private SystemConfigService systemConfigService; + + /** + * + * @param productId 商品id + * @param attrId 属性id + * @return 商品属性集合 + */ + @Override + public List getListByProductIdAndAttrId(Integer productId, String attrId, Integer type) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreProductAttrValue::getProductId, productId); + lambdaQueryWrapper.eq(StoreProductAttrValue::getType, type); + if(null != attrId){ + lambdaQueryWrapper.eq(StoreProductAttrValue::getId, attrId); + } + lambdaQueryWrapper.eq(StoreProductAttrValue::getIsDel, false); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 根据产品属性查询 + * @param storeProductAttrValue 商品属性参数 + * @return 查询到的属性结果 + */ + @Override + public List getByEntity(StoreProductAttrValue storeProductAttrValue) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.setEntity(storeProductAttrValue); + return mapper.selectList(lqw); + } + + /** + * 根据商品id删除AttrValue + * @param productId 商品id + * @param type 类型区分是是否添加营销 + * @reture 删除结果 + */ + @Override + public boolean removeByProductId(Integer productId,int type) { + LambdaQueryWrapper lambdaQW = Wrappers.lambdaQuery(); + lambdaQW.eq(StoreProductAttrValue::getProductId, productId).eq(StoreProductAttrValue::getType,type); + return mapper.delete(lambdaQW) > 0; + } + + /** + * 根据id、类型查询 + * @param id ID + * @param type 类型 + * @return StoreProductAttrValue + */ + @Override + public StoreProductAttrValue getByIdAndProductIdAndType(Integer id, Integer productId, Integer type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductAttrValue::getId, id); + lqw.eq(StoreProductAttrValue::getProductId, productId); + lqw.eq(StoreProductAttrValue::getType, type); + lqw.eq(StoreProductAttrValue::getIsDel, false); + return mapper.selectOne(lqw); + } + + /** + * 根据sku查询 + * @param productId 商品id + * @param suk sku + * @param type 规格类型 + * @return StoreProductAttrValue + */ + @Override + public StoreProductAttrValue getByProductIdAndSkuAndType(Integer productId, String suk, Integer type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductAttrValue::getProductId, productId); + lqw.eq(StoreProductAttrValue::getSuk, suk); + lqw.eq(StoreProductAttrValue::getType, type); + lqw.eq(StoreProductAttrValue::getIsDel, false); + return mapper.selectOne(lqw); + } + + /** + * 添加(退货)/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param operationType 类型:add—添加,sub—扣减 + * @param type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团 + * @param version 版本号 + * @return Boolean + */ + @Override + public Boolean operationStock(Integer id, Integer num, String operationType, Integer type, Integer version) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (operationType.equals("quick_add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + } + if (operationType.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + if (type > 0) { + updateWrapper.setSql(StrUtil.format("quota = quota + {}", num)); + } + } + if (operationType.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + if (type > 0) { + updateWrapper.setSql(StrUtil.format("quota = quota - {}", num)); + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format("and (quota - {} >= 0)", num)); + } else { + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format("and (stock - {} >= 0)", num)); + } + } + updateWrapper.setSql("version = version + 1"); + updateWrapper.eq("id", id); + updateWrapper.eq("type", type); + updateWrapper.eq("version", version); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新商品attrValue失败,attrValueId = " + id); + } + return update; + } + + @Override + public Boolean operationStock(Integer id, Integer num, String operationType, Integer version) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (operationType.equals("quick_add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + } + if (operationType.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + } + if (operationType.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + + } + updateWrapper.setSql("version = version + 1"); + updateWrapper.eq("id", id); + updateWrapper.eq("version", version); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新商品attrValue失败,attrValueId = " + id); + } + return update; + } + + /** + * 删除商品规格属性值 + * @param productId 商品id + * @param type 商品类型 + * @return Boolean + */ + @Override + public Boolean deleteByProductIdAndType(Integer productId, Integer type) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(StoreProductAttrValue::getIsDel, true); + luw.eq(StoreProductAttrValue::getProductId, productId); + luw.eq(StoreProductAttrValue::getType, type); + return update(luw); + } + + /** + * 获取商品规格列表 + * @param productId 商品id + * @param type 商品类型 + * @return List + */ + @Override + public List getListByProductIdAndType(Integer productId, Integer type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductAttrValue::getProductId, productId); + lqw.eq(StoreProductAttrValue::getType, type); + lqw.eq(StoreProductAttrValue::getIsDel, false); + return mapper.selectList(lqw); + } + + /** + * 根据商品id和attrIdList获取 商品属性列表集合 + * @param productId 商品id + * @param attrIdList 属性idList + * @return 商品属性集合 + */ + @Override + public List getByProductIdAndAttrIdList(Integer productId, List attrIdList) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductAttrValue::getProductId, productId); + lqw.in(StoreProductAttrValue::getId, attrIdList); + lqw.eq(StoreProductAttrValue::getIsDel, false); + return mapper.selectList(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductCouponServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductCouponServiceImpl.java new file mode 100644 index 0000000..f310b49 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductCouponServiceImpl.java @@ -0,0 +1,46 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.product.StoreProductCoupon; +import com.yzt.service.mapper.StoreProductCouponMapper; +import com.yzt.service.service.StoreProductCouponService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * StoreProductCouponServiceImpl 接口实现 + * + */ +@Service +public class StoreProductCouponServiceImpl extends ServiceImpl + implements StoreProductCouponService { + + @Resource + private StoreProductCouponMapper mapper; + /** + * + * @param productId 产品id + */ + @Override + public boolean deleteByProductId(Integer productId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreProductCoupon::getProductId, productId); + return mapper.delete(lambdaQueryWrapper) > 0; + } + + /** + * 根据商品id获取已关联优惠券信息 + * @param productId 商品id + * @return 已关联优惠券 + */ + @Override + public List getListByProductId(Integer productId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreProductCoupon::getProductId, productId); + return mapper.selectList(lambdaQueryWrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductDescriptionServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductDescriptionServiceImpl.java new file mode 100644 index 0000000..50392ef --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductDescriptionServiceImpl.java @@ -0,0 +1,49 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.product.StoreProductDescription; +import com.yzt.service.mapper.StoreProductDescriptionMapper; +import com.yzt.service.service.StoreProductDescriptionService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * StoreProductDescriptionServiceImpl 接口实现 + * + */ +@Service +public class StoreProductDescriptionServiceImpl extends ServiceImpl implements StoreProductDescriptionService { + + @Resource + private StoreProductDescriptionMapper mapper; + + /** + * 根据商品id和type删除对应描述 + * @param productId 商品id + * @param type 类型 + */ + @Override + public void deleteByProductId(int productId,int type) { + LambdaQueryWrapper lmq = Wrappers.lambdaQuery(); + lmq.eq(StoreProductDescription::getProductId, productId).eq(StoreProductDescription::getType,type); + mapper.delete(lmq); + } + + /** + * 获取详情 + * @param productId 商品id + * @param type 商品类型 + * @return StoreProductDescription + */ + @Override + public StoreProductDescription getByProductIdAndType(Integer productId, Integer type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProductDescription::getProductId, productId); + lqw.eq(StoreProductDescription::getType,type); + return mapper.selectOne(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductLogServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductLogServiceImpl.java new file mode 100644 index 0000000..5c9d86b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.log.StoreProductLog; +import com.yzt.service.mapper.StoreProductLogMapper; +import com.yzt.service.service.StoreProductLogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * StoreProductLogServiceImpl 接口实现 + * + */ +@Service +public class StoreProductLogServiceImpl extends ServiceImpl implements StoreProductLogService { + + @Resource + private StoreProductLogMapper mapper; + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRelationServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRelationServiceImpl.java new file mode 100644 index 0000000..7333aad --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRelationServiceImpl.java @@ -0,0 +1,234 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.product.StoreProductRelation; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserCollectAllRequest; +import com.yzt.common.request.UserCollectRequest; +import com.yzt.common.response.UserRelationResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.StoreProductRelationMapper; +import com.yzt.service.service.StoreProductRelationService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * StoreProductRelationServiceImpl 接口实现 + * + */ +@Service +public class StoreProductRelationServiceImpl extends ServiceImpl + implements StoreProductRelationService { + + @Resource + private StoreProductRelationMapper mapper; + + @Lazy + @Autowired + private UserService userService; + + /** + * 添加收藏产品 + * @param request UserCollectAllRequest 新增参数 + * @return boolean + */ + @Override + public Boolean all(UserCollectAllRequest request) { + Integer[] arr = request.getProductId(); + if(arr.length < 1){ + throw new YztException("请选择产品"); + } + + List list = YztUtil.arrayUnique(arr); + + Integer uid = userService.getUserIdException(); + deleteAll(request, uid, "collect"); //先删除所有已存在的 + + ArrayList storeProductRelationList = new ArrayList<>(); + for (Integer productId: list) { + StoreProductRelation storeProductRelation = new StoreProductRelation(); + storeProductRelation.setUid(uid); + storeProductRelation.setType("collect"); + storeProductRelation.setProductId(productId); + storeProductRelation.setCategory(request.getCategory()); + storeProductRelationList.add(storeProductRelation); + } + return saveBatch(storeProductRelationList); + } + + + /** + * 取消收藏产品 + */ + @Override + public Boolean delete(String requestJson) { + JSONObject jsonObject = JSONObject.parseObject(requestJson); + if (StrUtil.isBlank(jsonObject.getString("ids"))) { + throw new YztException("收藏id不能为空"); + } + List idList = YztUtil.stringToArray(jsonObject.getString("ids")); + if (CollUtil.isEmpty(idList)) { + throw new YztException("收藏id不能为空"); + } + Integer userId = userService.getUserIdException(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(StoreProductRelation::getId, idList); + lqw.eq(StoreProductRelation::getUid, userId); + int delete = mapper.delete(lqw); + return delete > 0; + } + + /** + * 取消收藏产品 + * @param request UserCollectAllRequest 参数 + * @param type 类型 + */ + private void deleteAll(UserCollectAllRequest request, Integer uid, String type) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(StoreProductRelation::getProductId, Arrays.asList(request.getProductId())) + .eq(StoreProductRelation::getCategory, request.getCategory()) + .eq(StoreProductRelation::getUid, uid) + .eq(StoreProductRelation::getType, type); + mapper.delete(lambdaQueryWrapper); + } + + /** + * 根据产品id和类型获取对应列表 + * @param productId 产品id + * @param type 类型 + * @return 对应结果 + */ + @Override + public List getList(Integer productId, String type) { + LambdaQueryWrapper lqr = new LambdaQueryWrapper<>(); + lqr.eq(StoreProductRelation::getProductId, productId); + lqr.eq(StoreProductRelation::getType, type); + return mapper.selectList(lqr); + } + + /** + * 获取用户当前是否喜欢该商品 + * @param userId 用户id + * @param productId 商品id + * @return 是否喜欢标识 + */ + @Override + public List getLikeOrCollectByUser(Integer userId, Integer productId,boolean isLike) { + String typeValue = isLike?"like":"collect"; + LambdaQueryWrapper lqr = new LambdaQueryWrapper<>(); + lqr.eq(StoreProductRelation::getProductId, productId); + lqr.eq(StoreProductRelation::getUid, userId); + lqr.eq(StoreProductRelation::getType,typeValue); + return mapper.selectList(lqr); + } + + /** + * 获取用户收藏列表 + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getUserList(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + Integer userId = userService.getUserIdException(); + return mapper.getUserList(userId); + } + + /** + * 获取用户的收藏数量 + * @param uid 用户uid + * @return 收藏数量 + */ + @Override + public Integer getCollectCountByUid(Integer uid) { + LambdaQueryWrapper lqr = Wrappers.lambdaQuery(); + lqr.eq(StoreProductRelation::getUid, uid); + lqr.eq(StoreProductRelation::getType,"collect"); + return mapper.selectCount(lqr).intValue(); + } + + /** + * 根据商品Id取消收藏 + * @param proId 商品Id + * @return Boolean + */ + @Override + public Boolean deleteByProId(Integer proId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(StoreProductRelation::getProductId, proId); + int delete = mapper.delete(lqw); + return delete > 0; + } + + /** + * 根据商品Id取消收藏 + * @param proId 商品Id + * @return Boolean + */ + @Override + public Boolean deleteByProIdAndUid(Integer proId) { + Integer userId = userService.getUserIdException(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(StoreProductRelation::getProductId, proId); + lqw.eq(StoreProductRelation::getUid, userId); + int delete = mapper.delete(lqw); + return delete > 0; + } + + /** + * 根据日期获取收藏量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getCountByDate(String date) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProductRelation::getId); + lqw.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 根据日期获取收藏量 + * @param date 日期,yyyy-MM-dd格式 + * @param proId 商品id + * @return Integer + */ + @Override + public Integer getCountByDateAndProId(String date, Integer proId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProductRelation::getId); + lqw.eq(StoreProductRelation::getProductId, proId); + lqw.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 添加收藏 + * @param request 收藏参数 + */ + @Override + public Boolean add(UserCollectRequest request) { + StoreProductRelation storeProductRelation = new StoreProductRelation(); + BeanUtils.copyProperties(request, storeProductRelation); + storeProductRelation.setUid(userService.getUserIdException()); + return save(storeProductRelation); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductReplyServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductReplyServiceImpl.java new file mode 100644 index 0000000..867fad2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductReplyServiceImpl.java @@ -0,0 +1,535 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.ProductConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductReply; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductReplyAddRequest; +import com.yzt.common.request.StoreProductReplyCommentRequest; +import com.yzt.common.request.StoreProductReplySearchRequest; +import com.yzt.common.response.ProductDetailReplyResponse; +import com.yzt.common.response.ProductReplyResponse; +import com.yzt.common.response.StoreProductReplyResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.common.vo.MyRecord; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.service.mapper.StoreProductReplyMapper; +import com.yzt.service.service.*; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * StoreProductReplyServiceImpl 接口实现 + * + */ +@Service +public class StoreProductReplyServiceImpl extends ServiceImpl + implements StoreProductReplyService { + + @Resource + private StoreProductReplyMapper mapper; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private UserService userService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private TransactionTemplate transactionTemplate; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreProductReplySearchRequest request, PageParamRequest pageParamRequest) { + //带 StoreProductReply 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreProductReply::getIsDel, false); + if (ObjectUtil.isNotNull(request.getIsReply())) { + lambdaQueryWrapper.eq(StoreProductReply::getIsReply, request.getIsReply()); + } + if (StrUtil.isNotBlank(request.getProductSearch())) { + List storeProducts = storeProductService.likeProductName(request.getProductSearch()); + if (CollUtil.isNotEmpty(storeProducts)) { + List productIds = storeProducts.stream().map(StoreProduct::getId).collect(Collectors.toList()); + lambdaQueryWrapper.in(StoreProductReply::getProductId, productIds); + } + } + if (StringUtils.isNotBlank(request.getNickname())) { + lambdaQueryWrapper.like(StoreProductReply::getNickname,request.getNickname()); + } + if (StringUtils.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + lambdaQueryWrapper.between(StoreProductReply::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + lambdaQueryWrapper.orderByDesc(StoreProductReply::getId); + Page pageStoreReply = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + List dataList = mapper.selectList(lambdaQueryWrapper); + List dataResList = new ArrayList<>(); + for (StoreProductReply productReply : dataList) { + StoreProductReplyResponse productReplyResponse = new StoreProductReplyResponse(); + BeanUtils.copyProperties(productReply, productReplyResponse); + StoreProduct storeProduct = storeProductService.getById(productReply.getProductId()); + productReplyResponse.setStoreProduct(storeProduct); + productReplyResponse.setPics(YztUtil.stringToArrayStr(productReply.getPics())); + dataResList.add(productReplyResponse); + } + return CommonPage.copyPageInfo(pageStoreReply, dataResList); + } + + /** + * 商品分数 + * @return Integer + */ + private Integer getSumStar(Integer productId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("IFNULL(sum(product_score),0) as product_score", "IFNULL(sum(service_score),0) as service_score"); + queryWrapper.eq("is_del", 0); + queryWrapper.eq("product_id", productId); + StoreProductReply storeProductReply = mapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(storeProductReply)) { + return 0; + } + if (storeProductReply.getProductScore() == 0 || storeProductReply.getServiceScore() == 0) { + return 0; + } + // 星数 = (商品评星 + 服务评星) / 2 + BigDecimal sumScore = new BigDecimal(storeProductReply.getProductScore() + storeProductReply.getServiceScore()); + BigDecimal divide = sumScore.divide(BigDecimal.valueOf(2L), 0, BigDecimal.ROUND_DOWN); + return divide.intValue(); + } + + /** + * 创建订单商品评价 + * @param request 请求参数 + * @return Boolean + */ + @Override + public Boolean create(StoreProductReplyAddRequest request) { + User user = userService.getInfoException(); + StoreOrder storeOrder = storeOrderService.getByOderId(request.getOrderNo()); + if (ObjectUtil.isNull(storeOrder) || !storeOrder.getUid().equals(user.getUid())) { + throw new YztException("该订单不存在"); + } + StoreProductReply storeProductReply = new StoreProductReply(); + BeanUtils.copyProperties(request, storeProductReply); + storeProductReply.setOid(storeOrder.getId()); + Integer count = checkIsReply(storeProductReply); + storeProductReply.setAvatar(systemAttachmentService.clearPrefix(user.getAvatar())); + storeProductReply.setNickname(user.getNickname()); + if (StringUtils.isNotBlank(request.getPics())) { + String pics = request.getPics().replace("[\"","").replace("\"]","") + .replace("\"",""); + storeProductReply.setPics(systemAttachmentService.clearPrefix(ArrayUtils.toString(pics))); + } + Boolean execute = transactionTemplate.execute(e -> { + save(storeProductReply); + //修改订单详情信息 + storeOrderInfoService.updateReply(storeOrder.getId(),storeProductReply.getProductId(),storeProductReply.getUnique()); + //修改订单信息 + completeOrder(storeProductReply, count, storeOrder); + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("评价订单失败"); + } + return execute; + } + + /** + * 添加虚拟评论 + * @param request 评论参数 + * @return 评论结果 + */ + @Override + public boolean virtualCreate(StoreProductReplyAddRequest request) { + StoreProductReply storeProductReply = new StoreProductReply(); + BeanUtils.copyProperties(request, storeProductReply); + if (StringUtils.isNotBlank(request.getPics())) { + String pics = request.getPics() + .replace("[","") + .replace("]","") + .replace("\"",""); + storeProductReply.setPics(systemAttachmentService.clearPrefix(ArrayUtils.toString(pics))); + } + storeProductReply.setAvatar(systemAttachmentService.clearPrefix(storeProductReply.getAvatar())); + storeProductReply.setUnique(YztUtil.randomCount(11111,9999)+""); + return save(storeProductReply); + } + + /** + * 订单是否已回复 + * @param unique skuId + * @param orderId 订单id + * @return 回复内容 + */ + @Override + public Boolean isReply(String unique, Integer orderId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreProductReply::getUnique, unique); + lqw.eq(StoreProductReply::getOid, orderId); + List replyList = mapper.selectList(lqw); + if (CollUtil.isEmpty(replyList)) { + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + /** + * H5商品评论统计 + * @param productId 商品编号 + * @return MyRecord + */ + @Override + public MyRecord getH5Count(Integer productId) { + // 评论总数 + Integer sumCount = getCountByScore(productId, "all"); + // 好评总数 + Integer goodCount = getCountByScore(productId, "good"); + // 中评总数 + Integer mediumCount = getCountByScore(productId, "medium"); + // 差评总数 + Integer poorCount = getCountByScore(productId, "poor"); + // 好评率 + String replyChance = "0"; + if (sumCount > 0 && goodCount > 0) { + replyChance = String.format("%.2f", ((goodCount.doubleValue() / sumCount.doubleValue()))); + } + // 评分星数(商品评星 + 服务评星)/2 + Integer replyStar = 0; + if (sumCount > 0) { + replyStar = getSumStar(productId); + + } + MyRecord record = new MyRecord(); + record.set("sumCount", sumCount); + record.set("goodCount", goodCount); + record.set("mediumCount", mediumCount); + record.set("poorCount", poorCount); + record.set("replyChance", replyChance); + record.set("replyStar", replyStar); + return record; + } + + /** + * H5商品详情评论信息 + * @param proId 商品编号 + * @return ProductDetailReplyResponse + */ + @Override + public ProductDetailReplyResponse getH5ProductReply(Integer proId) { + ProductDetailReplyResponse response = new ProductDetailReplyResponse(); + + // 评论总数 + Integer sumCount = getCountByScore(proId, "all"); + if (sumCount.equals(0)) { + response.setSumCount(0); + response.setReplyChance("0"); + return response; + } + // 好评总数 + Integer goodCount = getCountByScore(proId, "good"); + // 好评率 + String replyChance = "0"; + if (sumCount > 0 && goodCount > 0) { + replyChance = String.format("%.2f", ((goodCount.doubleValue() / sumCount.doubleValue()))); + } + + // 查询最后一条评论 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreProductReply::getProductId, proId); + lqw.eq(StoreProductReply::getIsDel, false); + lqw.orderByDesc(StoreProductReply::getId); + lqw.last(" limit 1"); + StoreProductReply storeProductReply = mapper.selectOne(lqw); + ProductReplyResponse productReplyResponse = new ProductReplyResponse(); + BeanUtils.copyProperties(storeProductReply, productReplyResponse); + // 评价图 + productReplyResponse.setPics(YztUtil.stringToArrayStr(storeProductReply.getPics())); + // 昵称 + String nickname = storeProductReply.getNickname(); + if (StrUtil.isNotBlank(nickname)) { + if (nickname.length() == 1) { + nickname = nickname.concat("**"); + } else if (nickname.length() == 2) { + nickname = nickname.substring(0, 1) + "**"; + } else { + nickname = nickname.substring(0, 1) + "**" + nickname.substring(nickname.length() - 1); + } + productReplyResponse.setNickname(nickname); + } + // 星数 = (商品评星 + 服务评星) / 2 + BigDecimal sumScore = new BigDecimal(storeProductReply.getProductScore() + storeProductReply.getServiceScore()); + BigDecimal divide = sumScore.divide(BigDecimal.valueOf(2L), 0, BigDecimal.ROUND_DOWN); + productReplyResponse.setScore(divide.intValue()); + + response.setSumCount(sumCount); + response.setReplyChance(replyChance); + response.setProductReply(productReplyResponse); + return response; + } + + /** + * 移动端商品评论列表 + * @param proId 商品编号 + * @param type 评价等级|0=全部,1=好评,2=中评,3=差评 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getH5List(Integer proId, Integer type, PageParamRequest pageParamRequest) { + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreProductReply 类的多条件查询 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreProductReply::getIsDel, false); + lqw.eq(StoreProductReply::getProductId, proId); + //评价等级|0=全部,1=好评,2=中评,3=差评 + switch (type) { + case 1: + lqw.apply(" (product_score + service_score) >= 8"); + break; + case 2: + lqw.apply(" (product_score + service_score) < 8 and (product_score + service_score) > 4"); + break; + case 3: + lqw.apply(" (product_score + service_score) <= 4"); + break; + default: + break; + + } + lqw.orderByDesc(StoreProductReply::getId); + List replyList = mapper.selectList(lqw); + List responseList = new ArrayList<>(); + for (StoreProductReply productReply : replyList) { + ProductReplyResponse productReplyResponse = new ProductReplyResponse(); + BeanUtils.copyProperties(productReply, productReplyResponse); + // 评价图 + productReplyResponse.setPics(YztUtil.stringToArrayStr(productReply.getPics())); + // 昵称 + String nickname = productReply.getNickname(); + if (StrUtil.isNotBlank(nickname)) { + if (nickname.length() == 1) { + nickname = nickname.concat("**"); + } else if (nickname.length() == 2) { + nickname = nickname.substring(0, 1) + "**"; + } else { + nickname = nickname.substring(0, 1) + "**" + nickname.substring(nickname.length() - 1); + } + productReplyResponse.setNickname(nickname); + } + // 星数 = (商品评星 + 服务评星) / 2 + BigDecimal sumScore = new BigDecimal(productReply.getProductScore() + productReply.getServiceScore()); + BigDecimal divide = sumScore.divide(BigDecimal.valueOf(2L), 0, BigDecimal.ROUND_DOWN); + productReplyResponse.setScore(divide.intValue()); + + responseList.add(productReplyResponse); + } + return CommonPage.copyPageInfo(startPage, responseList); + } + + /** + * 删除评论 + * @param id 评论id + * @return Boolean + */ + @Override + public Boolean delete(Integer id) { + LambdaUpdateWrapper lmdUp = new LambdaUpdateWrapper<>(); + lmdUp.set(StoreProductReply::getIsDel, 1); + lmdUp.eq(StoreProductReply::getId, id); + return update(lmdUp); + } + + /** + * 商品评论回复 + * @param request 回复参数 + */ + @Override + public Boolean comment(StoreProductReplyCommentRequest request) { + LambdaUpdateWrapper lup = new LambdaUpdateWrapper<>(); + lup.eq(StoreProductReply::getId, request.getIds()); + lup.set(StoreProductReply::getMerchantReplyContent, request.getMerchantReplyContent()); + lup.set(StoreProductReply::getMerchantReplyTime, YztDateUtil.getNowTime()); + lup.set(StoreProductReply::getIsReply, true); + return update(lup); + } + + + /** + * 获取统计数据(好评、中评、差评) + */ + @Override + public Integer getCountByScore(Integer productId, String type) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(StoreProductReply::getProductId, productId); + lqw.eq(StoreProductReply::getIsDel, false); + + switch (type) { + case ProductConstants.PRODUCT_REPLY_TYPE_ALL: + break; + case ProductConstants.PRODUCT_REPLY_TYPE_GOOD: + lqw.apply(" (product_score + service_score) >= 8"); + break; + case ProductConstants.PRODUCT_REPLY_TYPE_MEDIUM: + lqw.apply(" (product_score + service_score) < 8 and (product_score + service_score) > 4"); + break; + case ProductConstants.PRODUCT_REPLY_TYPE_POOR: + lqw.apply(" (product_score + service_score) <= 4"); + break; + } + return mapper.selectCount(lqw).intValue(); + } + + +// // 获取统计数据(好评、中评、差评) +// private Integer getCountByScore(Integer productId, String type) { +// LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); +// lqw.eq(StoreProductReply::getProductId, productId); +// lqw.eq(StoreProductReply::getIsDel, false); +// +// switch (type) { +// case "all": +// break; +// case "good": +// lqw.apply( " (product_score + service_score) >= 8"); +// break; +// case "medium": +// lqw.apply( " (product_score + service_score) < 8 and (product_score + service_score) > 4"); +// break; +// case "poor": +// lqw.apply( " (product_score + service_score) <= 4"); +// break; +// } +// return mapper.selectCount(lqw); +// } + + /** + * 如果所有的都已评价,那么订单完成 + * + * @since 2020-06-03 + * @return Integer + */ + private void completeOrder(StoreProductReply storeProductReply, Integer count, StoreOrder storeOrder) { + Integer replyCount = getReplyCountByEntity(storeProductReply, true); + + if (replyCount.equals(count)) { + //全部商品都已评价 + storeOrder.setStatus(Constants.ORDER_STATUS_INT_COMPLETE); + storeOrder.setUpdateTime(DateUtil.date()); + storeOrder.setFinishTime(DateUtil.date()); + storeOrderService.updateById(storeOrder); + redisUtil.lPush(Constants.ORDER_TASK_REDIS_KEY_AFTER_COMPLETE_BY_USER, storeOrder.getId()); + } + } + + /** + * 检测当前商品是否可以评论 + * + * @since 2020-06-03 + * @return Integer + */ + private Integer checkIsReply(StoreProductReply storeProductReply) { + + //查看商品信息 + List orderInfoVoList = storeOrderInfoService.getOrderListByOrderId(storeProductReply.getOid()); + if (null == orderInfoVoList || orderInfoVoList.size() < 1) { + throw new YztException("没有找到商品信息"); + } + + boolean findResult = false; + for (StoreOrderInfoOldVo orderInfoVo : orderInfoVoList) { +// Integer productId = orderInfoVo.getInfo().getInteger("product_id"); + Integer productId = orderInfoVo.getInfo().getProductId(); + if (productId < 1) { + continue; + } + + if (storeProductReply.getProductId().equals(productId)) { + findResult = true; + break; + } + } + + if (!findResult) { + throw new YztException("没有找到商品信息"); + } + + //商品是否已评价 + Integer replyCount = getReplyCountByEntity(storeProductReply, false); + if (replyCount > 0) { + throw new YztException("该商品已评价"); + } + + return orderInfoVoList.size(); + } + + /** + * 根据商品id 订单id 用户id 获取评论信息 + * + * @since 2020-06-03 + * @return Integer + */ + private Integer getReplyCountByEntity(StoreProductReply request, boolean isAll) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(StoreProductReply::getOid, request.getOid()); +// .eq(StoreProductReply::getUnique, request.getUnique()); + if (null != request.getUid()) { + lambdaQueryWrapper.eq(StoreProductReply::getUid, request.getUid()); + } + if (!isAll) { + lambdaQueryWrapper.eq(StoreProductReply::getProductId, request.getProductId()); + + } + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRuleServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRuleServiceImpl.java new file mode 100644 index 0000000..7bf13e7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductRuleServiceImpl.java @@ -0,0 +1,94 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.product.StoreProductRule; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreProductRuleRequest; +import com.yzt.common.request.StoreProductRuleSearchRequest; +import com.yzt.service.mapper.StoreProductRuleMapper; +import com.yzt.service.service.StoreProductRuleService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * StoreProductRuleServiceImpl 接口实现 + * + */ +@Service +public class StoreProductRuleServiceImpl extends ServiceImpl implements StoreProductRuleService { + + @Resource + private StoreProductRuleMapper mapper; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(StoreProductRuleSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreProductRule 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(null != request.getKeywords()){ + lambdaQueryWrapper.like(StoreProductRule::getRuleName, request.getKeywords()); + lambdaQueryWrapper.or().like(StoreProductRule::getRuleValue, request.getKeywords()); + } + lambdaQueryWrapper.orderByDesc(StoreProductRule::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增商品规格 + * @param storeProductRuleRequest 规格参数 + * @return 新增结果 + */ + @Override + public boolean save(StoreProductRuleRequest storeProductRuleRequest) { + if(getListByRuleName(storeProductRuleRequest.getRuleName()).size() > 0){ + throw new YztException("此规格值已经存在"); + } + StoreProductRule storeProductRule = new StoreProductRule(); + BeanUtils.copyProperties(storeProductRuleRequest, storeProductRule); + return save(storeProductRule); + } + + /** + * 修改规格 + * @param storeProductRuleRequest 规格参数 + * @return Boolean + */ + @Override + public Boolean updateRule(StoreProductRuleRequest storeProductRuleRequest) { + StoreProductRule storeProductRule = new StoreProductRule(); + BeanUtils.copyProperties(storeProductRuleRequest, storeProductRule); + storeProductRule.setId(storeProductRuleRequest.getId()); + return updateById(storeProductRule); + } + + /** + * 根据规格名称查询同名规格 + * @param ruleName 规格名称 + * @return 查询到的数据 + */ + private List getListByRuleName(String ruleName){ + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(StringUtils.isBlank(ruleName)){ + return new ArrayList<>(); + } + lambdaQueryWrapper.eq(StoreProductRule::getRuleName, ruleName); + return mapper.selectList(lambdaQueryWrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductServiceImpl.java new file mode 100644 index 0000000..64cffc4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreProductServiceImpl.java @@ -0,0 +1,1550 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.parser.Feature; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.DateConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.category.Category; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.product.*; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.result.ProductResultCode; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.MyRecord; +import com.yzt.service.mapper.StoreProductMapper; +import com.yzt.service.delete.ProductUtils; +import com.yzt.service.service.*; +import javax.annotation.Resource; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * + */ +@Service +public class StoreProductServiceImpl extends ServiceImpl + implements StoreProductService { + + @Resource + private StoreProductMapper mapper; + + @Autowired + private StoreProductAttrService attrService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private StoreProductDescriptionService storeProductDescriptionService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private CategoryService categoryService; + + @Autowired + private StoreProductRelationService storeProductRelationService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private StoreProductAttrResultService storeProductAttrResultService; + + @Autowired + private StoreProductCouponService storeProductCouponService; + + @Autowired + private StoreCouponService storeCouponService; + + @Lazy + @Autowired + private ProductUtils productUtils; + + @Autowired + private StoreBargainService storeBargainService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StoreSeckillService storeSeckillService; + + @Autowired + private OnePassService onePassService; + + @Autowired + private StoreCartService storeCartService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private ActivityStyleService activityStyleService; + + private static final Logger logger = LoggerFactory.getLogger(StoreProductServiceImpl.class); + + /** + * 获取产品列表Admin + * @param request 筛选参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getAdminList(StoreProductSearchRequest request, PageParamRequest pageParamRequest) { + //带 StoreProduct 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + //类型搜索 + switch (request.getType()) { + case 1: + //出售中(已上架) + lambdaQueryWrapper.eq(StoreProduct::getIsShow, true); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 2: + //仓库中(未上架) + lambdaQueryWrapper.eq(StoreProduct::getIsShow, false); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 3: + //已售罄 + lambdaQueryWrapper.le(StoreProduct::getStock, 0); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 4: + //警戒库存 + Integer stock = Integer.parseInt(systemConfigService.getValueByKey("store_stock")); + lambdaQueryWrapper.le(StoreProduct::getStock, stock); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 5: + //回收站 + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, true); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + default: + break; + } + //关键字搜索 + if (StrUtil.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.and(i -> i + .or().eq(StoreProduct::getId, request.getKeywords()) + .or().like(StoreProduct::getStoreName, request.getKeywords()) + .or().like(StoreProduct::getKeyword, request.getKeywords())); + } + if(StringUtils.isNotBlank(request.getCateId())){ + List cateIds = Arrays.stream(request.getCateId().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); + lambdaQueryWrapper.in(StoreProduct::getCateId, cateIds); + }else if(StringUtils.isNotBlank(request.getCateName())){ + List byName = categoryService.getByName(request.getCateName()); + List cateIds = byName.stream() + .map(Category::getId) // 假设 Category 有 getId() + .filter(Objects::nonNull) // 防止空 ID + .distinct() + .collect(Collectors.toList()); + lambdaQueryWrapper.in(StoreProduct::getCateId, cateIds); + } + // 新增销量排行和价格排行 + if (StrUtil.isNotBlank(request.getSalesOrder())) { + if (request.getSalesOrder().equals(Constants.SORT_DESC)) { + lambdaQueryWrapper.last(" order by (sales + ficti) desc, sort desc, id desc"); + } else { + lambdaQueryWrapper.last(" order by (sales + ficti) asc, sort asc, id asc"); + } + } else { + if (StrUtil.isNotBlank(request.getPriceOrder())) { + if (request.getPriceOrder().equals(Constants.SORT_DESC)) { + lambdaQueryWrapper.orderByDesc(StoreProduct::getPrice); + } else { + lambdaQueryWrapper.orderByAsc(StoreProduct::getPrice); + } + } + + lambdaQueryWrapper.orderByDesc(StoreProduct::getSort); + lambdaQueryWrapper.orderByDesc(StoreProduct::getId); + } +// lambdaQueryWrapper.orderByDesc(StoreProduct::getSort).orderByDesc(StoreProduct::getId); + + Page storeProductPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + List storeProducts = mapper.selectList(lambdaQueryWrapper); + List storeProductResponses = new ArrayList<>(); + for (StoreProduct product : storeProducts) { + StoreProductResponse storeProductResponse = new StoreProductResponse(); + BeanUtils.copyProperties(product, storeProductResponse); + StoreProductAttr storeProductAttrPram = new StoreProductAttr(); + storeProductAttrPram.setProductId(product.getId()).setType(Constants.PRODUCT_TYPE_NORMAL); + List attrs = attrService.getByEntity(storeProductAttrPram); + + if (attrs.size() > 0) { + storeProductResponse.setAttr(attrs); + } + List storeProductAttrValueResponse = new ArrayList<>(); + + StoreProductAttrValue storeProductAttrValuePram = new StoreProductAttrValue(); + storeProductAttrValuePram.setProductId(product.getId()).setType(Constants.PRODUCT_TYPE_NORMAL); + List storeProductAttrValues = storeProductAttrValueService.getByEntity(storeProductAttrValuePram); + storeProductAttrValues.stream().map(e->{ + StoreProductAttrValueResponse response = new StoreProductAttrValueResponse(); + BeanUtils.copyProperties(e,response); + storeProductAttrValueResponse.add(response); + return e; + }).collect(Collectors.toList()); + storeProductResponse.setAttrValue(storeProductAttrValueResponse); + // 处理富文本 + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, product.getId()) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_NORMAL)); + if (null != sd) { + storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription()); + } + // 处理分类中文 + List cg = categoryService.getByIds(YztUtil.stringToArray(product.getCateId())); + if (CollUtil.isEmpty(cg)) { + storeProductResponse.setCateValues(""); + } else { + storeProductResponse.setCateValues(cg.stream().map(Category::getName).collect(Collectors.joining(","))); + } + + storeProductResponse.setCollectCount( + storeProductRelationService.getList(product.getId(),"collect").size()); + storeProductResponses.add(storeProductResponse); + } + // 多条sql查询处理分页正确 + return CommonPage.copyPageInfo(storeProductPage, storeProductResponses); + } + + public PageInfo getActivityList(ActivityEnrollSearchRequest request, PageParamRequest pageParamRequest) { + Page startPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + List byName = categoryService.getByName("活动报名"); + List cateIds = byName.stream() + .map(Category::getId) // 假设 Category 有 getId() + .filter(Objects::nonNull) // 防止空 ID + .distinct() + .collect(Collectors.toList()); + lqw.in(StoreProduct::getCateId, cateIds); + if(!request.getName().isBlank()){ + lqw.like(StoreProduct::getStoreName,request.getName()); + } + List orderList = mapper.selectList(lqw); + List activityEnrollResponses = orderList.stream().map(e->{ + ActivityEnrollResponse r = new ActivityEnrollResponse(); + r.setId(e.getId()); + r.setActivityName(e.getStoreName()); + r.setKeyword(e.getKeyword()); + r.setAddTime(YztDateUtil.timestamp2DateStr(e.getAddTime()* 1000L, DateConstants.DATE_FORMAT)); + return r; + }).collect(Collectors.toList()); + + return CommonPage.copyPageInfo(startPage, activityEnrollResponses); + } + + /** + * 根据商品id集合获取 + * @param productIds id集合 + * @return + */ + @Override + public List getListInIds(List productIds) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(StoreProduct::getId,productIds); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增产品 + * @param request 新增产品request对象 + * @return 新增结果 + */ + @Override + public Boolean save(StoreProductAddRequest request) { + // 多规格需要校验规格参数 + if (!request.getSpecType()) { + if (request.getAttrValue().size() > 1) { + throw new YztException("单规格商品属性值不能大于1"); + } + } + + StoreProduct storeProduct = new StoreProduct(); + BeanUtils.copyProperties(request, storeProduct); + storeProduct.setId(null); + storeProduct.setAddTime(YztDateUtil.getNowTime()); + storeProduct.setIsShow(false); + + // 设置Acticity活动 + storeProduct.setActivity(getProductActivityStr(request.getActivity())); + + //主图 + storeProduct.setImage(systemAttachmentService.clearPrefix(storeProduct.getImage())); + + //轮播图 + storeProduct.setSliderImage(systemAttachmentService.clearPrefix(storeProduct.getSliderImage())); + // 展示图 + if (StrUtil.isNotEmpty(storeProduct.getFlatPattern())) { + storeProduct.setFlatPattern(systemAttachmentService.clearPrefix(storeProduct.getFlatPattern())); + } + + List attrValueAddRequestList = request.getAttrValue(); + //计算价格 + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + storeProduct.setPrice(minAttrValue.getPrice()); + storeProduct.setOtPrice(minAttrValue.getOtPrice()); + storeProduct.setCost(minAttrValue.getCost()); + storeProduct.setStock(attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getStock).sum()); + + // 默认值设置 + if (ObjectUtil.isNull(request.getSort())) { + storeProduct.setSort(0); + } + if (ObjectUtil.isNull(request.getIsHot())) { + storeProduct.setIsHot(false); + } + if (ObjectUtil.isNull(request.getIsBenefit())) { + storeProduct.setIsBenefit(false); + } + if (ObjectUtil.isNull(request.getIsBest())) { + storeProduct.setIsBest(false); + } + if (ObjectUtil.isNull(request.getIsNew())) { + storeProduct.setIsNew(false); + } + if (ObjectUtil.isNull(request.getIsGood())) { + storeProduct.setIsGood(false); + } + if (ObjectUtil.isNull(request.getGiveIntegral())) { + storeProduct.setGiveIntegral(0); + } + if (ObjectUtil.isNull(request.getFicti())) { + storeProduct.setFicti(0); + } + + List addRequestList = request.getAttr(); + List attrList = addRequestList.stream().map(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + attr.setType(Constants.PRODUCT_TYPE_NORMAL); + return attr; + }).collect(Collectors.toList()); + + List attrValueList = attrValueAddRequestList.stream().map(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setId(null); + attrValue.setSuk(getSku(e.getAttrValue())); + attrValue.setQuota(0); + attrValue.setQuotaShow(0); + attrValue.setType(Constants.PRODUCT_TYPE_NORMAL); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + return attrValue; + }).collect(Collectors.toList()); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_NORMAL); + + Boolean execute = transactionTemplate.execute(e -> { + save(storeProduct); + + attrList.forEach(attr -> attr.setProductId(storeProduct.getId())); + attrValueList.forEach(value -> value.setProductId(storeProduct.getId())); + attrService.saveBatch(attrList); + storeProductAttrValueService.saveBatch(attrValueList); + + spd.setProductId(storeProduct.getId()); + storeProductDescriptionService.deleteByProductId(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + storeProductDescriptionService.save(spd); + + if (CollUtil.isNotEmpty(request.getCouponIds())) { + List couponList = new ArrayList<>(); + for (Integer couponId : request.getCouponIds()) { + StoreProductCoupon spc = new StoreProductCoupon(storeProduct.getId(), couponId, YztDateUtil.getNowTime()); + couponList.add(spc); + } + storeProductCouponService.saveBatch(couponList); + } + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 商品sku + * @param attrValue json字符串 + * @return sku + */ + private String getSku(String attrValue) { + if (StrUtil.isEmpty(attrValue)) { + throw new YztException("商品属性值不能为空"); + } + LinkedHashMap linkedHashMap = JSONObject.parseObject(attrValue, LinkedHashMap.class, Feature.OrderedField); + Iterator> iterator = linkedHashMap.entrySet().iterator(); + List strings = CollUtil.newArrayList(); + while (iterator.hasNext()) { + Map.Entry next = iterator.next(); + strings.add(next.getValue()); + } +// List strings = jsonObject.values().stream().map(o -> (String) o).collect(Collectors.toList()); + return String.join(",", strings); + } + + /** + * 商品活动字符串 + * @param activityList 活动数组 + * @return 商品活动字符串 + */ + private String getProductActivityStr(List activityList) { + if (CollUtil.isEmpty(activityList)) { + return "0, 1, 2, 3"; + } + List activities = new ArrayList<>(); + activityList.forEach(e->{ + switch (e) { + case Constants.PRODUCT_TYPE_NORMAL_STR: + activities.add(Constants.PRODUCT_TYPE_NORMAL); + break; + case Constants.PRODUCT_TYPE_SECKILL_STR: + activities.add(Constants.PRODUCT_TYPE_SECKILL); + break; + case Constants.PRODUCT_TYPE_BARGAIN_STR: + activities.add(Constants.PRODUCT_TYPE_BARGAIN); + break; + case Constants.PRODUCT_TYPE_PINGTUAN_STR: + activities.add(Constants.PRODUCT_TYPE_PINGTUAN); + break; + } + }); + return activities.stream().map(Object::toString).collect(Collectors.joining(",")); + } + + /** + * 更新商品信息 + * @param storeProductRequest 商品参数 + * @return 更新结果 + */ + @Override + public Boolean update(StoreProductAddRequest storeProductRequest) { + if (ObjectUtil.isNull(storeProductRequest.getId())) { + throw new YztException("商品ID不能为空"); + } + + if (!storeProductRequest.getSpecType()) { + if (storeProductRequest.getAttrValue().size() > 1) { + throw new YztException("单规格商品属性值不能大于1"); + } + } + + StoreProduct tempProduct = getById(storeProductRequest.getId()); + if (ObjectUtil.isNull(tempProduct)) { + throw new YztException("商品不存在"); + } + if (tempProduct.getIsRecycle() || tempProduct.getIsDel()) { + throw new YztException("商品已删除"); + } + if (tempProduct.getIsShow()) { + throw new YztException("请先下架商品,再进行修改"); + } + // 如果商品是活动商品主商品不允许修改 +// if (storeSeckillService.isExistByProductId(storeProductRequest.getId())) { +// throw new YztException("商品作为秒杀商品的主商品,需要修改请先删除对应秒杀商品"); +// } +// if (storeBargainService.isExistByProductId(storeProductRequest.getId())) { +// throw new YztException("商品作为砍价商品的主商品,需要修改请先删除对应砍价商品"); +// } +// if (storeCombinationService.isExistByProductId(storeProductRequest.getId())) { +// throw new YztException("商品作为拼团商品的主商品,需要修改请先删除对应拼团商品"); +// } + + StoreProduct storeProduct = new StoreProduct(); + BeanUtils.copyProperties(storeProductRequest, storeProduct); + + // 设置Activity活动 + storeProduct.setActivity(getProductActivityStr(storeProductRequest.getActivity())); + + //主图 + storeProduct.setImage(systemAttachmentService.clearPrefix(storeProduct.getImage())); + + //轮播图 + storeProduct.setSliderImage(systemAttachmentService.clearPrefix(storeProduct.getSliderImage())); + + List attrValueAddRequestList = storeProductRequest.getAttrValue(); + //计算价格 + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + storeProduct.setPrice(minAttrValue.getPrice()); + storeProduct.setOtPrice(minAttrValue.getOtPrice()); + storeProduct.setCost(minAttrValue.getCost()); + storeProduct.setStock(attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getStock).sum()); + + // attr部分 + List addRequestList = storeProductRequest.getAttr(); + List attrAddList = CollUtil.newArrayList(); + List attrUpdateList = CollUtil.newArrayList(); + addRequestList.forEach(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + if (ObjectUtil.isNull(attr.getId())) { + attr.setProductId(storeProduct.getId()); + attr.setType(Constants.PRODUCT_TYPE_NORMAL); + attrAddList.add(attr); + } else { + attr.setIsDel(false); + attrUpdateList.add(attr); + } + }); + + // attrValue部分 + List attrValueAddList = CollUtil.newArrayList(); + List attrValueUpdateList = CollUtil.newArrayList(); + attrValueAddRequestList.forEach(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setSuk(getSku(e.getAttrValue())); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + if (ObjectUtil.isNull(attrValue.getId()) || attrValue.getId().equals(0)) { + attrValue.setId(null); + attrValue.setProductId(storeProduct.getId()); + attrValue.setQuota(0); + attrValue.setQuotaShow(0); + attrValue.setType(Constants.PRODUCT_TYPE_NORMAL); + attrValueAddList.add(attrValue); + } else { + attrValue.setIsDel(false); + attrValueUpdateList.add(attrValue); + } + }); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(storeProductRequest.getContent().length() > 0 ? systemAttachmentService.clearPrefix(storeProductRequest.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_NORMAL); + spd.setProductId(storeProduct.getId()); + + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(storeProduct); + + // 先删除原用attr+value + attrService.deleteByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + storeProductAttrValueService.deleteByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + + if (CollUtil.isNotEmpty(attrAddList)) { + attrService.saveBatch(attrAddList); + } + if (CollUtil.isNotEmpty(attrUpdateList)) { + attrService.saveOrUpdateBatch(attrUpdateList); + } + + if (CollUtil.isNotEmpty(attrValueAddList)) { + storeProductAttrValueService.saveBatch(attrValueAddList); + } + if (CollUtil.isNotEmpty(attrValueUpdateList)) { + storeProductAttrValueService.saveOrUpdateBatch(attrValueUpdateList); + } + + storeProductDescriptionService.deleteByProductId(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + storeProductDescriptionService.save(spd); + + if (CollUtil.isNotEmpty(storeProductRequest.getCouponIds())) { + storeProductCouponService.deleteByProductId(storeProduct.getId()); + List couponList = new ArrayList<>(); + for (Integer couponId : storeProductRequest.getCouponIds()) { + StoreProductCoupon spc = new StoreProductCoupon(storeProduct.getId(), couponId, YztDateUtil.getNowTime()); + couponList.add(spc); + } + storeProductCouponService.saveBatch(couponList); + } else { + storeProductCouponService.deleteByProductId(storeProduct.getId()); + } + + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 商品详情 + * @param id 商品id + * @return 详情数据 + */ + @Override + public StoreProductResponse getByProductId(Integer id) { + StoreProduct storeProduct = mapper.selectById(id); + if (null == storeProduct) throw new YztException("未找到对应商品信息"); + StoreProductResponse storeProductResponse = new StoreProductResponse(); + BeanUtils.copyProperties(storeProduct, storeProductResponse); + StoreProductAttr spaPram = new StoreProductAttr(); + spaPram.setProductId(storeProduct.getId()).setType(Constants.PRODUCT_TYPE_NORMAL); + storeProductResponse.setAttr(attrService.getByEntity(spaPram)); + + // 设置商品所参与的活动 + storeProductResponse.setActivityH5(productUtils.getProductCurrentActivity(storeProduct)); + StoreProductAttrValue spavPram = new StoreProductAttrValue(); + spavPram.setProductId(id).setType(Constants.PRODUCT_TYPE_NORMAL); + List storeProductAttrValues = storeProductAttrValueService.getByEntity(spavPram); + // 根据attrValue生成前端所需的数据 + List> attrValues = new ArrayList<>(); + + if (storeProduct.getSpecType()) { + // 后端多属性用于编辑 + StoreProductAttrResult sparPram = new StoreProductAttrResult(); + sparPram.setProductId(storeProduct.getId()).setType(Constants.PRODUCT_TYPE_NORMAL); + List attrResults = storeProductAttrResultService.getByEntity(sparPram); + if (null == attrResults || attrResults.size() == 0) { + throw new YztException("未找到对应属性值"); + } + StoreProductAttrResult attrResult = attrResults.get(0); + //PC 端生成skuAttrInfo + List storeProductAttrValueRequests = + JSONObject.parseArray(attrResult.getResult(), StoreProductAttrValueRequest.class); + if (null != storeProductAttrValueRequests) { + for (int i = 0; i < storeProductAttrValueRequests.size(); i++) { +// StoreProductAttrValueRequest storeProductAttrValueRequest = storeProductAttrValueRequests.get(i); + HashMap attrValue = new HashMap<>(); + String currentSku = storeProductAttrValues.get(i).getSuk(); + List hasCurrentSku = + storeProductAttrValues.stream().filter(e -> e.getSuk().equals(currentSku)).collect(Collectors.toList()); + StoreProductAttrValue currentAttrValue = hasCurrentSku.get(0); + attrValue.put("id", hasCurrentSku.size() > 0 ? hasCurrentSku.get(0).getId():0); + attrValue.put("image", currentAttrValue.getImage()); + attrValue.put("cost", currentAttrValue.getCost()); + attrValue.put("price", currentAttrValue.getPrice()); + attrValue.put("otPrice", currentAttrValue.getOtPrice()); + attrValue.put("stock", currentAttrValue.getStock()); + attrValue.put("barCode", currentAttrValue.getBarCode()); + attrValue.put("weight", currentAttrValue.getWeight()); + attrValue.put("volume", currentAttrValue.getVolume()); + attrValue.put("suk", currentSku); + attrValue.put("attrValue", JSON.parseObject(storeProductAttrValues.get(i).getAttrValue(), Feature.OrderedField)); + attrValue.put("brokerage", currentAttrValue.getBrokerage()); + attrValue.put("brokerageTwo", currentAttrValue.getBrokerageTwo()); + String[] skus = currentSku.split(","); + for (int k = 0; k < skus.length; k++) { + attrValue.put("value"+k,skus[k]); + } + attrValues.add(attrValue); + } + } + } + + // H5 端用于生成skuList + List sPAVResponses = new ArrayList<>(); + + for (StoreProductAttrValue storeProductAttrValue : storeProductAttrValues) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + BeanUtils.copyProperties(storeProductAttrValue,atr); + sPAVResponses.add(atr); + } + storeProductResponse.setAttrValues(attrValues); + storeProductResponse.setAttrValue(sPAVResponses); +// if (null != storeProductAttrResult) { + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, storeProduct.getId()) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_NORMAL)); + if (null != sd) { + storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription()); + } +// } + // 获取已关联的优惠券 + List storeProductCoupons = storeProductCouponService.getListByProductId(storeProduct.getId()); + if (null != storeProductCoupons && storeProductCoupons.size() > 0) { + List ids = storeProductCoupons.stream().map(StoreProductCoupon::getIssueCouponId).collect(Collectors.toList()); + List shipCoupons = storeCouponService.getByIds(ids); + storeProductResponse.setCoupons(shipCoupons); + storeProductResponse.setCouponIds(ids); + } + return storeProductResponse; + } + + /** + * 通过ID获取商品列表 + * + * @param proIdsList 商品ID列表 + * @param label admin-管理端,front-移动端 + */ + @Override + public List findByIds(List proIdsList, String label) { + return findByIdsAndLabel(proIdsList, label); + } + + + /** + * 商品详情(管理端) + * @param id 商品id + * @return StoreProductInfoResponse + */ + @Override + public StoreProductInfoResponse getInfo(Integer id) { + StoreProduct storeProduct = mapper.selectById(id); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("未找到对应商品信息"); + } + + StoreProductInfoResponse storeProductResponse = new StoreProductInfoResponse(); + BeanUtils.copyProperties(storeProduct, storeProductResponse); + + // 设置商品所参与的活动 + List activityList = getProductActivityList(storeProduct.getActivity()); + storeProductResponse.setActivity(activityList); + + List attrList = attrService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + storeProductResponse.setAttr(attrList); + + List attrValueList = storeProductAttrValueService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + List valueResponseList = attrValueList.stream().map(e -> { + AttrValueResponse valueResponse = new AttrValueResponse(); + BeanUtils.copyProperties(e, valueResponse); + return valueResponse; + }).collect(Collectors.toList()); + storeProductResponse.setAttrValue(valueResponseList); + + StoreProductDescription sd = storeProductDescriptionService.getByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL); + if (ObjectUtil.isNotNull(sd)) { + storeProductResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + + // 获取已关联的优惠券 + List storeProductCoupons = storeProductCouponService.getListByProductId(storeProduct.getId()); + if (CollUtil.isNotEmpty(storeProductCoupons)) { + List ids = storeProductCoupons.stream().map(StoreProductCoupon::getIssueCouponId).collect(Collectors.toList()); + storeProductResponse.setCouponIds(ids); + } + return storeProductResponse; + } + + /** + * 商品活动字符列表 + * @param activityStr 商品活动字符串 + * @return 商品活动字符列表 + */ + private List getProductActivityList(String activityStr) { + List activityList = CollUtil.newArrayList(); + if (activityStr.equals("0, 1, 2, 3")) { + activityList.add(Constants.PRODUCT_TYPE_NORMAL_STR); + activityList.add(Constants.PRODUCT_TYPE_SECKILL_STR); + activityList.add(Constants.PRODUCT_TYPE_BARGAIN_STR); + activityList.add(Constants.PRODUCT_TYPE_PINGTUAN_STR); + return activityList; + } + String[] split = activityStr.split(","); + for (String s : split) { + Integer integer = Integer.valueOf(s); + if (integer.equals(Constants.PRODUCT_TYPE_NORMAL)) { + activityList.add(Constants.PRODUCT_TYPE_NORMAL_STR); + } + if (integer.equals(Constants.PRODUCT_TYPE_SECKILL)) { + activityList.add(Constants.PRODUCT_TYPE_SECKILL_STR); + } + if (integer.equals(Constants.PRODUCT_TYPE_BARGAIN)) { + activityList.add(Constants.PRODUCT_TYPE_BARGAIN_STR); + } + if (integer.equals(Constants.PRODUCT_TYPE_PINGTUAN)) { + activityList.add(Constants.PRODUCT_TYPE_PINGTUAN_STR); + } + } + return activityList; + } + + /** + * 根据商品tabs获取对应类型的产品数量 + * @return List + */ + @Override + public List getTabsHeader(StoreProductHeaderRequest request) { + List headers = new ArrayList<>(); + StoreProductTabsHeader header1 = new StoreProductTabsHeader(0,"出售中商品",1); + StoreProductTabsHeader header2 = new StoreProductTabsHeader(0,"仓库中商品",2); + StoreProductTabsHeader header3 = new StoreProductTabsHeader(0,"已经售馨商品",3); + StoreProductTabsHeader header4 = new StoreProductTabsHeader(0,"警戒库存",4); + StoreProductTabsHeader header5 = new StoreProductTabsHeader(0,"商品回收站",5); + headers.add(header1); + headers.add(header2); + headers.add(header3); + headers.add(header4); + headers.add(header5); + for (StoreProductTabsHeader h : headers) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + switch (h.getType()) { + case 1: + //出售中(已上架) + lambdaQueryWrapper.eq(StoreProduct::getIsShow, true); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 2: + //仓库中(未上架) + lambdaQueryWrapper.eq(StoreProduct::getIsShow, false); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 3: + //已售罄 + lambdaQueryWrapper.le(StoreProduct::getStock, 0); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 4: + //警戒库存 + Integer stock = Integer.parseInt(systemConfigService.getValueByKey("store_stock")); + lambdaQueryWrapper.le(StoreProduct::getStock, stock); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + case 5: + //回收站 + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, true); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + break; + default: + break; + } + //关键字搜索 + if (StrUtil.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.and(i -> i + .or().eq(StoreProduct::getId, request.getKeywords()) + .or().like(StoreProduct::getStoreName, request.getKeywords()) + .or().like(StoreProduct::getKeyword, request.getKeywords())); + } + //分类搜索 + if(StringUtils.isNotBlank(request.getCateId())){ + List cateIds = Arrays.stream(request.getCateId().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); + lambdaQueryWrapper.in(StoreProduct::getCateId, cateIds); + } + List storeProducts = mapper.selectList(lambdaQueryWrapper); + h.setCount(storeProducts.size()); + } + + return headers; + } + + /** + * 后台任务批量操作库存 + */ + @Override + public void consumeProductStock() { + String redisKey = Constants.PRODUCT_STOCK_UPDATE; + Long size = redisUtil.getListSize(redisKey); + logger.info("StoreProductServiceImpl.doProductStock | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try { + StoreProductStockRequest storeProductStockRequest = + JSONObject.toJavaObject(JSONObject.parseObject(data.toString()), StoreProductStockRequest.class); + boolean result = doProductStock(storeProductStockRequest); + if (!result) { + redisUtil.lPush(redisKey, data); + } + } catch (Exception e) { + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 根据其他平台url导入产品信息 + * @param url 待导入平台url + * @param tag 1=淘宝,2=京东,3=苏宁,4=拼多多, 5=天猫 + * @return StoreProductRequest + */ + @Override + public StoreProductRequest importProductFromUrl(String url, int tag) { + StoreProductRequest productRequest = null; + try { + switch (tag) { + case 1: + productRequest = productUtils.getTaobaoProductInfo(url,tag); + break; + case 2: + productRequest = productUtils.getJDProductInfo(url,tag); + break; + case 3: + productRequest = productUtils.getSuningProductInfo(url,tag); + break; + case 4: + productRequest = productUtils.getPddProductInfo(url,tag); + break; + case 5: + productRequest = productUtils.getTmallProductInfo(url,tag); + break; + } + } catch (Exception e) { + throw new YztException("确认URL和平台是否正确,以及平台费用是否足额"+e.getMessage()); + } + return productRequest; + } + + /** + * + * @param productId 商品id + * @param type 类型:recycle——回收站 delete——彻底删除 + * @return Boolean + */ + @Override + public Boolean deleteProduct(Integer productId, String type) { + StoreProduct product = getById(productId); + if (ObjectUtil.isNull(product)) { + throw new YztException("商品不存在"); + } + if (StrUtil.isNotBlank(type) && "recycle".equals(type) && product.getIsDel()) { + throw new YztException("商品已存在回收站"); + } + + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + if (StrUtil.isNotBlank(type) && "delete".equals(type)) { + // 判断商品活动状态(秒杀、砍价、拼团) + isExistActivity(productId); + + lambdaUpdateWrapper.eq(StoreProduct::getId, productId); + lambdaUpdateWrapper.set(StoreProduct::getIsDel, true); + return update(lambdaUpdateWrapper); + } + lambdaUpdateWrapper.eq(StoreProduct::getId, productId); + lambdaUpdateWrapper.set(StoreProduct::getIsRecycle, true); + return update(lambdaUpdateWrapper); + } + + /** + * 判断商品活动状态(秒杀、砍价、拼团) + * @param productId + */ + private void isExistActivity(Integer productId) { + Boolean existActivity = false; + // 秒杀活动判断 + existActivity = storeSeckillService.isExistActivity(productId); + if (existActivity) { + throw new YztException("有商品关联的秒杀商品活动开启中,不能删除"); + } + // 砍价活动判断 + existActivity = storeBargainService.isExistActivity(productId); + if (existActivity) { + throw new YztException("有商品关联的砍价商品活动开启中,不能删除"); + } + // 拼团活动判断 + existActivity = storeCombinationService.isExistActivity(productId); + if (existActivity) { + throw new YztException("有商品关联的拼团商品活动开启中,不能删除"); + } + } + + /** + * 恢复已删除的商品 + * @param productId 商品id + * @return 恢复结果 + */ + @Override + public Boolean reStoreProduct(Integer productId) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.set(StoreProduct::getIsRecycle, 0); + lambdaUpdateWrapper.eq(StoreProduct::getId, productId); + return update(lambdaUpdateWrapper); + } + + /** + * 扣减库存任务操作 + * @param storeProductStockRequest 扣减库存参数 + * @return 执行结果 + */ + @Override + public boolean doProductStock(StoreProductStockRequest storeProductStockRequest) { + // 获取商品本身信息 + StoreProduct existProduct = getById(storeProductStockRequest.getProductId()); + List existAttr = + storeProductAttrValueService.getListByProductIdAndAttrId( + storeProductStockRequest.getProductId(), + storeProductStockRequest.getAttrId().toString(), + storeProductStockRequest.getType()); + if (null == existProduct || null == existAttr) { // 未找到商品 + logger.info("库存修改任务未获取到商品信息"+JSON.toJSONString(storeProductStockRequest)); + return true; + } + + // 回滚商品库存/销量 并更新 + boolean isPlus = storeProductStockRequest.getOperationType().equals("add"); + int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum(); + existProduct.setStock(productStock); + existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum()); + updateById(existProduct); + + // 回滚sku库存 + for (StoreProductAttrValue attrValue : existAttr) { + int productAttrStock = isPlus ? attrValue.getStock() + storeProductStockRequest.getNum() : attrValue.getStock() - storeProductStockRequest.getNum(); + attrValue.setStock(productAttrStock); + attrValue.setSales(attrValue.getSales()-storeProductStockRequest.getNum()); + storeProductAttrValueService.updateById(attrValue); + } + return true; + } + + /** + * 获取复制商品配置 + * @return copyType 复制类型:1:一号通 + * copyNum 复制条数(一号通类型下有值) + */ + @Override + public MyRecord copyConfig() { + String copyType = systemConfigService.getValueByKey("system_product_copy_type"); + if (StrUtil.isBlank(copyType)) { + throw new YztException("请先进行采集商品配置"); + } + int copyNum = 0; + if (copyType.equals("1")) {// 一号通 + JSONObject info = onePassService.info(); + copyNum = Optional.ofNullable(info.getJSONObject("copy").getInteger("num")).orElse(0); + } + MyRecord record = new MyRecord(); + record.set("copyType", copyType); + record.set("copyNum", copyNum); + return record; + } + + /** + * 复制平台商品 + * @param url 商品链接 + * @return MyRecord + */ + @Override + public MyRecord copyProduct(String url) { + JSONObject jsonObject = onePassService.copyGoods(url); + StoreProductRequest storeProductRequest = ProductUtils.onePassCopyTransition(jsonObject); + MyRecord record = new MyRecord(); + return record.set("info", storeProductRequest); + } + + /** + * 添加/扣减库存 + * @param id 商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + */ + @Override + public Boolean operationStock(Integer id, Integer num, String type, Integer version) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("quick_add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + } + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + } + if (type.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format(" and (stock - {} >= 0)", num)); + } + updateWrapper.setSql("version = version + 1"); + updateWrapper.eq("id", id); +// updateWrapper.eq("version", version); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新普通商品库存失败,商品id = " + id); + } + return update; + } + + /** + * 下架 + * @param id 商品id + */ + @Override + public Boolean offShelf(Integer id) { + StoreProduct storeProduct = getById(id); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("商品不存在"); + } + if (!storeProduct.getIsShow()) { + return true; + } + + storeProduct.setIsShow(false); + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(storeProduct); + storeCartService.productStatusNotEnable(id); + // 商品下架时,清除用户收藏 + storeProductRelationService.deleteByProId(storeProduct.getId()); + return Boolean.TRUE; + }); + + return execute; + } + + /** + * 上架 + * @param id 商品id + * @return Boolean + */ + @Override + public Boolean putOnShelf(Integer id) { + StoreProduct storeProduct = getById(id); + if (ObjectUtil.isNull(storeProduct)) { + throw new YztException("商品不存在"); + } + if (storeProduct.getIsShow()) { + return true; + } + + // 获取商品skuid + StoreProductAttrValue tempSku = new StoreProductAttrValue(); + tempSku.setProductId(id); + tempSku.setType(Constants.PRODUCT_TYPE_NORMAL); + List skuList = storeProductAttrValueService.getByEntity(tempSku); + List skuIdList = skuList.stream().map(StoreProductAttrValue::getId).collect(Collectors.toList()); + + storeProduct.setIsShow(true); + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(storeProduct); + storeCartService.productStatusNoEnable(skuIdList); + return Boolean.TRUE; + }); + return execute; + } + + /** + * 首页商品列表 + * @param type 类型 【1 精品推荐 2 热门榜单 3首发新品 4促销单品】 + * @param pageParamRequest 分页参数 + * @return CommonPage + */ + @Override + public List getIndexProduct(Integer type, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(StoreProduct::getId, StoreProduct::getImage, StoreProduct::getStoreName, + StoreProduct::getPrice, StoreProduct::getOtPrice, StoreProduct::getActivity, StoreProduct::getCateId); + switch (type) { + case Constants.INDEX_RECOMMEND_BANNER: //精品推荐 + lambdaQueryWrapper.eq(StoreProduct::getIsBest, true); + break; + case Constants.INDEX_HOT_BANNER: //热门榜单 + lambdaQueryWrapper.eq(StoreProduct::getIsHot, true); + break; + case Constants.INDEX_NEW_BANNER: //首发新品 + lambdaQueryWrapper.eq(StoreProduct::getIsNew, true); + break; + case Constants.INDEX_BENEFIT_BANNER: //促销单品 + lambdaQueryWrapper.eq(StoreProduct::getIsBenefit, true); + break; + case Constants.INDEX_GOOD_BANNER: // 优选推荐 + lambdaQueryWrapper.eq(StoreProduct::getIsGood, true); + break; + } + + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.gt(StoreProduct::getStock, 0); + lambdaQueryWrapper.eq(StoreProduct::getIsShow, true); + + lambdaQueryWrapper.orderByDesc(StoreProduct::getSort); + lambdaQueryWrapper.orderByDesc(StoreProduct::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 获取商品移动端列表 + * @param request 筛选参数 + * @param pageRequest 分页参数 + * @return List + */ + @Override + public List findH5List(ProductRequest request, PageParamRequest pageRequest) { + + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + // id、名称、图片、价格、销量、活动 + lqw.select(StoreProduct::getId, StoreProduct::getStoreName, StoreProduct::getImage, StoreProduct::getPrice, + StoreProduct::getActivity, StoreProduct::getSales, StoreProduct::getFicti, StoreProduct::getUnitName, + StoreProduct::getFlatPattern, StoreProduct::getStock, StoreProduct::getCateId); + + lqw.eq(StoreProduct::getIsRecycle, false); + lqw.eq(StoreProduct::getIsDel, false); + lqw.eq(StoreProduct::getMerId, false); + lqw.gt(StoreProduct::getStock, 0); + lqw.eq(StoreProduct::getIsShow, true); + if (ObjectUtil.isNotNull(request.getCid()) && !request.getCid().isEmpty()) { + List cidList = Stream.of(request.getCid().split(",")).map(Integer::valueOf).collect(Collectors.toList()); + //查找当前类下的所有子类 + List childVoListByPids = categoryService.getByPIds(cidList); + List categoryIdList = childVoListByPids.stream().map(Category::getId).collect(Collectors.toList()); + categoryIdList.addAll(cidList); + lqw.apply(YztUtil.getFindInSetSql("cate_id", (ArrayList) categoryIdList)); + } + + if (StrUtil.isNotBlank(request.getKeyword())) { +// if (YztUtil.isString2Num(request.getKeyword())) { +// Integer productId = Integer.valueOf(request.getKeyword()); +// lqw.like(StoreProduct::getId, productId); +// } else { + lqw.and(i -> i.like(StoreProduct::getStoreName, request.getKeyword()) + .or().like(StoreProduct::getKeyword, request.getKeyword())); +// } + } + + // 排序部分 + if (StrUtil.isNotBlank(request.getSalesOrder())) { + if (request.getSalesOrder().equals(Constants.SORT_DESC)) { + lqw.last(" order by (sales + ficti) desc, sort desc, id desc"); + } else { + lqw.last(" order by (sales + ficti) asc, sort asc, id asc"); + } + } else { + if (StrUtil.isNotBlank(request.getPriceOrder())) { + if (request.getPriceOrder().equals(Constants.SORT_DESC)) { + lqw.orderByDesc(StoreProduct::getPrice); + } else { + lqw.orderByAsc(StoreProduct::getPrice); + } + } + + lqw.orderByDesc(StoreProduct::getSort); + lqw.orderByDesc(StoreProduct::getId); + } + PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + List storeProducts = mapper.selectList(lqw); + storeProducts.forEach(storeProduct -> { + storeProduct.setSales(storeProduct.getSales() + storeProduct.getFicti()); + }); + return storeProducts; + } + + /** + * 获取移动端商品详情 + * @param id 商品id + * @return StoreProduct + */ + @Override + public StoreProduct getH5Detail(Integer id) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProduct::getId, StoreProduct::getImage, StoreProduct::getStoreName, StoreProduct::getSliderImage, + StoreProduct::getOtPrice, StoreProduct::getStock, StoreProduct::getSales, StoreProduct::getPrice, StoreProduct::getActivity, + StoreProduct::getFicti, StoreProduct::getIsSub, StoreProduct::getBrowse, StoreProduct::getUnitName, + StoreProduct::getBarCode, StoreProduct::getCateId); + lqw.eq(StoreProduct::getId, id); + lqw.eq(StoreProduct::getIsRecycle, false); + lqw.eq(StoreProduct::getIsDel, false); + lqw.eq(StoreProduct::getIsShow, true); + StoreProduct storeProduct = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeProduct)) { +// throw new YztException(StrUtil.format("未找到编号为{}的商品", id)); + throw new YztException(ProductResultCode.PRODUCT_IS_NOT_SHOW); + } + + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, storeProduct.getId()) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_NORMAL)); + if (ObjectUtil.isNotNull(sd)) { + storeProduct.setContent(StrUtil.isBlank(sd.getDescription()) ? "" : sd.getDescription()); + } + return storeProduct; + } + + /** + * 获取购物车商品信息 + * @param productId 商品编号 + * @return StoreProduct + */ + @Override + public StoreProduct getCartByProId(Integer productId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProduct::getId, StoreProduct::getImage, StoreProduct::getStoreName); + lqw.eq(StoreProduct::getId, productId); + return mapper.selectOne(lqw); + } + + /** + * 根据日期获取新增商品数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getNewProductByDate(String date) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProduct::getId); + lqw.eq(StoreProduct::getIsDel, 0); + lqw.apply("date_format(add_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 获取所有未删除的商品 + * @return List + */ + @Override + public List findAllProductByNotDelte() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProduct::getId); + lqw.eq(StoreProduct::getIsDel, 0); + return mapper.selectList(lqw); + } + + /** + * 模糊搜索商品名称 + * @param productName 商品名称 + * @return List + */ + @Override + public List likeProductName(String productName) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreProduct::getId); + lqw.like(StoreProduct::getStoreName, productName); + lqw.eq(StoreProduct::getIsDel, 0); + return mapper.selectList(lqw); + } + + /** + * 警戒库存数量 + * @return Integer + */ + @Override + public Integer getVigilanceInventoryNum() { + Integer stock = Integer.parseInt(systemConfigService.getValueByKey("store_stock")); + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.le(StoreProduct::getStock, stock); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 销售中(上架)商品数量 + * @return Integer + */ + @Override + public Integer getOnSaleNum() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreProduct::getIsShow, true); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 未销售(仓库)商品数量 + * @return Integer + */ + @Override + public Integer getNotSaleNum() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreProduct::getIsShow, false); + lambdaQueryWrapper.eq(StoreProduct::getIsRecycle, false); + lambdaQueryWrapper.eq(StoreProduct::getIsDel, false); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 获取商品排行榜 + * 1. 3个商品以内不返回数据 + * 2. TOP10 + * @return List + */ + @Override + public List getLeaderboard() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_show", true); + queryWrapper.eq("is_recycle", false); + queryWrapper.eq("is_del", false); + queryWrapper.last("limit 10"); + Integer count = mapper.selectCount(queryWrapper).intValue(); + if (count < 4) { + return CollUtil.newArrayList(); + } + queryWrapper.select("id", "store_name", "image", "price", "ot_price", "(sales + ficti) as sales, cate_id"); + queryWrapper.orderByDesc("sales"); + List storeProducts = mapper.selectList(queryWrapper); + // 查询活动边框配置信息, 并赋值给商品response 重复添加的商品数据会根据数据添加持续覆盖后的为准 + storeProducts = activityStyleService.makeActivityBorderStyle(storeProducts); + return storeProducts; + } + + /** + * 是否有商品使用运费模板 + * @return Boolean + */ + @Override + public Boolean isUseShippingTemplateId(Integer templateId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreProduct::getTempId, templateId); + lqw.eq(StoreProduct::getIsDel, false); + return mapper.selectCount(lqw) > 0; + } + + /** + * 获取商品所用的分类(包含父级分类) + * @param productIdList 商品ID列表 + * @return 商品分类及所有父级分类ID + */ + @Override + public List getProductAllCategoryIdByProductIds(List productIdList) { + List idList = new ArrayList<>(); + + if (CollUtil.isEmpty(productIdList)) { + return idList; + } + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(StoreProduct::getId, StoreProduct::getCateId); + lqw.in(StoreProduct::getId, productIdList); + List productList = mapper.selectList(lqw); + if (CollUtil.isEmpty(productList)) { + return idList; + } + //把所有的分类id写入集合 + for (StoreProduct storeProduct : productList) { + List categoryIdList = YztUtil.stringToArray(storeProduct.getCateId()); + idList.addAll(categoryIdList); + } + + //去重 + List cateIdList = idList.stream().distinct().collect(Collectors.toList()); + + List categoryList = categoryService.getByIds(cateIdList); + if (CollUtil.isEmpty(categoryList)) { + return idList; + } + + for (Category category: categoryList) { + List parentIdList = YztUtil.stringToArrayByRegex(category.getPath(), "/"); + if (CollUtil.isNotEmpty(parentIdList)) { + for (Integer parentId : parentIdList) { + if (parentId > 0) { + idList.add(parentId); + } + } + } + } + + return idList.stream().distinct().collect(Collectors.toList()); + } + + /** + * 快捷添加库存 + * + * @param request 添加库存参数 + * @return Boolean + */ + @Override + public Boolean quickAddStock(ProductAddStockRequest request) { + StoreProduct storeProduct = mapper.selectById(request.getId()); + if (storeProduct == null) { + throw new YztException(ProductResultCode.PRODUCT_NOT_EXIST); + } + List valueStockList = request.getAttrValueList(); + List attrIdList = valueStockList.stream().map(ProductAttrValueAddStockRequest::getId).distinct().collect(Collectors.toList()); + if (attrIdList.size() != valueStockList.size()) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "有重复的商品规格属性ID"); + } + List valueList = storeProductAttrValueService.getByProductIdAndAttrIdList(request.getId(), attrIdList); + if (CollUtil.isEmpty(valueList) || valueList.size() != attrIdList.size()) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "商品规格属性ID数组数据异常,请刷新后再试"); + } + for (ProductAttrValueAddStockRequest value : valueStockList) { + for (StoreProductAttrValue attrValue : valueList) { + if (attrValue.getId().equals(value.getId())) { + value.setVersion(attrValue.getVersion()); + break; + } + } + } + int totalStock = valueStockList.stream().mapToInt(ProductAttrValueAddStockRequest::getAddStock).sum(); + return transactionTemplate.execute(e -> { + operationStock(storeProduct.getId(), totalStock, "quick_add",storeProduct.getVersion()); + valueStockList.forEach(valueStock -> { + storeProductAttrValueService.operationStock(valueStock.getId(), valueStock.getAddStock(), + "quick_add",valueStock.getVersion()); + }); + return Boolean.TRUE; + }); + + } + + + + ///////////////////////////////////////////自定义方法 + + /** + * 通过ID获取商品列表 + * + * @param proIdsList 商品ID列表 + * @param label admin-管理端,front-移动端 + */ + private List findByIdsAndLabel(List proIdsList, String label) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(StoreProduct::getId, proIdsList); + if (label.equals("front")) { + getForSaleWhere(lqw); + } + +//拼接Sql + StringBuilder builder = new StringBuilder(); + builder.append("order by field(id,"); + int length = proIdsList.size(); + for(int i= 0; i lqw) { + lqw.eq(StoreProduct::getIsDel, false); + lqw.eq(StoreProduct::getIsRecycle, false); + lqw.eq(StoreProduct::getIsShow, true); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillMangerServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillMangerServiceImpl.java new file mode 100644 index 0000000..d59f278 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillMangerServiceImpl.java @@ -0,0 +1,298 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.seckill.StoreSeckillManger; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreSeckillMangerRequest; +import com.yzt.common.request.StoreSeckillMangerSearchRequest; +import com.yzt.common.response.StoreSeckillManagerResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.mapper.StoreSeckillMangerMapper; +import com.yzt.service.service.StoreSeckillMangerService; +import com.yzt.service.service.SystemAttachmentService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * StoreSeckillMangerServiceImpl 接口实现 + * + */ +@Service +public class StoreSeckillMangerServiceImpl extends ServiceImpl + implements StoreSeckillMangerService { + + @Resource + private StoreSeckillMangerMapper mapper; + + @Autowired + private SystemAttachmentService systemAttachmentService; + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(StoreSeckillMangerSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 StoreSeckillManger 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + if(null != request.getName()) lambdaQueryWrapper.like(StoreSeckillManger::getName, request.getName()); + if(null != request.getStatus() && !"".equals(request.getStatus())) { + lambdaQueryWrapper.eq(StoreSeckillManger::getStatus, request.getStatus()); + } + + lambdaQueryWrapper.orderByAsc(StoreSeckillManger::getSort); + + // 处理数据time格式 适配前端 + List responses = new ArrayList<>(); + List storeSeckillMangers = mapper.selectList(lambdaQueryWrapper); + convertTime(responses, storeSeckillMangers); + return responses; + } + + /** + * 删除秒杀配置 逻辑删除 + * + * @param id 待删除id + * @return 删除结果 + */ + @Override + public boolean deleteLogicById(int id) { + return mapper.deleteById(id) > 0; + } + + /** + * 检查时间段是否已经存在 + * + * @param storeSeckillManger 查询秒杀配置 + * @return 查询结果 + */ + private List checkTimeRangeUnique(StoreSeckillManger storeSeckillManger) { + LambdaQueryWrapper lqTimeUnique = Wrappers.lambdaQuery(); + // 开始时间大于等于 开始时间小于等于 + lqTimeUnique.ge(StoreSeckillManger::getStartTime, storeSeckillManger.getStartTime()); + lqTimeUnique.lt(StoreSeckillManger::getStartTime, storeSeckillManger.getEndTime()); + lqTimeUnique.or(); + lqTimeUnique.le(StoreSeckillManger::getStartTime, storeSeckillManger.getStartTime()); + lqTimeUnique.ge(StoreSeckillManger::getEndTime, storeSeckillManger.getEndTime()); + lqTimeUnique.or(); + lqTimeUnique.gt(StoreSeckillManger::getEndTime, storeSeckillManger.getStartTime()); + lqTimeUnique.le(StoreSeckillManger::getEndTime, storeSeckillManger.getEndTime()); + + return mapper.selectList(lqTimeUnique); + } + + /** + * 更新秒杀配置 + * + * @param storeSeckillManger 待更新秒杀配置 + * @return 更新结果 + */ + private boolean updateByCondition(StoreSeckillManger storeSeckillManger) { + StoreSeckillManger ssm = new StoreSeckillManger(); + ssm.setId(storeSeckillManger.getId()); + if(StrUtil.isNotBlank(storeSeckillManger.getName())) ssm.setName(storeSeckillManger.getName()); + if(StrUtil.isNotBlank(storeSeckillManger.getImg())) + ssm.setImg(systemAttachmentService.clearPrefix(storeSeckillManger.getImg())); + if(StrUtil.isNotBlank(storeSeckillManger.getSilderImgs())) + ssm.setSilderImgs(systemAttachmentService.clearPrefix(storeSeckillManger.getSilderImgs())); + if(null != storeSeckillManger.getStatus()) ssm.setStatus(storeSeckillManger.getStatus()); + if(null != storeSeckillManger.getStartTime()) ssm.setStartTime(storeSeckillManger.getStartTime()); + if(null != storeSeckillManger.getEndTime()) ssm.setEndTime(storeSeckillManger.getEndTime()); + ssm.setUpdateTime(DateUtil.date()); + return mapper.updateById(ssm) > 0; + } + + /** + * 详情 + * + * @param id 配置id + * @return 查询到的结果 + */ + @Override + public StoreSeckillManagerResponse detail(int id) { + StoreSeckillManger storeSeckillManger = mapper.selectById(id); + StoreSeckillManagerResponse response = new StoreSeckillManagerResponse(); + BeanUtils.copyProperties(storeSeckillManger,response); + cTime(storeSeckillManger, response); + return response; + } + + /** + * 获取正在秒杀的时间段 + * + * @return 正在秒杀的时间段 + */ + @Override + public List getCurrentSeckillManager() { + int currentHour = YztDateUtil.getCurrentHour(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.le(StoreSeckillManger::getStartTime,currentHour).gt(StoreSeckillManger::getEndTime,currentHour); + return mapper.selectList(lqw); + } + + /** + * 更新秒杀配置状态 + * + * @param id id + * @param status 待更新状态 + * @return 结果 + */ + @Override + public Boolean updateStatus(Integer id, String status) { + StoreSeckillManger ssm = new StoreSeckillManger().setId(id).setStatus(status); + ssm.setUpdateTime(DateUtil.date()); + return mapper.updateById(ssm) > 0; + } + + /** + * 更新秒杀配置 + * @param id id + * @param storeSeckillMangerRequest 秒杀配置 + * @return 结果 + */ + @Override + public Boolean update(Integer id, StoreSeckillMangerRequest storeSeckillMangerRequest) { + StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); + BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); + storeSeckillManger.setId(id); + // 对request中的time做分割后赋值给mode中的start和end属性 + setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); + List existTimes = checkTimeRangeUnique(storeSeckillManger); + if(existTimes.size() > 1){ + throw new YztException("当前时间段的秒杀配置已存在"); + }else if(existTimes.size() == 1) { + // 判断开始时间 结束时间 是否被包涵 + LambdaQueryWrapper startAndEndExcuseQuery = Wrappers.lambdaQuery(); + startAndEndExcuseQuery.ge(StoreSeckillManger::getStartTime,storeSeckillManger.getStartTime()) + .le(StoreSeckillManger::getEndTime,storeSeckillManger.getEndTime()); + List storeSeckillMangers = mapper.selectList(startAndEndExcuseQuery); + // 判断是否被扩大 + LambdaQueryWrapper startAndEndExcuseQueryIn = Wrappers.lambdaQuery(); + startAndEndExcuseQueryIn.le(StoreSeckillManger::getStartTime,storeSeckillManger.getStartTime()) + .ge(StoreSeckillManger::getEndTime,storeSeckillManger.getEndTime()); + List storeSeckillMangersIn = mapper.selectList(startAndEndExcuseQueryIn); + // 时间区间改大 不存在的情况 + if(storeSeckillMangers.size() <= 1 && storeSeckillMangersIn.size() <= 1){ //storeSeckillMangers.get(0).getId().equals(id) + return updateByCondition(storeSeckillManger); + }else{ + throw new YztException("当前时间段的秒杀配置已存在"); + } + }else { + return updateByCondition(storeSeckillManger); + } + } + + /////////////////////////////////////////////////// 自定义方法 + + // 列表用 格式化time 对前端输出一致 + private void convertTime(List responses, List storeSeckillMangers) { + storeSeckillMangers.forEach(e -> { + StoreSeckillManagerResponse r = new StoreSeckillManagerResponse(); + BeanUtils.copyProperties(e, r); + cTime(e, r); + responses.add(r); + }); + } + // 详情用 格式化time 对前端输出一致 + private void cTime(StoreSeckillManger e, StoreSeckillManagerResponse r) { + String pStartTime = e.getStartTime().toString(); + String pEndTime = e.getEndTime().toString(); + String startTime = pStartTime.length() == 1 ? "0" + pStartTime : pStartTime; + String endTime = pEndTime.length() == 1 ? "0" + pEndTime : pEndTime; + r.setTime(startTime + ":00," + endTime + ":00"); + } + + /** + * 兼容时间参数 request中String格式 mode中Integer + * @param storeSeckillMangerRequest request参数 + * @param storeSeckillManger 秒杀配置实体 + */ + private void setTimeRangeFromRequest(@Validated @RequestBody StoreSeckillMangerRequest storeSeckillMangerRequest, StoreSeckillManger storeSeckillManger) { + if(!storeSeckillMangerRequest.getTime().contains(",")){ + throw new YztException("时间参数不正确 例如:01:00,02:00"); + } + String[] timeRage = storeSeckillMangerRequest.getTime().split(","); + Integer startTime = Integer.parseInt(timeRage[0].split(":")[0]); + Integer endTime = Integer.parseInt(timeRage[1].split(":")[0]); + storeSeckillManger.setStartTime(startTime); + storeSeckillManger.setEndTime(endTime); + } + + /** + * 获取移动端列表 (正在进行和马上开始的秒杀) + * @return List + */ + @Override + public List getH5List() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(StoreSeckillManger::getIsDel, false); + lambdaQueryWrapper.eq(StoreSeckillManger::getStatus, "'1'"); + // 获取当前小时 + int currentHour = YztDateUtil.getCurrentHour(); + lambdaQueryWrapper.gt(StoreSeckillManger::getEndTime, currentHour); + lambdaQueryWrapper.orderByAsc(StoreSeckillManger::getStartTime); + List storeSeckillMangers = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeSeckillMangers)) { + return CollUtil.newArrayList(); + } + // 处理数据time格式 适配前端 + List responses = new ArrayList<>(); + convertTime(responses, storeSeckillMangers); + return responses; + } + + /** + * 获取所有秒杀配置 + * @return List + */ + @Override + public List getAllList() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.orderByAsc(StoreSeckillManger::getSort); + // 处理数据time格式 适配前端 + List storeSeckillMangers = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(storeSeckillMangers)) { + return CollUtil.newArrayList(); + } + List responses = new ArrayList<>(); + convertTime(responses, storeSeckillMangers); + return responses; + } + + /** + * 添加秒杀配置 + * @param storeSeckillMangerRequest 配置参数 + */ + @Override + public Boolean saveManger(StoreSeckillMangerRequest storeSeckillMangerRequest) { + StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); + BeanUtils.copyProperties(storeSeckillMangerRequest, storeSeckillManger); + // 对request中的time做分割后赋值给mode中的start和end属性 + setTimeRangeFromRequest(storeSeckillMangerRequest, storeSeckillManger); + List storeSeckillMangers = checkTimeRangeUnique(storeSeckillManger); + if (storeSeckillMangers.size() > 0) { + throw new YztException("当前时间段的秒杀配置已存在"); + } + storeSeckillManger.setImg(systemAttachmentService.clearPrefix(storeSeckillManger.getImg())); + storeSeckillManger.setSilderImgs(systemAttachmentService.clearPrefix(storeSeckillManger.getSilderImgs())); + return save(storeSeckillManger); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillServiceImpl.java new file mode 100644 index 0000000..2e56f49 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/StoreSeckillServiceImpl.java @@ -0,0 +1,952 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.product.StoreProduct; +import com.yzt.common.model.product.StoreProductAttr; +import com.yzt.common.model.product.StoreProductAttrValue; +import com.yzt.common.model.product.StoreProductDescription; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.seckill.StoreSeckill; +import com.yzt.common.model.seckill.StoreSeckillManger; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.mapper.StoreSeckillMapper; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * StoreSeckillService 实现类 + * + */ +@Service +public class StoreSeckillServiceImpl extends ServiceImpl + implements StoreSeckillService { + + private static final Logger logger = LoggerFactory.getLogger(StoreSeckillServiceImpl.class); + + @Resource + private StoreSeckillMapper mapper; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private StoreProductDescriptionService storeProductDescriptionService; + + @Autowired + private StoreSeckillMangerService storeSeckillMangerService; + + @Autowired + private UserService userService; + + @Autowired + private StoreProductRelationService storeProductRelationService; + + @Autowired + private StoreProductService storeProductService; + + @Autowired + private StoreProductAttrService attrService; + + @Autowired + private StoreProductAttrValueService storeProductAttrValueService; + + @Autowired + private StoreProductAttrResultService storeProductAttrResultService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(StoreSeckillSearchRequest request, PageParamRequest pageParamRequest) { + //带 StoreSeckill 类的多条件查询 + Page storeSeckillProductPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + StoreSeckill model = new StoreSeckill(); + BeanUtils.copyProperties(request, model); + if (null != request.getStatus()) { + lambdaQueryWrapper.eq(StoreSeckill::getStatus,request.getStatus()); + } + if (null != request.getTimeId()) { + lambdaQueryWrapper.eq(StoreSeckill::getTimeId,request.getTimeId()); + } + lambdaQueryWrapper.eq(StoreSeckill::getIsDel,false); + if (StringUtils.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.and(wrapper -> wrapper + .like(StoreSeckill::getTitle,request.getKeywords()) + .or() + .like(StoreSeckill::getId,request.getKeywords()) + ); + } + lambdaQueryWrapper.orderByDesc(StoreSeckill::getSort).orderByDesc(StoreSeckill::getId); + List storeProducts = mapper.selectList(lambdaQueryWrapper); + List storeProductResponses = new ArrayList<>(); + + // 当前正在秒杀的timeId 正确的数据这里应该只会获得一条数据 + List currentSeckillManager = storeSeckillMangerService.getCurrentSeckillManager(); + Integer currentSkillTimeId = 0; +// String currentSkillTime = null; + if (null != currentSeckillManager && currentSeckillManager.size() > 0) { + currentSkillTimeId = currentSeckillManager.get(0).getId(); + } + + // 查询所有秒杀配置后根据关系添加到秒杀商品列表中 + List storeSeckillMangerServiceList = storeSeckillMangerService.getAllList(); + for (StoreSeckill product : storeProducts) { + StoreSeckillResponse storeProductResponse = new StoreSeckillResponse(); + BeanUtils.copyProperties(product, storeProductResponse); + storeProductResponse.setStatusName(getStatusName(product, currentSkillTimeId)); + storeProductResponse.setImages(YztUtil.stringToArrayStr(product.getImages())); + + StoreProductAttr storeProductAttrPram = new StoreProductAttr(); + storeProductAttrPram.setProductId(product.getId()).setType(Constants.PRODUCT_TYPE_SECKILL); + List attrs = attrService.getByEntity(storeProductAttrPram); + + if (attrs.size() > 0) { + storeProductResponse.setAttr(attrs); + } + // 处理富文本 + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, product.getId()) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_SECKILL)); + if (null != sd) { + storeProductResponse.setContent(null == sd.getDescription()?"":sd.getDescription()); + } + // 添加秒杀配置关系 + List hasTimeIds = storeSeckillMangerServiceList.stream() + .filter(e -> e.getId().equals(storeProductResponse.getTimeId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(hasTimeIds)) { + storeProductResponse.setStoreSeckillManagerResponse(hasTimeIds.get(0)); + storeProductResponse.setCurrentTimeId(currentSkillTimeId); + storeProductResponse.setCurrentTime(hasTimeIds.get(0).getTime()); + } + storeProductResponses.add(storeProductResponse); + } + // 多条sql查询处理分页正确 + return CommonPage.copyPageInfo(storeSeckillProductPage, storeProductResponses); + } + + /** + * 获取秒杀状态描述 + * @param seckill 秒杀商品 + * @param currentSkillTimeId 当前时间秒杀时间端id + * @return 秒杀状态描述 + */ + private String getStatusName(StoreSeckill seckill, Integer currentSkillTimeId) { + if (seckill.getStatus().equals(0)) { + return "已关闭"; + } + + // 获取当前时间 + DateTime dateTime = cn.hutool.core.date.DateUtil.date(); + // 开始、结束时间 + String startTimeStr = cn.hutool.core.date.DateUtil.date(seckill.getStartTime()).toString(Constants.DATE_FORMAT_DATE); + String stopTimeStr = cn.hutool.core.date.DateUtil.date(seckill.getStopTime()).toString(Constants.DATE_FORMAT_DATE); + DateTime startDate = cn.hutool.core.date.DateUtil.parseDate(startTimeStr + " 00:00:00"); + DateTime stopDate = cn.hutool.core.date.DateUtil.parse(stopTimeStr + " 23:59:59"); + + // 比较开始时间(日期) + if (dateTime.compareTo(startDate) < 0) {// 当前时间 < 开始时间 + return "未开始"; + } + if (dateTime.compareTo(startDate) >= 0 && dateTime.compareTo(stopDate) <= 0) { + // 开始时间 <= 当前时间 <= 结束时间 + if (seckill.getTimeId().equals(currentSkillTimeId)) { + return "进行中"; + } + return "未开始"; + } + // 当前时间 > 结束时间 + return "已结束"; + } + + /** + * 逻辑删除 + * + * @param id 秒杀id + * @return 删除结果 + */ + @Override + public Boolean deleteById(Integer id) { + StoreSeckill skill = new StoreSeckill().setId(id).setIsDel(true); + return mapper.updateById(skill) > 0; + } + + /** + * 新增秒杀商品 + * + * @param request 待新增秒杀商品 + * @return 新增结果 + */ + @Override + public Boolean saveSeckill(StoreSeckillAddRequest request) { + request.getAttrValue().forEach(e -> { + if ((ObjectUtil.isNull(e.getQuota()) || e.getQuota() <= 0)) { + throw new YztException("请正确输入限量"); + } + }); + + if (isExistTile(request.getTitle())) { + throw new YztException("活动标题已经存在"); + } + + StoreSeckill storeSeckill = new StoreSeckill(); + BeanUtils.copyProperties(request, storeSeckill); + // 主图 + storeSeckill.setImage(systemAttachmentService.clearPrefix(storeSeckill.getImage())); + // 轮播图 + storeSeckill.setImages(systemAttachmentService.clearPrefix(storeSeckill.getImages())); + // 设置秒杀开始时间和结束时间 + storeSeckill.setStartTime(YztDateUtil.strToDate(request.getStartTime(), Constants.DATE_FORMAT_DATE)); + storeSeckill.setStopTime(YztDateUtil.strToDate(request.getStopTime(), Constants.DATE_FORMAT_DATE)); + + //计算价格 + List attrValueAddRequestList = request.getAttrValue(); + //计算价格 + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + storeSeckill.setPrice(minAttrValue.getPrice()); + storeSeckill.setOtPrice(minAttrValue.getOtPrice()); + storeSeckill.setCost(minAttrValue.getCost()); + int quota = attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getQuota).sum(); + storeSeckill.setStock(quota); + storeSeckill.setQuota(quota); + storeSeckill.setQuotaShow(quota); + storeSeckill.setSort(0); + if (ObjectUtil.isNotNull(request.getSort())) { + storeSeckill.setSort(request.getSort()); + } + + List addRequestList = request.getAttr(); + List attrList = addRequestList.stream().map(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + attr.setType(Constants.PRODUCT_TYPE_SECKILL); + return attr; + }).collect(Collectors.toList()); + + List attrValueList = attrValueAddRequestList.stream().map(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setId(null); + attrValue.setSuk(e.getSuk()); + attrValue.setQuota(e.getQuota()); + attrValue.setQuotaShow(e.getQuota()); + attrValue.setType(Constants.PRODUCT_TYPE_SECKILL); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + return attrValue; + }).collect(Collectors.toList()); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_SECKILL); + + Boolean execute = transactionTemplate.execute(e -> { + save(storeSeckill); + + attrList.forEach(attr -> attr.setProductId(storeSeckill.getId())); + attrValueList.forEach(value -> value.setProductId(storeSeckill.getId())); + attrService.saveBatch(attrList); + storeProductAttrValueService.saveBatch(attrValueList); + + spd.setProductId(storeSeckill.getId()); + storeProductDescriptionService.deleteByProductId(storeSeckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + storeProductDescriptionService.save(spd); + return Boolean.TRUE; + }); + + return execute; + } + + // 是否存在秒杀活动标题查找 + private Boolean isExistTile(String title) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreSeckill::getId); + lqw.eq(StoreSeckill::getTitle, title); + lqw.eq(StoreSeckill::getIsDel, false); + StoreSeckill storeSeckill = mapper.selectOne(lqw); + return ObjectUtil.isNotNull(storeSeckill); + } + + /** + * 更新秒杀商品 + * + * @param request 待更新秒杀商品 + * @return 更新结果 + */ + @Override + public Boolean updateSeckill(StoreSeckillAddRequest request) { + + StoreSeckill storeSeckill = getById(request.getId()); + if (ObjectUtil.isNull(storeSeckill) || storeSeckill.getIsDel()) { + throw new YztException("秒杀商品不存在"); + } + + if (storeSeckill.getStatus().equals(1)) { + throw new YztException("请先关闭秒杀商品,再修改商品信息"); + } + + + StoreSeckill seckill = new StoreSeckill(); + BeanUtils.copyProperties(request, seckill); + seckill.setStartTime(YztDateUtil.strToDate(request.getStartTime(),Constants.DATE_FORMAT_DATE)); + seckill.setStopTime(YztDateUtil.strToDate(request.getStopTime(),Constants.DATE_FORMAT_DATE)); + + //主图 + seckill.setImage(systemAttachmentService.clearPrefix(seckill.getImage())); + + //轮播图 + seckill.setImages(systemAttachmentService.clearPrefix(seckill.getImages())); + + //计算价格 + List attrValueAddRequestList = request.getAttrValue(); + StoreProductAttrValueAddRequest minAttrValue = attrValueAddRequestList.stream().min(Comparator.comparing(StoreProductAttrValueAddRequest::getPrice)).get(); + seckill.setPrice(minAttrValue.getPrice()); + seckill.setOtPrice(minAttrValue.getOtPrice()); + seckill.setCost(minAttrValue.getCost()); + int quota = attrValueAddRequestList.stream().mapToInt(StoreProductAttrValueAddRequest::getQuota).sum(); + seckill.setStock(quota); + seckill.setQuota(quota); + seckill.setQuotaShow(quota); + + List addRequestList = request.getAttr(); + List attrAddList = CollUtil.newArrayList(); + List attrUpdateList = CollUtil.newArrayList(); + addRequestList.forEach(e -> { + StoreProductAttr attr = new StoreProductAttr(); + BeanUtils.copyProperties(e, attr); + if (ObjectUtil.isNull(attr.getId())) { + attr.setProductId(seckill.getId()); + attr.setType(Constants.PRODUCT_TYPE_SECKILL); + attrAddList.add(attr); + } else { + attr.setProductId(seckill.getId()); + attr.setIsDel(false); + attrUpdateList.add(attr); + } + }); + + // attrValue部分 + List attrValueAddList = CollUtil.newArrayList(); + List attrValueUpdateList = CollUtil.newArrayList(); + attrValueAddRequestList.forEach(e -> { + StoreProductAttrValue attrValue = new StoreProductAttrValue(); + BeanUtils.copyProperties(e, attrValue); + attrValue.setSuk(e.getSuk()); + attrValue.setImage(systemAttachmentService.clearPrefix(e.getImage())); + if (ObjectUtil.isNull(attrValue.getId())) { + attrValue.setProductId(seckill.getId()); + attrValue.setQuota(e.getQuota()); + attrValue.setQuotaShow(e.getQuota()); + attrValue.setType(Constants.PRODUCT_TYPE_SECKILL); + attrValueAddList.add(attrValue); + } else { + attrValue.setProductId(seckill.getId()); + attrValue.setIsDel(false); + attrValueUpdateList.add(attrValue); + } + }); + + // 处理富文本 + StoreProductDescription spd = new StoreProductDescription(); + spd.setDescription(request.getContent().length() > 0 ? systemAttachmentService.clearPrefix(request.getContent()) : ""); + spd.setType(Constants.PRODUCT_TYPE_SECKILL); + spd.setProductId(seckill.getId()); + + Boolean execute = transactionTemplate.execute(e -> { + mapper.updateById(seckill); + + // 先删除原用attr+value + attrService.deleteByProductIdAndType(seckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + storeProductAttrValueService.deleteByProductIdAndType(seckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + + if (CollUtil.isNotEmpty(attrAddList)) { + attrService.saveBatch(attrAddList); + } + if (CollUtil.isNotEmpty(attrUpdateList)) { + attrService.saveOrUpdateBatch(attrUpdateList); + } + + if (CollUtil.isNotEmpty(attrValueAddList)) { + storeProductAttrValueService.saveBatch(attrValueAddList); + } + if (CollUtil.isNotEmpty(attrValueUpdateList)) { + storeProductAttrValueService.saveOrUpdateBatch(attrValueUpdateList); + } + + storeProductDescriptionService.deleteByProductId(seckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + storeProductDescriptionService.save(spd); + + return Boolean.TRUE; + }); + return execute; + } + + /** + * 更新秒杀状态 + * + * @param secKillId 秒杀id + * @param status 秒杀状态 + * @return 更新结果 + */ + @Override + public Boolean updateSecKillStatus(int secKillId, boolean status) { + StoreSeckill seckill = getById(secKillId); + if (ObjectUtil.isNull(seckill) || seckill.getIsDel()) { + throw new YztException("秒杀商品不存在"); + } + if (status) { + // 判断商品是否存在 + StoreProduct product = storeProductService.getById(seckill.getProductId()); + if (ObjectUtil.isNull(product)) { + throw new YztException("关联的商品已删除,无法开启活动"); + } + } + + StoreSeckill storeSeckill = new StoreSeckill().setId(secKillId).setStatus(status?1:0); + return mapper.updateById(storeSeckill) > 0; + } + + /** + * 秒杀商品详情 + * + * @param skillId 秒杀商品id + * @return 详情 + */ + @Override + public StoreSeckillDetailResponse getDetailH5(Integer skillId) { + // 获取秒杀商品信息 + StoreSeckill storeSeckill = mapper.selectById(skillId); + if (ObjectUtil.isNull(storeSeckill) || storeSeckill.getIsDel()) { + throw new YztException("未找到对应秒杀商品信息"); + } + if (storeSeckill.getStatus().equals(0)) { + throw new YztException("秒杀商品已下架"); + } + StoreSeckillDetailResponse productDetailResponse = new StoreSeckillDetailResponse(); + + SecKillDetailH5Response detailH5Response = new SecKillDetailH5Response(); + BeanUtils.copyProperties(storeSeckill, detailH5Response); + detailH5Response.setStoreName(storeSeckill.getTitle()); + detailH5Response.setSliderImage(storeSeckill.getImages()); +// detailH5Response.setStoreInfo(storeSeckill.getInfo()); + // 详情 + StoreProductDescription sd = storeProductDescriptionService.getOne( + new LambdaQueryWrapper() + .eq(StoreProductDescription::getProductId, skillId) + .eq(StoreProductDescription::getType, Constants.PRODUCT_TYPE_SECKILL)); + if (ObjectUtil.isNotNull(sd)) { + detailH5Response.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + // 获取主商品信息 + StoreProduct storeProduct = storeProductService.getById(storeSeckill.getProductId()); + // 主商品状态 + if (storeProduct.getIsDel()) { + productDetailResponse.setMasterStatus("delete"); + } else if (!storeProduct.getIsShow()) { + productDetailResponse.setMasterStatus("soldOut"); + } else if (storeProduct.getStock() <= 0) { + productDetailResponse.setMasterStatus("sellOut"); + } else { + productDetailResponse.setMasterStatus("normal"); + } + + // 秒杀销量 = 原商品销量(包含虚拟销量) + detailH5Response.setSales(storeProduct.getSales()); + detailH5Response.setFicti(storeProduct.getFicti()); + + StoreSeckillManger seckillManger = storeSeckillMangerService.getById(storeSeckill.getTimeId()); + if (ObjectUtil.isNotNull(seckillManger)) { + int secKillEndSecondTimestamp = YztDateUtil.getSecondTimestamp(YztDateUtil.nowDateTime("yyyy-MM-dd " + seckillManger.getEndTime() + ":00:00")); + detailH5Response.setTimeSwap(secKillEndSecondTimestamp + ""); + } + Integer seckillStatus = getSeckillStatus(storeSeckill, seckillManger); + detailH5Response.setSeckillStatus(seckillStatus); + productDetailResponse.setStoreSeckill(detailH5Response); + + // 获取秒杀商品规格 + List attrList = attrService.getListByProductIdAndType(skillId, Constants.PRODUCT_TYPE_SECKILL); + // 根据制式设置attr属性 + productDetailResponse.setProductAttr(attrList); + + // 根据制式设置sku属性 + HashMap skuMap = CollUtil.newHashMap(); + // 获取主商品sku + List storeProductAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeSeckill.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + // 获取秒杀商品sku + List seckillAttrValues = storeProductAttrValueService.getListByProductIdAndType(storeSeckill.getId(), Constants.PRODUCT_TYPE_SECKILL); + + for (int i = 0; i < storeProductAttrValues.size(); i++) { + StoreProductAttrValueResponse atr = new StoreProductAttrValueResponse(); + StoreProductAttrValue productAttrValue = storeProductAttrValues.get(i); + List valueList = seckillAttrValues.stream().filter(e -> productAttrValue.getSuk().equals(e.getSuk())).collect(Collectors.toList()); + if (CollUtil.isEmpty(valueList)) { + BeanUtils.copyProperties(productAttrValue, atr); + } else { + BeanUtils.copyProperties(valueList.get(0), atr); + } + skuMap.put(atr.getSuk(), atr); + } + productDetailResponse.setProductValue(skuMap); + + // 设置点赞和收藏 + User user = userService.getInfo(); + if (ObjectUtil.isNotNull(user)) { + productDetailResponse.setUserCollect(storeProductRelationService.getLikeOrCollectByUser(user.getUid(), detailH5Response.getProductId(),false).size() > 0); + } else { + productDetailResponse.setUserCollect(false); + } + + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(cn.hutool.core.date.DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(userService.getUserId()); + visitRecord.setVisitType(3); + userVisitRecordService.save(visitRecord); + return productDetailResponse; + } + + /** + * 获取秒杀状态 + * @param storeSeckill 秒杀商品 + * @return 秒杀状态 + */ + private Integer getSeckillStatus(StoreSeckill storeSeckill, StoreSeckillManger seckillManger) { + if (storeSeckill.getStatus() == 0) { + // 关闭 + return 0; + } + if (storeSeckill.getStatus() == 1) { + String ymdStart = cn.hutool.core.date.DateUtil.date(storeSeckill.getStartTime()).toString(Constants.DATE_FORMAT_DATE); + String startTimeStr = seckillManger.getStartTime() < 10 ? "0" + seckillManger.getStartTime() : seckillManger.getStartTime().toString(); + DateTime startTime = cn.hutool.core.date.DateUtil.parse(ymdStart + " " + startTimeStr + ":00:00"); + Date nowDateTime = YztDateUtil.nowDateTime(); + if (nowDateTime.compareTo(startTime) <= 0) { + // 即将开始 + return 1; + } + String ymdEnd = cn.hutool.core.date.DateUtil.date(storeSeckill.getStopTime()).toString(Constants.DATE_FORMAT_DATE); + String endTimeStr = seckillManger.getStartTime() < 10 ? "0" + seckillManger.getEndTime() : seckillManger.getEndTime().toString(); + DateTime stopTime = cn.hutool.core.date.DateUtil.parse(ymdEnd + " " + endTimeStr + ":00:00"); + if (nowDateTime.compareTo(stopTime) >= 0) { + // 已结束 + return -1; + } + if (nowDateTime.compareTo(startTime) > 0 && nowDateTime.compareTo(stopTime) < 0) { + // 进行中 + return 2; + } + } + + return -2; + } + + /** + * 秒杀商品详情 管理端 + * + * @param skillId 秒杀id + * @return 详情数据 + */ + @Override + public StoreProductInfoResponse getDetailAdmin(Integer skillId) { + StoreSeckill storeSeckill = mapper.selectById(skillId); + if (ObjectUtil.isNull(storeSeckill) || storeSeckill.getIsDel()) { + throw new YztException("未找到对应商品信息"); + } + StoreProductInfoResponse infoResponse = new StoreProductInfoResponse(); + BeanUtils.copyProperties(storeSeckill, infoResponse); + + infoResponse.setStoreName(storeSeckill.getTitle()); +// infoResponse.setStoreInfo(storeSeckill.getInfo()); + infoResponse.setSliderImage(String.join(",",storeSeckill.getImages())); + infoResponse.setStartTimeStr(cn.hutool.core.date.DateUtil.format(storeSeckill.getStartTime(), Constants.DATE_FORMAT_DATE)); + infoResponse.setStopTimeStr(cn.hutool.core.date.DateUtil.format(storeSeckill.getStopTime(), Constants.DATE_FORMAT_DATE)); + infoResponse.setProductId(storeSeckill.getProductId()); + + // 查询attr + List attrList = attrService.getListByProductIdAndType(skillId, Constants.PRODUCT_TYPE_SECKILL); + infoResponse.setAttr(attrList); + + // 注意:数据瓶装步骤:分别查询秒杀和商品本山信息组装sku信息之后,再对比sku属性是否相等来赋值是否秒杀sku信息 + List seckillAttrValueList = storeProductAttrValueService.getListByProductIdAndType(skillId, Constants.PRODUCT_TYPE_SECKILL); + // 查询主商品sku + List attrValueList = storeProductAttrValueService.getListByProductIdAndType(storeSeckill.getProductId(), Constants.PRODUCT_TYPE_NORMAL); + + List valueResponseList = attrValueList.stream().map(e -> { + AttrValueResponse valueResponse = new AttrValueResponse(); + Integer id = 0; + for (StoreProductAttrValue value : seckillAttrValueList) { + if (value.getSuk().equals(e.getSuk())) { + id = value.getId(); + BeanUtils.copyProperties(value, valueResponse); + break; + } + } + if (id.equals(0)) { + BeanUtils.copyProperties(e, valueResponse); + valueResponse.setId(null); + } else { + valueResponse.setId(id); + } + return valueResponse; + }).collect(Collectors.toList()); + infoResponse.setAttrValue(valueResponseList); + + StoreProductDescription sd = storeProductDescriptionService.getByProductIdAndType(skillId, Constants.PRODUCT_TYPE_SECKILL); + if (ObjectUtil.isNotNull(sd)) { + infoResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription()); + } + return infoResponse; + } + + /** + * 移动端 获取秒杀配置 + * 获取当前时间段 + 下边的6个商品 + * @return 秒杀配置 + */ + @Override + public List getForH5Index() { + List response = new ArrayList<>(); + int currentHour = YztDateUtil.getCurrentHour(); + // 获取所有的秒杀配置 + List skillManagerList = storeSeckillMangerService.getH5List(); + // 根据当前时间过滤 仅处理正在进行和马上开始的秒杀 + skillManagerList.forEach(e->{ + // 根据当前秒杀配置id查询是否有商品正在参与次时间段 + Integer proNum = getCountByTimeId(e.getId()); + if (proNum > 0) { + int secKillEndSecondTimestamp = YztDateUtil.getSecondTimestamp(YztDateUtil.nowDateTime("yyyy-MM-dd " + e.getEndTime() + ":00:00")); + SecKillResponse r = new SecKillResponse(e.getId(),e.getSilderImgs(),e.getStatusName(), + e.getTime(),e.getKillStatus(),secKillEndSecondTimestamp+""); + if (e.getStartTime() <= currentHour && currentHour < e.getEndTime()) { + r.setIsCheck(true); + } + response.add(r); + } + }); + + return response; + } + + /** + * 获取秒杀时段商品数量 + * @param timeId 秒杀时段id + * @return Integer + */ + private Integer getCountByTimeId(Integer timeId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreSeckill::getStatus,1); + lqw.eq(StoreSeckill::getIsDel,false); + lqw.eq(StoreSeckill::getIsShow,true); + lqw.eq(StoreSeckill::getTimeId,timeId); + String currentDate = YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE); + lqw.le(StoreSeckill::getStartTime, currentDate); + lqw.ge(StoreSeckill::getStopTime, currentDate); + lqw.orderByDesc(StoreSeckill::getId); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 根据秒杀时间段查询已配置的秒杀商品 + * + * @param timeId 秒杀id + * @return 秒杀中的商品 + */ + @Override + public List getKillListByTimeId(String timeId, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + String currentDate = YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreSeckill::getStatus,1); + lqw.eq(StoreSeckill::getIsDel,false); + lqw.eq(StoreSeckill::getIsShow,true); + lqw.eq(StoreSeckill::getTimeId,timeId); + lqw.le(StoreSeckill::getStartTime, currentDate); + lqw.ge(StoreSeckill::getStopTime,currentDate); + lqw.orderByDesc(StoreSeckill::getId); + List storeSeckills = mapper.selectList(lqw); + if (CollUtil.isEmpty(storeSeckills)) { + return CollUtil.newArrayList(); + } + List responses = new ArrayList<>(); + storeSeckills.forEach(e->{ + StoreSecKillH5Response response = new StoreSecKillH5Response(); + BeanUtils.copyProperties(e, response); + response.setPercent(YztUtil.percentInstanceIntVal(e.getQuotaShow() - e.getQuota(), e.getQuotaShow())); + responses.add(response); + }); + return responses; + } + + /** + * 根据商品id查询正在秒杀的商品信息 + * + * @param productId 商品id + * @return 正在参与的秒杀信息 + */ + @Override + public List getCurrentSecKillByProductId(Integer productId) { + List result = new ArrayList<>(); + // 获取当前时间段的秒杀 + PageParamRequest pageParamRequest = new PageParamRequest(); + pageParamRequest.setLimit(20); + List storeSeckillManagerResponses = storeSeckillMangerService.getAllList(); + List currentSsmr = + storeSeckillManagerResponses.stream().filter(e -> e.getKillStatus() == 2).collect(Collectors.toList()); + if (currentSsmr.size() == 0) { + return result; + } + List skillManagerIds = currentSsmr.stream().map(StoreSeckillManagerResponse::getId).collect(Collectors.toList()); + // 获取正在秒杀的商品信息 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreSeckill::getProductId,productId); + lqw.eq(StoreSeckill::getIsDel,false); + lqw.eq(StoreSeckill::getStatus, 1); + lqw.in(StoreSeckill::getTimeId, skillManagerIds); + result = mapper.selectList(lqw); + return result; + } + + /** + * 后台任务批量操作库存 + */ + @Override + public void consumeProductStock() { + String redisKey = Constants.PRODUCT_SECKILL_STOCK_UPDATE; + Long size = redisUtil.getListSize(redisKey); + logger.info("StoreProductServiceImpl.doProductStock | size:" + size); + if (size < 1) { + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if (null == data) { + continue; + } + try{ + StoreProductStockRequest storeProductStockRequest = + com.alibaba.fastjson.JSONObject.toJavaObject(com.alibaba.fastjson.JSONObject.parseObject(data.toString()), StoreProductStockRequest.class); + boolean result = doProductStock(storeProductStockRequest); + if (!result) { + redisUtil.lPush(redisKey, data); + } + }catch (Exception e) { + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 商品是否存在秒杀活动 + * @param productId 商品编号 + * @return Boolean + */ + @Override + public Boolean isExistActivity(Integer productId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreSeckill::getProductId, productId); + lqw.eq(StoreSeckill::getIsDel, false); + List seckillList = mapper.selectList(lqw); + if (CollUtil.isEmpty(seckillList)) { + return false; + } + // 判断关联的商品是否处于活动开启状态 + List list = seckillList.stream().filter(i -> i.getStatus().equals(1)).collect(Collectors.toList()); + return CollUtil.isNotEmpty(list); + } + + /** + * 查询带异常 + * @param id 秒杀商品id + * @return StoreSeckill + */ + @Override + public StoreSeckill getByIdException(Integer id) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StoreSeckill::getId, id); + lqw.eq(StoreSeckill::getIsDel, false); + lqw.eq(StoreSeckill::getIsShow, true); + StoreSeckill storeSeckill = mapper.selectOne(lqw); + if (ObjectUtil.isNull(storeSeckill) || storeSeckill.getIsDel()) throw new YztException("秒杀商品不存在或以删除"); + return storeSeckill; + } + + /** + * 添加(退货)/扣减库存 + * @param id 秒杀商品id + * @param num 数量 + * @param type 类型:add—添加,sub—扣减 + * @return Boolean + */ + @Override + public Boolean operationStock(Integer id, Integer num, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("stock = stock + {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales - {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota + {}", num)); + } + if (type.equals("sub")) { + updateWrapper.setSql(StrUtil.format("stock = stock - {}", num)); + updateWrapper.setSql(StrUtil.format("sales = sales + {}", num)); + updateWrapper.setSql(StrUtil.format("quota = quota - {}", num)); + // 扣减时加乐观锁保证库存不为负 + updateWrapper.last(StrUtil.format(" and (quota - {} >= 0)", num)); + } + updateWrapper.eq("id", id); + boolean update = update(updateWrapper); + if (!update) { + throw new YztException("更新商品库存失败!商品id = " + id); + } + return update; + } + + /** + * 获取秒杀首页信息 + * 当前时段秒杀信息 + 当前时段秒杀商品6条 + * @return SeckillIndexResponse + */ + @Override + public SeckillIndexResponse getIndexInfo() { + StoreSeckillManger storeSeckillManger = new StoreSeckillManger(); + storeSeckillManger.setIsDel(false); + // 根据当前时间过滤 仅处理正在进行的秒杀 + List currentSeckillManagerList = storeSeckillMangerService.getCurrentSeckillManager(); + if (CollUtil.isEmpty(currentSeckillManagerList)) { + return null; + } + StoreSeckillManger seckillManger = currentSeckillManagerList.get(0); + if (seckillManger.getStatus().equals(0)) {// 秒杀时段关闭直接返回 + return null; + } + + // 查询当前时段秒杀商品 + String currentDate = YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(StoreSeckill::getId, StoreSeckill::getProductId, StoreSeckill::getImage, StoreSeckill::getTitle, StoreSeckill::getPrice, StoreSeckill::getOtPrice); + lqw.eq(StoreSeckill::getStatus,1); + lqw.eq(StoreSeckill::getIsDel,false); + lqw.eq(StoreSeckill::getIsShow,true); + lqw.eq(StoreSeckill::getTimeId, seckillManger.getId()); + lqw.le(StoreSeckill::getStartTime, currentDate); + lqw.ge(StoreSeckill::getStopTime,currentDate); + lqw.orderByDesc(StoreSeckill::getId); + lqw.last(" limit 6"); + List seckillList = mapper.selectList(lqw); + if (CollUtil.isEmpty(seckillList)) { + // 如果没有秒杀商品也不展示 + return null; + } + + SeckillIndexResponse response = new SeckillIndexResponse(); + // 处理秒杀时段信息 + StoreSeckillManagerResponse managerResponse = new StoreSeckillManagerResponse(); + BeanUtils.copyProperties(seckillManger, managerResponse); + String pStartTime = seckillManger.getStartTime().toString(); + String pEndTime = seckillManger.getEndTime().toString(); + String startTime = pStartTime.length() == 1 ? "0" + pStartTime:pStartTime; + String endTime = pEndTime.length() == 1 ? "0" + pEndTime : pEndTime; + managerResponse.setTime(startTime + ":00," + endTime + ":00"); + int secKillEndSecondTimestamp = YztDateUtil.getSecondTimestamp(YztDateUtil.nowDateTime("yyyy-MM-dd " + seckillManger.getEndTime() + ":00:00")); + SecKillResponse secKillResponse = new SecKillResponse(seckillManger.getId(),seckillManger.getSilderImgs(),managerResponse.getStatusName(), + managerResponse.getTime(),managerResponse.getKillStatus(),secKillEndSecondTimestamp+""); + response.setSecKillResponse(secKillResponse); + response.setProductList(seckillList); + return response; + } + /////////////////////////////////////////////////////////////////// 自定义方法 + + // 秒杀操作库存 + private boolean doProductStock(StoreProductStockRequest storeProductStockRequest) { + // 秒杀商品信息回滚 + StoreSeckill existProduct = getById(storeProductStockRequest.getSeckillId()); + List existAttr = + storeProductAttrValueService.getListByProductIdAndAttrId( + storeProductStockRequest.getSeckillId(), + storeProductStockRequest.getAttrId().toString(), + storeProductStockRequest.getType()); + if (null == existProduct || null == existAttr) { // 未找到商品 + logger.info("库存修改任务未获取到商品信息"+JSON.toJSONString(storeProductStockRequest)); + return true; + } + + // 回滚商品库存/销量 并更新 + boolean isPlus = storeProductStockRequest.getOperationType().equals("add"); + int productStock = isPlus ? existProduct.getStock() + storeProductStockRequest.getNum() : existProduct.getStock() - storeProductStockRequest.getNum(); + existProduct.setStock(productStock); + existProduct.setSales(existProduct.getSales() - storeProductStockRequest.getNum()); + existProduct.setQuota(existProduct.getQuota() + storeProductStockRequest.getNum()); + updateById(existProduct); + + // 回滚sku库存 + for (StoreProductAttrValue attrValue : existAttr) { + int productAttrStock = isPlus ? attrValue.getStock() + storeProductStockRequest.getNum() : attrValue.getStock() - storeProductStockRequest.getNum(); + attrValue.setStock(productAttrStock); + attrValue.setSales(attrValue.getSales()-storeProductStockRequest.getNum()); + attrValue.setQuota(attrValue.getQuota() + storeProductStockRequest.getNum()); + storeProductAttrValueService.updateById(attrValue); + } + + // 商品本身库存回滚 + // StoreProductStockRequest 创建次对象调用商品扣减库存实现扣减上本本身库存 + StoreProductResponse existProductLinkedSeckill = storeProductService.getByProductId(storeProductStockRequest.getProductId()); + for (StoreProductAttrValueResponse attrValueResponse : existProductLinkedSeckill.getAttrValue()) { + if (attrValueResponse.getSuk().equals(storeProductStockRequest.getSuk())) { + StoreProductStockRequest r = new StoreProductStockRequest() + .setAttrId(attrValueResponse.getId()) + .setNum(storeProductStockRequest.getNum()) + .setOperationType("add") + .setProductId(storeProductStockRequest.getProductId()) + .setType(Constants.PRODUCT_TYPE_NORMAL) + .setSuk(storeProductStockRequest.getSuk()); + storeProductService.doProductStock(r); + } + } + return true; + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SubsidyRewardServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SubsidyRewardServiceImpl.java new file mode 100644 index 0000000..c3ad64d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SubsidyRewardServiceImpl.java @@ -0,0 +1,179 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.yzt.common.constants.BrokerageRecordConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.SubsidyRewardService; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserBrokerageRecordService; +import com.yzt.service.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 每周补贴奖励服务实现 + */ +@Service +public class SubsidyRewardServiceImpl implements SubsidyRewardService { + + private static final Logger logger = LoggerFactory.getLogger(SubsidyRewardServiceImpl.class); + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private UserService userService; + + @Autowired + private UserBillService userBillService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Override + public void weeklySubsidyReward() { + // 计算上周一 00:00:00 和 上周日 23:59:59 + DateTime now = DateUtil.date(); + // 当前是本周一 3 点左右,此处向前偏移 7 天到上周同一时间,再取该周的周一 + DateTime lastWeekSameTime = DateUtil.offsetDay(now, -7); + DateTime lastMonday = DateUtil.beginOfWeek(lastWeekSameTime, true); + DateTime lastSundayEnd = DateUtil.endOfWeek(lastWeekSameTime, true); + + Date startTime = DateUtil.beginOfDay(lastMonday); + Date endTime = DateUtil.endOfDay(lastSundayEnd); + + logger.info("[SubsidyReward] calculate range: {} ~ {}", YztDateUtil.dateToStr(startTime, "yyyy-MM-dd HH:mm:ss"), YztDateUtil.dateToStr(endTime, "yyyy-MM-dd HH:mm:ss")); + + BigDecimal totalPayPrice = storeOrderService.getCompletedPayPriceByFinishTimeRange(startTime, endTime); + if (totalPayPrice == null || totalPayPrice.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("[SubsidyReward] no completed orders in last week, skip."); + return; + } + + // level = 5 + List level5Users = userService.lambdaQuery().eq(User::getLevel, 5).eq(User::getStatus, true).list(); + // level = 6 + List level6Users = userService.lambdaQuery().eq(User::getLevel, 6).eq(User::getStatus, true).list(); + + // 周期标识 + String periodLabel = String.format("%s_%s", + DateUtil.formatDate(startTime), + DateUtil.formatDate(endTime)); + + // 2% 给 level 5 + if (CollUtil.isNotEmpty(level5Users)) { + BigDecimal reward5 = totalPayPrice.multiply(new BigDecimal("0.02")); + dispatchRewardForLevel(periodLabel, 5, reward5, level5Users); + } else { + logger.info("[SubsidyReward] no level-5 users, skip 2%% reward."); + } + + // 1% 给 level 6 + if (CollUtil.isNotEmpty(level6Users)) { + BigDecimal reward6 = totalPayPrice.multiply(new BigDecimal("0.01")); + dispatchRewardForLevel(periodLabel, 6, reward6, level6Users); + } else { + logger.info("[SubsidyReward] no level-6 users, skip 1%% reward."); + } + } + + private void dispatchRewardForLevel(String periodLabel, int level, BigDecimal totalReward, List users) { + if (totalReward == null || totalReward.compareTo(BigDecimal.ZERO) <= 0 || CollUtil.isEmpty(users)) { + return; + } + int userCount = users.size(); + BigDecimal perAmount = totalReward.divide(new BigDecimal(userCount), 2, RoundingMode.HALF_UP); + if (perAmount.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("[SubsidyReward] level-{} perAmount <= 0, skip.", level); + return; + } + + logger.info("[SubsidyReward] level-{} totalReward={}, userCount={}, perAmount={}", level, totalReward, userCount, perAmount); + + List billList = new ArrayList<>(); + List brokerageList = new ArrayList<>(); + Date now = DateUtil.date(); + + for (User user : users) { + if (user == null || user.getUid() == null) { + continue; + } + BigDecimal userNowMoney = user.getNowMoney() == null ? BigDecimal.ZERO : user.getNowMoney(); + BigDecimal newBalance = userNowMoney.add(perAmount); + + // 账单 + UserBill bill = new UserBill(); + bill.setUid(user.getUid()); + bill.setLinkId(periodLabel + "_L" + level); + bill.setLinkType(Constants.USER_BILL_LINK_TYPE_SUBSIDY_REWARD); + bill.setPm(1); + bill.setTitle("每周补贴奖励"); + bill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + bill.setType("subsidy_reward"); + bill.setNumber(perAmount); + bill.setBalance(newBalance); + bill.setMark("上周订单完成额补贴,等级" + level + " 用户平分"); + bill.setStatus(1); + bill.setCreateTime(now); + bill.setUpdateTime(now); + billList.add(bill); + + // 佣金记录 + UserBrokerageRecord record = new UserBrokerageRecord(); + record.setUid(user.getUid()); + record.setLinkId(periodLabel + "_L" + level); + record.setLinkType(Constants.USER_BILL_LINK_TYPE_SUBSIDY_REWARD); + record.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + record.setTitle("每周补贴奖励"); + record.setPrice(perAmount); + // 不改变 brokeragePrice,仅作记录,可不设置 balance + record.setMark("上周订单完成额补贴,等级" + level + " 用户平分"); + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + record.setCreateTime(now); + record.setUpdateTime(now); + brokerageList.add(record); + } + + if (billList.isEmpty() || brokerageList.isEmpty()) { + return; + } + + Boolean execute = transactionTemplate.execute(e -> { + userBillService.saveBatch(billList); + userBrokerageRecordService.saveBatch(brokerageList); + // 更新用户余额 + for (User user : users) { + if (user == null || user.getUid() == null) { + continue; + } + BigDecimal userNowMoney = user.getNowMoney() == null ? BigDecimal.ZERO : user.getNowMoney(); + userService.operationNowMoney(user.getUid(), perAmount, userNowMoney, "add"); + } + return Boolean.TRUE; + }); + + if (!execute) { + logger.error("[SubsidyReward] dispatch reward failed for level-{}", level); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAdminServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAdminServiceImpl.java new file mode 100644 index 0000000..ea63c33 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAdminServiceImpl.java @@ -0,0 +1,270 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemRole; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAdminAddRequest; +import com.yzt.common.request.SystemAdminRequest; +import com.yzt.common.request.SystemAdminUpdateRequest; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.ValidateFormUtil; +import com.yzt.service.mapper.SystemAdminMapper; +import com.yzt.service.service.SystemAdminService; +import com.yzt.service.service.SystemRoleService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * SystemAdminServiceImpl 接口实现 + * + */ +@Service +public class SystemAdminServiceImpl extends ServiceImpl implements SystemAdminService { + + @Resource + private SystemAdminMapper mapper; + + @Autowired + private SystemRoleService systemRoleService; + + /** + * 后台管理员列表 + * @param request 请求参数 + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getList(SystemAdminRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带SystemAdminRequest类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getRoles())) { + lambdaQueryWrapper.eq(SystemAdmin::getRoles, request.getRoles()); + } + if (ObjectUtil.isNotNull(request.getStatus())) { + lambdaQueryWrapper.eq(SystemAdmin::getStatus, request.getStatus()); + } + if (StrUtil.isNotBlank(request.getRealName())) { + lambdaQueryWrapper.and(i -> i.like(SystemAdmin::getRealName, request.getRealName()) + .or().like(SystemAdmin::getAccount, request.getRealName())); + } + List systemAdmins = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(systemAdmins)) { + return CollUtil.newArrayList(); + } + List systemAdminResponses = new ArrayList<>(); + List roleList = systemRoleService.getAllList(); + for (SystemAdmin admin : systemAdmins) { + SystemAdminResponse sar = new SystemAdminResponse(); + BeanUtils.copyProperties(admin, sar); + sar.setLastTime(admin.getUpdateTime()); + if (StrUtil.isBlank(admin.getRoles())) continue; + List roleIds = YztUtil.stringToArrayInt(admin.getRoles()); + List roleNames = new ArrayList<>(); + for (Integer roleId : roleIds) { + List hasRoles = roleList.stream().filter(e -> e.getId().equals(roleId)).collect(Collectors.toList()); + if (hasRoles.size()> 0) { + roleNames.add(hasRoles.stream().map(SystemRole::getRoleName).collect(Collectors.joining(","))); + } + } + sar.setRoleNames(StringUtils.join(roleNames,",")); + systemAdminResponses.add(sar); + } + return systemAdminResponses; + } + + /** + * 新增管理员 + * @param systemAdminAddRequest 新增参数 + * @return Boolean + */ + @Override + public Boolean saveAdmin(SystemAdminAddRequest systemAdminAddRequest) { + // 管理员名称唯一校验 + Integer result = checkAccount(systemAdminAddRequest.getAccount()); + if (result > 0) { + throw new YztException("管理员已存在"); + } + // 如果有手机号,校验手机号 + if (StrUtil.isNotBlank(systemAdminAddRequest.getPhone())) { + ValidateFormUtil.isPhoneException(systemAdminAddRequest.getPhone()); + } + + SystemAdmin systemAdmin = new SystemAdmin(); + BeanUtils.copyProperties(systemAdminAddRequest, systemAdmin); + + String pwd = YztUtil.encryptPassword(systemAdmin.getPwd(), systemAdmin.getAccount()); + systemAdmin.setPwd(pwd); + return save(systemAdmin); + } + + /** + * 管理员名称唯一校验 + * @param account 管理员账号 + * @return Integer + */ + private Integer checkAccount(String account) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemAdmin::getAccount, account); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + + } + + /** + * 更新管理员 + */ + @Override + public Boolean updateAdmin(SystemAdminUpdateRequest systemAdminRequest) { + getDetail(systemAdminRequest.getId()); + verifyAccount(systemAdminRequest.getId(), systemAdminRequest.getAccount()); + // 如果有手机号,校验手机号 + if (StrUtil.isNotBlank(systemAdminRequest.getPhone())) { + ValidateFormUtil.isPhoneException(systemAdminRequest.getPhone()); + } + SystemAdmin systemAdmin = new SystemAdmin(); + BeanUtils.copyProperties(systemAdminRequest, systemAdmin); + systemAdmin.setPwd(null); + if (StrUtil.isNotBlank(systemAdminRequest.getPwd())) { + String pwd = YztUtil.encryptPassword(systemAdminRequest.getPwd(), systemAdminRequest.getAccount()); + systemAdmin.setPwd(pwd); + } + systemAdmin.setUpdateTime(DateUtil.date()); + return updateById(systemAdmin); + } + + /** + * 校验账号唯一性(管理员更新时) + * @param id 管理员id + * @param account 管理员账号 + */ + private void verifyAccount(Integer id, String account) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.ne(SystemAdmin::getId, id); + lqw.eq(SystemAdmin::getAccount, account); + SystemAdmin systemAdmin = mapper.selectOne(lqw); + if (ObjectUtil.isNotNull(systemAdmin)) { + throw new YztException("账号已存在"); + } + } + + /** + * 修改后台管理员状态 + * @param id 管理员id + * @param status 状态 + * @return Boolean + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + SystemAdmin systemAdmin = getDetail(id); + if (systemAdmin.getStatus().equals(status)) { + return true; + } + systemAdmin.setStatus(status); + systemAdmin.setUpdateTime(DateUtil.date()); + return updateById(systemAdmin); + } + + /** + * 根据idList获取Map + * @param adminIdList id数组 + * @return HashMap + */ + @Override + public HashMap getMapInId(List adminIdList) { + HashMap map = new HashMap<>(); + if (adminIdList.size() < 1) { + return map; + } + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(SystemAdmin::getId, adminIdList); + List systemAdminList = mapper.selectList(lambdaQueryWrapper); + if (systemAdminList.size() < 1) { + return map; + } + for (SystemAdmin systemAdmin : systemAdminList) { + map.put(systemAdmin.getId(), systemAdmin); + } + return map; + } + + /** + * 修改后台管理员是否接收状态 + * @param id 管理员id + * @return Boolean + */ + @Override + public Boolean updateIsSms(Integer id) { + SystemAdmin systemAdmin = getDetail(id); + if (StrUtil.isBlank(systemAdmin.getPhone())) { + throw new YztException("请先为管理员添加手机号!"); + } + systemAdmin.setIsSms(!systemAdmin.getIsSms()); + systemAdmin.setUpdateTime(DateUtil.date()); + return updateById(systemAdmin); + } + + /** + * 获取可以接收短信的管理员 + * @return List + */ + @Override + public List findIsSmsList() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemAdmin::getStatus, true); + lqw.eq(SystemAdmin::getIsDel, false); + lqw.eq(SystemAdmin::getIsSms, true); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return list; + } + return list.stream().filter(i -> StrUtil.isNotBlank(i.getPhone())).collect(Collectors.toList()); + } + + /** + * 管理员详情 + * @param id 管理员id + * @return SystemAdmin + */ + @Override + public SystemAdmin getDetail(Integer id) { + SystemAdmin systemAdmin = getById(id); + if (ObjectUtil.isNull(systemAdmin) || systemAdmin.getIsDel()) { + throw new YztException("管理员不存在"); + } + return systemAdmin; + } + + /** + * 通过用户名获取用户 + * @param username 用户名 + * @return SystemAdmin + */ + @Override + public SystemAdmin selectUserByUserName(String username) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemAdmin::getAccount, username); + lqw.eq(SystemAdmin::getIsDel, false); + return mapper.selectOne(lqw); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAttachmentServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAttachmentServiceImpl.java new file mode 100644 index 0000000..1ba9c67 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemAttachmentServiceImpl.java @@ -0,0 +1,208 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +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.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.model.system.SystemAttachment; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemAttachmentMoveRequest; +import com.yzt.common.request.SystemAttachmentRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.SystemAttachmentMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemConfigService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * SystemAttachmentServiceImpl 接口实现 + * + */ +@Service +public class SystemAttachmentServiceImpl extends ServiceImpl + implements SystemAttachmentService { + + @Resource + private SystemAttachmentMapper mapper; + + @Lazy + @Autowired + private SystemConfigService systemConfigService; + + /** + * 同步到云服务, 更新图片上传类型 + * @param attId Integer 主键id + * @param type int 图片上传类型 1本地 2七牛云 3OSS 4COS + */ + @Override + public void updateCloudType(Integer attId, int type) { + SystemAttachment systemAttachment = new SystemAttachment(); + systemAttachment.setAttId(attId); + systemAttachment.setImageType(type); + systemAttachment.setUpdateTime(DateUtil.date()); + updateById(systemAttachment); + } + + /** + * 附件分页 + * @param pid Integer pid + * @param pageParamRequest PageParamRequest 分页参数 + * @return List + */ + @Override + public List getList(Integer pid, String attType, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemAttachment::getPid, pid); + if(StringUtils.isNotEmpty(attType)){ + lambdaQueryWrapper.in(SystemAttachment::getAttType, YztUtil.stringToArrayStr(attType)); + } + lambdaQueryWrapper.orderByDesc(SystemAttachment::getAttId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 给图片加前缀 + * @param path String 路径 + * @return String + */ + @Override + public String prefixImage(String path) { + // 如果那些域名不需要加,则跳过 + return path.replace(UploadConstants.UPLOAD_FILE_KEYWORD+"/", getCdnUrl() + "/"+ UploadConstants.UPLOAD_FILE_KEYWORD+"/"); + } + + @Override + public String prefixUploadf(String path) { + // 如果那些域名不需要加,则跳过 + return path.replace("yztimage/" + UploadConstants.UPLOAD_AFTER_FILE_KEYWORD+"/", getCdnUrl() + "/" +"yztimage/" + UploadConstants.UPLOAD_AFTER_FILE_KEYWORD+"/"); + } + + /** + * 给文件加前缀 + * @param path String 路径 + * @return String + */ + @Override + public String prefixFile(String path) { + if (path.contains(Constants.WECHAT_SOURCE_CODE_FILE_NAME)) { + String cdnUrl = systemConfigService.getValueByKey("local" + "UploadUrl"); + return path.replace("yztimage/", cdnUrl + "/yztimage/"); + } + if (path.contains("downloadf/excel")) { + String cdnUrl = systemConfigService.getValueByKey("local" + "UploadUrl"); + return path.replace("yztimage/downloadf/", cdnUrl + "/yztimage/downloadf/"); + } + return path.replace("yztimage/file/", getCdnUrl() + "/yztimage/file/"); + } + + /** + * 清除 cdn url, 在保存数据的时候使用 + * @param path String 文件路径 + * @return String + */ + @Override + public String clearPrefix(String path) { + if(StringUtils.isBlank(path)){ + return path; + } + Constants.CND_URL = getCdnUrl(); + if(path.contains(getCdnUrl() + "/")){ + if (path.contains("callback/alipay")) { + return path; + } + return path.replace(getCdnUrl() + "/", ""); + } + + return path; + } + + /** + * 新增附件 + * @param systemAttachmentRequest 新增参数 + */ + @Override + public Boolean add(SystemAttachmentRequest systemAttachmentRequest) { + SystemAttachment systemAttachment = new SystemAttachment(); + BeanUtils.copyProperties(systemAttachmentRequest, systemAttachment); + return save(systemAttachment); + } + + /** + * 编辑附件 + * @param systemAttachmentRequest 更新参数 + */ + @Override + public Boolean edit(SystemAttachmentRequest systemAttachmentRequest) { + SystemAttachment systemAttachment = new SystemAttachment(); + BeanUtils.copyProperties(systemAttachmentRequest, systemAttachment); + systemAttachment.setUpdateTime(DateUtil.date()); + return updateById(systemAttachment); + } + + /** + * 更改图片目录 + * @param move 参数 + */ + @Override + public Boolean updateAttrId(SystemAttachmentMoveRequest move) { + LambdaUpdateWrapper lup = new LambdaUpdateWrapper<>(); + lup.in(SystemAttachment::getAttId, YztUtil.stringToArray(move.getAttrId())); + lup.set(SystemAttachment::getPid, move.getPid()); + return update(lup); + } + + /** + * 获取cdn url + * + * @return String + */ + @Override + public String getCdnUrl() { + String uploadType = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_UPLOAD_TYPE); + //获取配置信息 + int type = Integer.parseInt(uploadType); + String uploadUrl = SysConfigConstants.CONFIG_LOCAL_UPLOAD_URL; + switch (type) { + case 2: + uploadUrl = SysConfigConstants.CONFIG_QN_UPLOAD_URL; + break; + case 3: + uploadUrl = SysConfigConstants.CONFIG_AL_UPLOAD_URL; + break; + case 4: + uploadUrl = SysConfigConstants.CONFIG_TX_UPLOAD_URL; + break; + case 5: + uploadUrl = SysConfigConstants.CONFIG_JD_UPLOAD_URL; + break; + default: + break; + } + return systemConfigService.getValueByKey(uploadUrl); + } + + /** + * 删除附件 + * @param idList 附件ID列表 + */ + @Override + public Boolean deleteByIds(List idList) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.in(SystemAttachment::getAttId, idList); + return remove(wrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemBankServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemBankServiceImpl.java new file mode 100644 index 0000000..f534e5f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemBankServiceImpl.java @@ -0,0 +1,20 @@ +package com.yzt.service.service.impl; + + + +import com.alipay.api.domain.BankInfo; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.system.SystemBank; +import com.yzt.service.mapper.SystemBankMapper; +import com.yzt.service.service.SystemBankService; +import org.springframework.stereotype.Service; + +/** + * @Author: pengsz + * @Date: 2025/11/19 + * @Description: + */ +@Service +public class SystemBankServiceImpl extends ServiceImpl implements SystemBankService { + +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityAsyncServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityAsyncServiceImpl.java new file mode 100644 index 0000000..7bb03c1 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityAsyncServiceImpl.java @@ -0,0 +1,98 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.system.SystemCity; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.SystemCityTreeVo; +import com.yzt.service.mapper.SystemCityMapper; +import com.yzt.service.service.SystemCityAsyncService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * SystemCityAsyncServiceImpl 接口实现 + * + */ +@Service +public class SystemCityAsyncServiceImpl extends ServiceImpl implements SystemCityAsyncService { + + @Resource + private SystemCityMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + /** + * 设置属性列表进入redis + */ + @Override + public void setListTree() { + //循环数据,把数据对象变成带list结构的vo + List treeList = new ArrayList<>(); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SystemCity::getId, SystemCity::getCityId, SystemCity::getParentId, SystemCity::getName); + lambdaQueryWrapper.eq(SystemCity::getIsShow, true); + List allTree = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(allTree)) { + return; + } + + for (SystemCity systemCity : allTree) { + SystemCityTreeVo systemCityTreeVo = new SystemCityTreeVo(); + BeanUtils.copyProperties(systemCity, systemCityTreeVo); + treeList.add(systemCityTreeVo); + } + //返回 + Map map = new HashMap<>(); + //cityId 为 key 存储到map 中 + for (SystemCityTreeVo systemCityTreeVo1 : treeList) { + map.put(systemCityTreeVo1.getCityId(), systemCityTreeVo1); + } + List list = new ArrayList<>(); + for (SystemCityTreeVo tree : treeList) { + //子集ID返回对象,有则添加。 + SystemCityTreeVo tree1 = map.get(tree.getParentId()); + if (tree1 != null) { + tree1.getChild().add(tree); + } else { + list.add(tree); + } + } + redisUtil.set(Constants.CITY_LIST_TREE, list); + } + + /** + * 数据整体刷入redis + */ + private void asyncList(Integer pid) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemCity::getParentId, pid); + lambdaQueryWrapper.in(SystemCity::getIsShow, true); + List systemCityList = mapper.selectList(lambdaQueryWrapper); + if (systemCityList != null && systemCityList.size() > 0) { + redisUtil.hset(Constants.CITY_LIST, pid.toString(), systemCityList); + } + } + + /** + * 数据整体刷入redis + */ + @Async + public void async(Integer pid) { + asyncList(pid); + setListTree(); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityServiceImpl.java new file mode 100644 index 0000000..a6efb8e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemCityServiceImpl.java @@ -0,0 +1,202 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.system.SystemCity; +import com.yzt.common.request.SystemCityRequest; +import com.yzt.common.request.SystemCitySearchRequest; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.SystemCityTreeVo; +import com.yzt.service.mapper.SystemCityMapper; +import com.yzt.service.service.SystemCityAsyncService; +import com.yzt.service.service.SystemCityService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * SystemCityServiceImpl 接口实现 + * + */ +@Service +public class SystemCityServiceImpl extends ServiceImpl implements SystemCityService { + + @Resource + private SystemCityMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private SystemCityAsyncService systemCityAsyncService; + + /** + * 列表 + * @param request 请求参数 + * @return List + */ + @Override + public Object getList(SystemCitySearchRequest request) { + Object list = redisUtil.get(Constants.CITY_LIST); + if (ObjectUtil.isNull(list)) { + //城市数据,异步同步到redis,第一次拿不到数据,去数据库读取 + list = getList(request.getParentId()); + } + return list; + } + + /** + * 根据父级id获取数据 + * @param parentId integer parentId + * @return Object + */ + private Object getList(Integer parentId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemCity::getParentId, parentId); + lambdaQueryWrapper.in(SystemCity::getIsShow, true); + return mapper.selectList(lambdaQueryWrapper); + } + /** + * 修改状态 + * @param id 城市id + * @param status 状态 + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + SystemCity systemCity = getById(id); + systemCity.setId(id); + systemCity.setIsShow(status); + systemCity.setUpdateTime(DateUtil.date()); + boolean result = updateById(systemCity); + if (result) { + asyncRedis(systemCity.getParentId()); + } + return result; + } + + /** + * 修改城市 + * @param id 城市id + * @param request 修改参数 + */ + @Override + public Boolean update(Integer id, SystemCityRequest request) { + SystemCity systemCity = new SystemCity(); + BeanUtils.copyProperties(request, systemCity); + systemCity.setId(id); + systemCity.setUpdateTime(DateUtil.date()); + boolean result = updateById(systemCity); + if (result) { + asyncRedis(request.getParentId()); + } + return result; + } + /** + * 获取tree结构的列表 + * @return Object + */ + @Override + public List getListTree() { + List cityList = redisUtil.get(Constants.CITY_LIST_TREE); + if (CollUtil.isEmpty(cityList)) { + systemCityAsyncService.setListTree(); + } + return redisUtil.get(Constants.CITY_LIST_TREE); + } + + /** + * 获取所有城市cityId + * @return List + */ + @Override + public List getCityIdList() { + Object data = redisUtil.get(Constants.CITY_LIST_LEVEL_1); + List collect; + if (data == null || data.equals("")) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SystemCity::getCityId); + lambdaQueryWrapper.eq(SystemCity::getLevel, 1); + lambdaQueryWrapper.eq(SystemCity::getIsShow, true); + List systemCityList = mapper.selectList(lambdaQueryWrapper); + collect = systemCityList.stream().map(SystemCity::getCityId).distinct().collect(Collectors.toList()); + redisUtil.set(Constants.CITY_LIST_LEVEL_1, collect, 10L, TimeUnit.MINUTES); + } else { + collect = (List) data; + } + + return collect; + } + + /** + * 根据city_id获取城市信息 + */ + @Override + public SystemCity getCityByCityId(Integer cityId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemCity::getCityId, cityId).eq(SystemCity::getIsShow, 1); + return getOne(lambdaQueryWrapper); + } + + + /** + * 数据整体刷入redis + * + * @since 2020-05-18 + */ + public void asyncRedis(Integer pid) { + systemCityAsyncService.async(pid); + } + + /** + * 根据城市名称获取城市详细数据 + * @author 大粽子 + * @param cityName 城市名称 + * @return 城市数据 + */ + @Override + public SystemCity getCityByCityName(String cityName) { + LambdaQueryWrapper systemCityLambdaQueryWrapper = Wrappers.lambdaQuery(); + systemCityLambdaQueryWrapper + .eq(SystemCity::getName,cityName) + .eq(SystemCity::getIsShow,1) + .eq(SystemCity::getLevel, 1); + return getOne(systemCityLambdaQueryWrapper); + } + + /** + * 根据区名获取数据 + */ + @Override + public SystemCity getByAreaNameAndPid(String areaName, Integer pid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemCity::getName, areaName); + lqw.eq(SystemCity::getIsShow,1); + lqw.eq(SystemCity::getLevel, 2); + lqw.eq(SystemCity::getParentId, pid); + return getOne(lqw); + } + + /** + * 通过区域id获取 + * @param areaId 区域Id + * @return SystemCity + */ + @Override + public SystemCity getByAreaId(Integer areaId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SystemCity::getCityId, areaId); + lqw.eq(SystemCity::getIsShow, 1); + return getOne(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemConfigServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemConfigServiceImpl.java new file mode 100644 index 0000000..a3d8e9f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemConfigServiceImpl.java @@ -0,0 +1,417 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemConfig; +import com.yzt.common.request.SaveConfigRequest; +import com.yzt.common.request.SystemFormCheckRequest; +import com.yzt.common.request.SystemFormItemCheckRequest; +import com.yzt.common.response.AdminSiteLogoResponse; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.ExpressSheetVo; +import com.yzt.service.mapper.SystemConfigMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.SystemFormTempService; +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * SystemConfigServiceImpl 接口实现 + * + */ +@Service +public class SystemConfigServiceImpl extends ServiceImpl implements SystemConfigService { + + @Resource + private SystemConfigMapper mapper; + + @Autowired + private SystemFormTempService systemFormTempService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private YztConfig yztConfig; + + @Autowired + private TransactionTemplate transactionTemplate; + + /** + * 根据menu name 获取 value + * + * @param name menu name + * @return String + */ + @Override + public String getValueByKey(String name) { + return get(name); + } + + /** + * 根据 name 获取 value 找不到抛异常 + * + * @param name menu name + * @return String + */ + @Override + public String getValueByKeyException(String name) { + String value = get(name); + if (StrUtil.isBlank(value)) { + throw new YztException("没有找到或配置:" + name + "数据"); + } + return value; + } + + /** + * 整体保存表单数据 + * + * @param systemFormCheckRequest SystemFormCheckRequest 数据保存 + * @return boolean + */ + @Override + public Boolean saveForm(SystemFormCheckRequest systemFormCheckRequest) { + //检测form表单,并且返回需要添加的数据 + systemFormTempService.checkForm(systemFormCheckRequest); + + List systemConfigList = new ArrayList<>(); + //批量添加 + for (SystemFormItemCheckRequest systemFormItemCheckRequest : systemFormCheckRequest.getFields()) { + SystemConfig systemConfig = new SystemConfig(); + systemConfig.setName(systemFormItemCheckRequest.getName()); + String value = systemAttachmentService.clearPrefix(systemFormItemCheckRequest.getValue()); + if (StrUtil.isBlank(value)) { + //去掉图片域名之后没有数据则说明当前数据就是图片域名 + value = systemFormItemCheckRequest.getValue(); + } + systemConfig.setValue(value); + systemConfig.setFormId(systemFormCheckRequest.getId()); + systemConfig.setTitle(systemFormItemCheckRequest.getTitle()); + systemConfigList.add(systemConfig); + } + + LambdaQueryWrapper oldLqw = Wrappers.lambdaQuery(); + oldLqw.eq(SystemConfig::getFormId, systemFormCheckRequest.getId()); + //删除已经隐藏的数据 + List systemConfigOldList = mapper.selectList(oldLqw); + + Boolean execute = transactionTemplate.execute(e -> { + //删除之前的数据 + if (CollUtil.isNotEmpty(systemConfigOldList)) { + mapper.delete(oldLqw); + } + boolean batch = saveBatch(systemConfigList, 100); + if (!batch) { + e.setRollbackOnly(); + return Boolean.FALSE; + } + return Boolean.TRUE; + }); + if (execute && yztConfig.isAsyncConfig() && CollUtil.isNotEmpty(systemConfigOldList)) { + asyncDelete(systemConfigOldList); + } + return execute; + } + + private void asyncDelete(List systemConfigList) { + systemConfigList.forEach(config -> { + if (redisUtil.hHasKey(Constants.CONFIG_LIST, config.getName())) { + redisUtil.hmDelete(Constants.CONFIG_LIST, config.getName()); + } + }); + } + + /** + * 保存或更新配置数据 + * + * @param name 菜单名称 + * @param value 菜单值 + * @return boolean + */ + @Override + public Boolean updateOrSaveValueByName(String name, String value) { + if (StrUtil.isNotBlank(value)) { + value = systemAttachmentService.clearPrefix(value); + } + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(SystemConfig::getName, name); + List systemConfigs = mapper.selectList(lambdaQueryWrapper); + if (systemConfigs.size() > 1) { + throw new YztException("配置名称存在多个请检查配置 fw_system_config 重复数据:" + name + "条数:" + systemConfigs.size()); + } + boolean result; + SystemConfig systemConfig; + if (CollUtil.isEmpty(systemConfigs)) { + systemConfig = new SystemConfig().setName(name).setValue(value); + result = save(systemConfig); + } else { + systemConfig = systemConfigs.get(0); + systemConfig.setValue(value); + systemConfig.setUpdateTime(DateUtil.date()); + result = updateById(systemConfig); + } + if (result && yztConfig.isAsyncConfig()) { + async(systemConfig); + } + return result; + } + + + /** + * 根据formId查询数据 + * + * @param formId Integer id + * @return HashMap + */ + @Override + public HashMap info(Integer formId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemConfig::getFormId, formId); + List systemConfigList = mapper.selectList(lqw); + if (CollUtil.isEmpty(systemConfigList)) { + return CollUtil.newHashMap(); + } + HashMap map = new HashMap<>(); + for (SystemConfig systemConfig : systemConfigList) { + map.put(systemConfig.getName(), systemConfig.getValue()); + } + map.put("id", formId.toString()); + return map; + } + + /** + * 获取面单默认配置信息 + * + * @return ExpressSheetVo + */ + @Override + public ExpressSheetVo getDeliveryInfo() { + String exportId = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_EXPORT_ID); + String exportTempId = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_EXPORT_TEMP_ID); + String exportCom = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_EXPORT_COM); + String exportToName = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_TO_NAME); + String exportToTel = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_TO_TEL); + String exportToAddress = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_ADDRESS); + String exportSiid = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_PRINTER_NUM); + String exportOpen = get(SysConfigConstants.ELECTRONIC_FACE_SHEET_OPEN); + return new ExpressSheetVo(Integer.valueOf(exportId), exportCom, exportTempId, exportToName, exportToTel, exportToAddress, exportSiid, Integer.valueOf(exportOpen)); + } + + /** + * 获取文件存储类型 + */ + @Override + public SystemConfig getFileUploadType() { + return getConfigByNameException(SysConfigConstants.CONFIG_UPLOAD_TYPE); + } + + /** + * 获取管理端logo + * + * @return AdminSiteLogoResponse + */ + @Override + public AdminSiteLogoResponse getSiteLogo() { + String siteLogoSquare = get(SysConfigConstants.CONFIG_KEY_ADMIN_LOGO_SQUARE); + String siteLogoLeftTop = get(SysConfigConstants.CONFIG_KEY_ADMIN_LOGIN_LOGO_LEFT_TOP); + AdminSiteLogoResponse response = new AdminSiteLogoResponse(); + response.setSiteLogoSquare(siteLogoSquare); + response.setSiteLogoLeftTop(siteLogoLeftTop); + return response; + } + + /** + * 获取腾讯地图key + */ + @Override + public SystemConfig getTxMapKey() { + return getConfigByNameException(SysConfigConstants.CONFIG_SITE_TENG_XUN_MAP_KEY); + } + + /** + * 获取移动端首页列表样式 + */ + @Override + public SystemConfig getHomePageSaleListStyle() { + return getConfigByNameException(Constants.CONFIG_IS_PRODUCT_LIST_STYLE); + } + + /** + * 保存移动端首页列表样式 + */ + @Override + public Boolean saveHomePageSaleListStyle(SaveConfigRequest request) { + return updateOrSaveValueByName(Constants.CONFIG_IS_PRODUCT_LIST_STYLE, request.getValue()); + } + + /** + * 清除config缓存 + */ + @Override + public Boolean clearCache() { + redisUtil.delete(Constants.CONFIG_LIST); + return Boolean.TRUE; + } + + /** + * 获取授权地址 + */ + @Override + public SystemConfig getAuthHost() { + return getConfigByNameException(SysConfigConstants.CONFIG_COPYRIGHT_AUTH_HOST); + } + + /** + * 获取主题色 + */ + @Override + public SystemConfig getChangeColor() { + return getConfigByNameException(SysConfigConstants.CONFIG_CHANGE_COLOR); + } + + /** + * 保存主题色 + */ + @Override + public Boolean saveChangeColor(SaveConfigRequest request) { + return updateOrSaveValueByName(SysConfigConstants.CONFIG_CHANGE_COLOR, request.getValue()); + } + + private SystemConfig getConfigByName(String name) { + String value = get(name); + if (StrUtil.isBlank(value)) { + value = ""; + } + SystemConfig systemConfig = new SystemConfig(); + systemConfig.setName(name); + systemConfig.setValue(value); + return systemConfig; + } + + private SystemConfig getConfigByNameException(String name) { + String value = getValueByKeyException(name); + SystemConfig systemConfig = new SystemConfig(); + systemConfig.setName(name); + systemConfig.setValue(value); + return systemConfig; + } + + private void asyncBlank(String key) { + redisUtil.hset(Constants.CONFIG_LIST, key, ""); + } + + private void async(SystemConfig systemConfig) { + redisUtil.hset(Constants.CONFIG_LIST, systemConfig.getName(), systemConfig.getValue()); + } + + + /** + * 获取config数据 + * + * @param name key + * @return String + */ + private String get(String name) { + if (!yztConfig.isAsyncConfig()) { + SystemConfig systemConfig = getByName(name); + if (ObjectUtil.isNull(systemConfig) || StrUtil.isBlank(systemConfig.getValue())) { + return ""; + } + return systemConfig.getValue(); + } + Long size = redisUtil.getHashSize(Constants.CONFIG_LIST); + if (size <= 0) { + SystemConfig systemConfig = getByName(name); + if (ObjectUtil.isNull(systemConfig) || StrUtil.isBlank(systemConfig.getValue())) { + asyncBlank(name); + return ""; + } + async(systemConfig); + return systemConfig.getValue(); + } + Object data = redisUtil.hget(Constants.CONFIG_LIST, name); + if (ObjectUtil.isNotNull(data)) { + return data.toString(); + } + SystemConfig systemConfig = getByName(name); + if (ObjectUtil.isNull(systemConfig) || StrUtil.isBlank(systemConfig.getValue())) { + asyncBlank(name); + return ""; + } + async(systemConfig); + return systemConfig.getValue(); + } + + private SystemConfig getByName(String name) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(SystemConfig::getId, SystemConfig::getName, SystemConfig::getValue); + lqw.eq(SystemConfig::getStatus, false); + lqw.eq(SystemConfig::getName, name); + lqw.orderByDesc(SystemConfig::getId); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 初始化时加载config_list缓存 + */ + @PostConstruct + public void loadingConfigCache() { + if (!yztConfig.isAsyncConfig()) { + return; + } + if (redisUtil.exists(Constants.CONFIG_LIST)) { + Long hashSize = redisUtil.getHashSize(Constants.CONFIG_LIST); + if (hashSize > 0) { + return; + } + } + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(SystemConfig::getName, SystemConfig::getValue); + lqw.eq(SystemConfig::getStatus, false); + List systemConfigList = mapper.selectList(lqw); + systemConfigList.forEach(config -> redisUtil.hset(Constants.CONFIG_LIST, config.getName(), config.getValue())); + + } + + + /** + * 获取移动端域名 + * @return 移动端域名 + */ + @Override + public String getFrontDomain() { + return getValueByKey(SysConfigConstants.CONFIG_KEY_SITE_URL); + } + + /** + * 获取素材域名 + * + * @return 素材域名 + */ + @Override + public String getMediaDomain() { + return systemAttachmentService.getCdnUrl(); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemFormTempServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemFormTempServiceImpl.java new file mode 100644 index 0000000..114faf8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemFormTempServiceImpl.java @@ -0,0 +1,146 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemFormTemp; +import com.yzt.common.request.*; +import com.yzt.common.utils.ValidateFormUtil; +import com.yzt.common.vo.SystemConfigFormItemConfigRegListVo; +import com.yzt.common.vo.SystemConfigFormItemVo; +import com.yzt.common.vo.SystemConfigFormVo; +import com.yzt.service.mapper.SystemFormTempMapper; +import com.yzt.service.service.SystemFormTempService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +/** + * SystemFormTempServiceImpl 接口实现 + * + */ +@Service +public class SystemFormTempServiceImpl extends ServiceImpl implements SystemFormTempService { + + @Resource + private SystemFormTempMapper mapper; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(SystemFormTempSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 SystemFormTemp 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(!StringUtils.isBlank(request.getKeywords())) { + lambdaQueryWrapper.eq(SystemFormTemp::getId, request.getKeywords()). + or().like(SystemFormTemp::getName, request.getKeywords()). + or().like(SystemFormTemp::getInfo, request.getKeywords()); + } + lambdaQueryWrapper.orderByDesc(SystemFormTemp::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 验证item规则 + * @param systemFormCheckRequest SystemFormCheckRequest 表单数据提交 + */ + @Override + public void checkForm(SystemFormCheckRequest systemFormCheckRequest) { + //循环取出item数据, 组合成 key => val 的map格式 + HashMap map = new HashMap<>(); + for (SystemFormItemCheckRequest systemFormItemCheckRequest : systemFormCheckRequest.getFields()) { + map.put(systemFormItemCheckRequest.getName(), systemFormItemCheckRequest.getValue()); + } + + //取出表单模型的数据 + SystemFormTemp formTemp = getById(systemFormCheckRequest.getId()); + + //解析表单规则进行验证 + SystemConfigFormVo systemConfigFormVo; + try { + systemConfigFormVo = JSONObject.parseObject(formTemp.getContent(), SystemConfigFormVo.class); + } catch (Exception e) { + throw new YztException("模板表单 【" + formTemp.getName() + "】 的内容不是正确的JSON格式!"); + } + + SystemConfigFormItemVo systemConfigFormItemVo; + for (String item : systemConfigFormVo.getFields()) { + systemConfigFormItemVo = JSONObject.parseObject(item, SystemConfigFormItemVo.class); + String model = systemConfigFormItemVo.get__vModel__(); //字段 name + + if(systemConfigFormItemVo.get__config__().getRequired() && map.get(model).equals("")) { + throw new YztException(systemConfigFormItemVo.get__config__().getLabel() + "不能为空!"); + } + //正则验证 + checkRule(systemConfigFormItemVo.get__config__().getRegList(), map.get(model), systemConfigFormItemVo.get__config__().getLabel()); + } + } + + /** + * 新增表单模板 + * @param systemFormTempRequest 新增参数 + */ + @Override + public Boolean add(SystemFormTempRequest systemFormTempRequest) { + try { + JSONObject.parseObject(systemFormTempRequest.getContent(), SystemConfigFormVo.class); + } catch (Exception e) { + throw new YztException("模板表单 【" + systemFormTempRequest.getName() + "】 的内容不是正确的JSON格式!"); + } + + SystemFormTemp systemFormTemp = new SystemFormTemp(); + BeanUtils.copyProperties(systemFormTempRequest, systemFormTemp); + return save(systemFormTemp); + } + + /** + * 修改表单模板 + * @param id integer id + * @param systemFormTempRequest 修改参数 + */ + @Override + public Boolean edit(Integer id, SystemFormTempRequest systemFormTempRequest) { + try { + JSONObject.parseObject(systemFormTempRequest.getContent(), SystemConfigFormVo.class); + } catch (Exception e) { + throw new YztException("模板表单 【" + systemFormTempRequest.getName() + "】 的内容不是正确的JSON格式!"); + } + + SystemFormTemp systemFormTemp = new SystemFormTemp(); + BeanUtils.copyProperties(systemFormTempRequest, systemFormTemp); + systemFormTemp.setId(id); + systemFormTemp.setUpdateTime(DateUtil.date()); + return updateById(systemFormTemp); + } + + /** + * 验证item规则 + * @param regList List regList, String value, String name) { + if(regList.size() > 0) { + for (SystemConfigFormItemConfigRegListVo systemConfigFormItemConfigRegListVo : regList) { + if(!ValidateFormUtil.regular(value, name, systemConfigFormItemConfigRegListVo.getPattern())) { + throw new YztException(systemConfigFormItemConfigRegListVo.getMessage()); + } + } + } + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupDataServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupDataServiceImpl.java new file mode 100644 index 0000000..52ac952 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupDataServiceImpl.java @@ -0,0 +1,252 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +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.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.SysGroupDataConstants; +import com.yzt.common.model.system.SystemGroupData; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemFormItemCheckRequest; +import com.yzt.common.request.SystemGroupDataRequest; +import com.yzt.common.request.SystemGroupDataSearchRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.SystemGroupDataMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemFormTempService; +import com.yzt.service.service.SystemGroupDataService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * SystemGroupDataServiceImpl 接口实现 + * + */ +@Service +public class SystemGroupDataServiceImpl extends ServiceImpl implements SystemGroupDataService { + + @Resource + private SystemGroupDataMapper mapper; + + @Autowired + private SystemFormTempService systemFormTempService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(SystemGroupDataSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 SystemGroupData 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + SystemGroupData model = new SystemGroupData(); + BeanUtils.copyProperties(request, model); + lambdaQueryWrapper.setEntity(model); + lambdaQueryWrapper.orderByAsc(SystemGroupData::getSort).orderByAsc(SystemGroupData::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 保存数据 + * @param systemGroupDataRequest SystemGroupDataRequest 数据保存 + * @return Boolean + */ + @Override + public Boolean create(SystemGroupDataRequest systemGroupDataRequest) { + //检测form表单,并且返回需要添加的数据 + systemFormTempService.checkForm(systemGroupDataRequest.getForm()); + + SystemGroupData systemGroupData = new SystemGroupData(); + systemGroupData.setGid(systemGroupDataRequest.getGid()); + + String value = JSONObject.toJSONString(systemGroupDataRequest.getForm()); + value = systemAttachmentService.clearPrefix(value); + systemGroupData.setValue(value); + systemGroupData.setSort(systemGroupDataRequest.getForm().getSort()); + systemGroupData.setStatus(systemGroupDataRequest.getForm().getStatus()); + return save(systemGroupData); + } + + /** + * 修改组合数据详情表 + * @param id integer id + * @param request 修改参数 + * @return bool + */ + @Override + public Boolean update(Integer id, SystemGroupDataRequest request) { + //检测form表单,并且返回需要添加的数据 + systemFormTempService.checkForm(request.getForm()); + + SystemGroupData systemGroupData = new SystemGroupData(); + systemGroupData.setId(id); + systemGroupData.setGid(request.getGid()); + + String value = JSONObject.toJSONString(request.getForm()); + value = systemAttachmentService.clearPrefix(value); + systemGroupData.setValue(value); + systemGroupData.setSort(request.getForm().getSort()); + systemGroupData.setStatus(request.getForm().getStatus()); + systemGroupData.setUpdateTime(DateUtil.date()); + return updateById(systemGroupData); + } + + /** + * 通过gid获取列表 推荐使用 + * @param gid Integer group id + * @return List + */ + @Override + public List getListByGid(Integer gid, Class cls) { + SystemGroupDataSearchRequest systemGroupDataSearchRequest = new SystemGroupDataSearchRequest(); + systemGroupDataSearchRequest.setGid(gid); + systemGroupDataSearchRequest.setStatus(true); + List list = getList(systemGroupDataSearchRequest, new PageParamRequest()); + + List arrayList = new ArrayList<>(); + if (list.size() < 1) { + return null; + } + + for (SystemGroupData systemGroupData : list) { + JSONObject jsonObject = JSONObject.parseObject(systemGroupData.getValue()); + List systemFormItemCheckRequestList = YztUtil.jsonToListClass(jsonObject.getString("fields"), SystemFormItemCheckRequest.class); + if (systemFormItemCheckRequestList.size() < 1) { + continue; + } + HashMap map = new HashMap<>(); + T t; + for (SystemFormItemCheckRequest systemFormItemCheckRequest : systemFormItemCheckRequestList) { + map.put(systemFormItemCheckRequest.getName(), systemFormItemCheckRequest.getValue()); + } + map.put("id", systemGroupData.getId()); + t = YztUtil.mapToObj(map, cls); + arrayList.add(t); + } + + return arrayList; + } + + /** + * 通过gid获取列表 + * @param gid Integer group id + * + * @since 2020-05-15 + * @return List> + */ + @Override + public List> getListMapByGid(Integer gid) { + SystemGroupDataSearchRequest systemGroupDataSearchRequest = new SystemGroupDataSearchRequest(); + systemGroupDataSearchRequest.setGid(gid); + systemGroupDataSearchRequest.setStatus(true); + List list = getList(systemGroupDataSearchRequest, new PageParamRequest()); + + List> arrayList = new ArrayList<>(); + if (list.size() < 1) { + return null; + } + + for (SystemGroupData systemGroupData : list) { + JSONObject jsonObject = JSONObject.parseObject(systemGroupData.getValue()); + List systemFormItemCheckRequestList = YztUtil.jsonToListClass(jsonObject.getString("fields"), SystemFormItemCheckRequest.class); + if (systemFormItemCheckRequestList.size() < 1) { + continue; + } + HashMap map = new HashMap<>(); + + for (SystemFormItemCheckRequest systemFormItemCheckRequest : systemFormItemCheckRequestList) { + map.put(systemFormItemCheckRequest.getName(), systemFormItemCheckRequest.getValue()); + } + map.put("id", systemGroupData.getId()); + arrayList.add(map); + } + + return arrayList; + } + + /** + * 通过gid获取列表 + * @param groupDataId Integer group id + * @return + */ + public T getNormalInfo(Integer groupDataId, Class cls) { + SystemGroupData systemGroupData = getById(groupDataId); + if (null == systemGroupData || !systemGroupData.getStatus()) { + return null; + } + + JSONObject jsonObject = JSONObject.parseObject(systemGroupData.getValue()); + List systemFormItemCheckRequestList = YztUtil.jsonToListClass(jsonObject.getString("fields"), SystemFormItemCheckRequest.class); + if (systemFormItemCheckRequestList.size() < 1) { + return null; + } + HashMap map = new HashMap<>(); + T t; + for (SystemFormItemCheckRequest systemFormItemCheckRequest : systemFormItemCheckRequestList) { + map.put(systemFormItemCheckRequest.getName(), systemFormItemCheckRequest.getValue()); + } + map.put("id", systemGroupData.getId()); + t = YztUtil.mapToObj(map, cls); + + return t; + } + + /** + * 获取个人中心菜单 + * @return HashMap + */ + @Override + public HashMap getMenuUser() { + HashMap map = new HashMap<>(); + map.put("routine_my_menus", getListMapByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_MENU)); + map.put("routine_my_banner", getListMapByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_BANNER)); + return map; + } + + /** + * 获取列表通过gid + * @param gid gid + * @return 列表 + */ + @Override + public List findListByGid(Integer gid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemGroupData::getGid, gid); + lqw.orderByAsc(SystemGroupData::getSort).orderByAsc(SystemGroupData::getId); + return mapper.selectList(lqw); + } + + /** + * 删除通过gid + * @param gid gid + * @return Boolean + */ + @Override + public Boolean deleteByGid(Integer gid) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.eq(SystemGroupData::getGid, gid); + int delete = mapper.delete(luw); + if (delete > 0) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupServiceImpl.java new file mode 100644 index 0000000..364f175 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemGroupServiceImpl.java @@ -0,0 +1,94 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.model.system.SystemGroup; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemGroupRequest; +import com.yzt.common.request.SystemGroupSearchRequest; +import com.yzt.service.mapper.SystemGroupMapper; +import com.yzt.service.service.SystemGroupService; +import com.yzt.service.service.UserService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * SystemGroupServiceImpl 接口实现 + * + */ +@Service +public class SystemGroupServiceImpl extends ServiceImpl implements SystemGroupService { + + @Resource + private SystemGroupMapper mapper; + + @Autowired + private UserService userService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(SystemGroupSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 SystemGroup 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if(!StringUtils.isBlank(request.getKeywords())){ + lambdaQueryWrapper.like(SystemGroup::getName, request.getKeywords()); + } + lambdaQueryWrapper.orderByDesc(SystemGroup::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增组合数据 + * @param systemGroupRequest 新增参数 + */ + @Override + public Boolean add(SystemGroupRequest systemGroupRequest) { + SystemGroup systemGroup = new SystemGroup(); + BeanUtils.copyProperties(systemGroupRequest, systemGroup); + return save(systemGroup); + } + + /** + * 删除组合数据表 + * @param id Integer + */ + @Override + public Boolean delete(Integer id) { + boolean remove = removeById(id); + if (remove) { + // 删除用户对应已经存在的分组标签 虽然数据库用的是String类型但逻辑仅仅只存储一个数据,这里直接删除对应的用户分组id即可 + userService.clearGroupByGroupId(id.toString()); + } + return remove; + } + + /** + * 修改组合数据表 + * @param id integer id + * @param systemGroupRequest 修改参数 + */ + @Override + public Boolean edit(Integer id, SystemGroupRequest systemGroupRequest) { + SystemGroup systemGroup = new SystemGroup(); + BeanUtils.copyProperties(systemGroupRequest, systemGroup); + systemGroup.setId(id); + systemGroup.setUpdateTime(DateUtil.date()); + return updateById(systemGroup); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemMenuServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemMenuServiceImpl.java new file mode 100644 index 0000000..b07ed41 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemMenuServiceImpl.java @@ -0,0 +1,288 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.request.SystemMenuRequest; +import com.yzt.common.request.SystemMenuSearchRequest; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.MenuCheckTree; +import com.yzt.common.vo.MenuCheckVo; +import com.yzt.service.mapper.SystemMenuMapper; +import com.yzt.service.service.SystemMenuService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * SystemMenuServiceImpl 接口实现 + * + */ +@Service +public class SystemMenuServiceImpl extends ServiceImpl implements SystemMenuService { + + @Resource + private SystemMenuMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + private static final String CACHE_LIST_KEY = "menuList"; + + /** + * 通过权限获取管理员可访问目录 + * @return List + */ + @Override + public List findCatalogueByPermission(List permissionsList) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemMenu::getIsDelte, false); + lqw.eq(SystemMenu::getIsShow, true); + lqw.ne(SystemMenu::getMenuType, "A"); + lqw.in(SystemMenu::getPerms, permissionsList); + lqw.groupBy(SystemMenu::getId); + return mapper.selectList(lqw); + } + + /** + * 获取所有菜单 + * @return List + */ + @Override + public List findAllCatalogue() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemMenu::getIsDelte, false); + lqw.eq(SystemMenu::getIsShow, true); + lqw.ne(SystemMenu::getMenuType, "A"); + return mapper.selectList(lqw); + } + + /** + * 菜单列表 + * @param request 请求参数 + */ + @Override + public List getAdminList(SystemMenuSearchRequest request) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (StrUtil.isNotEmpty(request.getName())) { + lqw.like(SystemMenu::getName, request.getName()); + } + if (StrUtil.isNotEmpty(request.getMenuType())) { + lqw.eq(SystemMenu::getMenuType, request.getMenuType()); + } + lqw.eq(SystemMenu::getIsDelte, false); + lqw.orderByDesc(SystemMenu::getSort); + lqw.orderByAsc(SystemMenu::getId); + return mapper.selectList(lqw); + } + + /** + * 新增菜单 + * @param request 菜单参数 + * @return Boolean + */ + @Override + public Boolean add(SystemMenuRequest request) { + if (request.getMenuType().equals("C") && StrUtil.isEmpty(request.getComponent())) { + throw new YztException("菜单类型的组件路径不能为空"); + } + if (request.getMenuType().equals("A") && StrUtil.isEmpty(request.getPerms())) { + throw new YztException("按钮类型的权限表示不能为空"); + } + SystemMenu systemMenu = new SystemMenu(); + request.setId(null); + BeanUtils.copyProperties(request, systemMenu); + boolean save = save(systemMenu); + if (save) { + redisUtil.delete(CACHE_LIST_KEY); + } + return save; + } + + /** + * 根据id删除菜单 + * @param id 菜单id + * @return Boolean + */ + @Override + public Boolean deleteById(Integer id) { + SystemMenu systemMenu = getInfoById(id); + systemMenu.setIsDelte(true); + if (systemMenu.getMenuType().equals("A")) { + systemMenu.setUpdateTime(DateUtil.date()); + boolean update = updateById(systemMenu); + if (update) { + redisUtil.delete(CACHE_LIST_KEY); + } + return update; + } + List childList = findAllChildListByPid(id); + if (CollUtil.isEmpty(childList)) { + systemMenu.setUpdateTime(DateUtil.date()); + boolean update = updateById(systemMenu); + if (update) { + redisUtil.delete(CACHE_LIST_KEY); + } + return update; + } + childList.forEach(e -> e.setIsDelte(true).setUpdateTime(DateUtil.date())); + childList.add(systemMenu); + boolean updateBatch = updateBatchById(childList); + if (updateBatch) { + redisUtil.delete(CACHE_LIST_KEY); + } + return updateBatch; + } + + /** + * 修改菜单 + * @param request 菜单参数 + * @return Boolean + */ + @Override + public Boolean edit(SystemMenuRequest request) { + if (ObjectUtil.isNull(request.getId())) { + throw new YztException("系统菜单id不能为空"); + } + if (request.getMenuType().equals("C") && StrUtil.isEmpty(request.getComponent())) { + throw new YztException("菜单类型的组件路径不能为空"); + } + if (request.getMenuType().equals("A") && StrUtil.isEmpty(request.getPerms())) { + throw new YztException("按钮类型的权限表示不能为空"); + } + SystemMenu systemMenu = new SystemMenu(); + BeanUtils.copyProperties(request, systemMenu); + systemMenu.setUpdateTime(DateUtil.date()); + boolean update = updateById(systemMenu); + if (update) { + redisUtil.delete(CACHE_LIST_KEY); + } + return update; + } + + /** + * 获取菜单详情 + * @param id 菜单id + * @return SystemMenu + */ + @Override + public SystemMenu getInfo(Integer id) { + SystemMenu systemMenu = getInfoById(id); + systemMenu.setIsDelte(null); + systemMenu.setCreateTime(null); + systemMenu.setUpdateTime(null); + return systemMenu; + } + + /** + * 修改菜单显示状态 + * @param id 菜单id + * @return Boolean + */ + @Override + public Boolean updateShowStatus(Integer id) { + SystemMenu systemMenu = getInfoById(id); + systemMenu.setIsShow(!systemMenu.getIsShow()); + systemMenu.setUpdateTime(DateUtil.date()); + boolean update = updateById(systemMenu); + if (update) { + redisUtil.delete(CACHE_LIST_KEY); + } + return update; + } + + /** + * 获取菜单缓存列表 + */ + @Override + public List getCacheList() { + if (redisUtil.exists(CACHE_LIST_KEY)) { + return redisUtil.get(CACHE_LIST_KEY); + } + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemMenu::getIsDelte, false); + List systemMenuList = mapper.selectList(lqw); + redisUtil.set(CACHE_LIST_KEY, systemMenuList); + return systemMenuList; + } + + /** + * 菜单缓存树 + * @return List + */ + @Override + public List getCacheTree() { + List menuList = getCacheList(); + List voList = menuList.stream().map(e -> { + MenuCheckVo menuCheckVo = new MenuCheckVo(); + BeanUtils.copyProperties(e, menuCheckVo); + return menuCheckVo; + }).collect(Collectors.toList()); + MenuCheckTree menuTree = new MenuCheckTree(voList); + return menuTree.buildTree(); + } + + @Override + public List getAllPermissions() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemMenu::getIsDelte, false); + lqw.ne(SystemMenu::getMenuType, "M"); + return mapper.selectList(lqw); + } + + /** + * 通过用户id获取权限 + * @param userId 用户id + * @return List + */ + @Override + public List findPermissionByUserId(Integer userId) { + return mapper.findPermissionByUserId(userId); + } + + /** + * 获取用户路由 + * @param userId 用户id + * @return List + */ + @Override + public List getMenusByUserId(Integer userId) { + return mapper.getMenusByUserId(userId); + } + + /** + * 根据菜单id获取所有下级对象 + * @param pid 菜单id + * @return List + */ + private List findAllChildListByPid(Integer pid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemMenu::getPid, pid); + lqw.eq(SystemMenu::getIsDelte, false); + return mapper.selectList(lqw); + } + + /** + * 获取详细信息 + * @param id 菜单id + * @return SystemMenu + */ + private SystemMenu getInfoById(Integer id) { + SystemMenu systemMenu = getById(id); + if (ObjectUtil.isNull(systemMenu) || systemMenu.getIsDelte()) { + throw new YztException("系统菜单不存在"); + } + return systemMenu; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemNotificationServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemNotificationServiceImpl.java new file mode 100644 index 0000000..3f007eb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemNotificationServiceImpl.java @@ -0,0 +1,305 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +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.service.impl.ServiceImpl; +import com.yzt.common.constants.NotifyConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.sms.SmsTemplate; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.wechat.TemplateMessage; +import com.yzt.common.request.NotificationInfoRequest; +import com.yzt.common.request.NotificationSearchRequest; +import com.yzt.common.request.NotificationUpdateRequest; +import com.yzt.common.response.NotificationInfoResponse; +import com.yzt.service.mapper.SystemNotificationMapper; +import com.yzt.service.service.SmsTemplateService; +import com.yzt.service.service.SystemNotificationService; +import com.yzt.service.service.TemplateMessageService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * SystemNotificationServiceImpl 接口实现 + * + */ +@Service +public class SystemNotificationServiceImpl extends ServiceImpl implements SystemNotificationService { + + @Resource + private SystemNotificationMapper mapper; + + @Lazy + @Autowired + private TemplateMessageService templateMessageService; + + @Autowired + private SmsTemplateService smsTemplateService; + + @Autowired + private TransactionTemplate transactionTemplate; + + /** + * 系统通知列表 + * @param request 查询对象 + * @return List + */ + @Override + public List getList(NotificationSearchRequest request) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (ObjectUtil.isNotNull(request.getSendType())) { + lqw.eq(SystemNotification::getSendType, request.getSendType()); + } + return mapper.selectList(lqw); + } + + /** + * 公众号模板开关 + * @param id 通知id + * @return Boolean + */ + @Override + public Boolean wechatSwitch(Integer id) { + SystemNotification systemNotification = getByIdException(id); + if (systemNotification.getIsWechat().equals(0)) { + throw new YztException("通知没有配置公众号模板"); + } + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(SystemNotification::getIsWechat, systemNotification.getIsWechat().equals(1) ? 2 : 1); + luw.eq(SystemNotification::getId, id); + return update(luw); + } + + /** + * 小程序订阅模板开关 + * @param id 通知id + * @return Boolean + */ + @Override + public Boolean routineSwitch(Integer id) { + SystemNotification systemNotification = getByIdException(id); + if (systemNotification.getIsRoutine().equals(0)) { + throw new YztException("通知没有配置小程序订阅模板"); + } + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(SystemNotification::getIsRoutine, systemNotification.getIsRoutine().equals(1) ? 2 : 1); + luw.eq(SystemNotification::getId, id); + return update(luw); + } + + /** + * 发送短信开关 + * @param id 通知id + * @return Boolean + */ + @Override + public Boolean smsSwitch(Integer id) { + SystemNotification systemNotification = getByIdException(id); + if (systemNotification.getIsSms().equals(0)) { + throw new YztException("通知没有配置短信"); + } + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(SystemNotification::getIsSms, systemNotification.getIsSms().equals(1) ? 2 : 1); + luw.eq(SystemNotification::getId, id); + return update(luw); + } + + /** + * 通知详情 + * @param request 详情请求参数 + * @return NotificationInfoResponse + */ + @Override + public NotificationInfoResponse getDetail(NotificationInfoRequest request) { + SystemNotification notification = getByIdException(request.getId()); + NotificationInfoResponse response = new NotificationInfoResponse(); + if (request.getDetailType().equals("wechat")) { + if (notification.getIsWechat().equals(0)) { + throw new YztException("请先配置公众号模板消息"); + } + TemplateMessage templateMessage = templateMessageService.info(notification.getWechatId()); + BeanUtils.copyProperties(templateMessage, response); + response.setStatus(notification.getIsWechat()); + } + if (request.getDetailType().equals("routine")) { + if (notification.getIsRoutine().equals(0)) { + throw new YztException("请先配置小程序订阅消息"); + } + TemplateMessage templateMessage = templateMessageService.info(notification.getRoutineId()); + BeanUtils.copyProperties(templateMessage, response); + response.setStatus(notification.getIsRoutine()); + } + if (request.getDetailType().equals("sms")) { + if (notification.getIsSms().equals(0)) { + throw new YztException("请先配置短信模板"); + } + SmsTemplate smsTemplate = smsTemplateService.getDetail(notification.getSmsId()); + BeanUtils.copyProperties(smsTemplate, response); + response.setStatus(notification.getIsSms()); + } + return response; + } + + /** + * 根据标识查询信息 + * @param mark 标识 + * @return SystemNotification + */ + @Override + public SystemNotification getByMark(String mark) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemNotification::getMark, mark); + return mapper.selectOne(lqw); + } + + /** + * 获取微信相关列表 + * @param type routine-小程序,public-公众号 + */ + @Override + public List getListByWechat(String type) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if ("routine".equals(type)) { + lqw.ne(SystemNotification::getIsRoutine, 0); + } + if ("public".equals(type)) { + lqw.ne(SystemNotification::getIsWechat, 0); + } + return mapper.selectList(lqw); + } + + /** + * 修改通知 + * @param request 请求参数 + * @return Boolean + */ + @Override + public Boolean modify(NotificationUpdateRequest request) { + if (!request.getDetailType().equals("sms") && StrUtil.isEmpty(request.getTempId())) { + throw new YztException("模板id不能为空"); + } + SystemNotification notification = getByIdException(request.getId()); + if (request.getDetailType().equals("wechat")) { + if (notification.getIsWechat().equals(0)) { + throw new YztException("请先为通知配置公众号模板"); + } + TemplateMessage templateMessage = templateMessageService.info(notification.getWechatId()); + if (templateMessage.getTempId().equals(request.getTempId()) && notification.getIsWechat().equals(request.getStatus())) { + return true; + } + return transactionTemplate.execute(e -> { + if (!templateMessage.getTempId().equals(request.getTempId())) { + templateMessage.setTempId(request.getTempId()); + templateMessage.setUpdateTime(DateUtil.date()); + templateMessageService.updateById(templateMessage); + } + if (!notification.getIsWechat().equals(request.getStatus())) { + notification.setIsWechat(request.getStatus()); + updateById(notification); + } + return Boolean.TRUE; + }); + } + if (request.getDetailType().equals("routine")) { + if (notification.getIsRoutine().equals(0)) { + throw new YztException("请先为通知配置小程序订阅模板"); + } + TemplateMessage templateMessage = templateMessageService.info(notification.getRoutineId()); + if (templateMessage.getTempId().equals(request.getTempId()) && notification.getIsRoutine().equals(request.getStatus())) { + return true; + } + return transactionTemplate.execute(e -> { + if (!templateMessage.getTempId().equals(request.getTempId())) { + templateMessage.setTempId(request.getTempId()); + templateMessage.setUpdateTime(DateUtil.date()); + templateMessageService.updateById(templateMessage); + } + if (!notification.getIsRoutine().equals(request.getStatus())) { + notification.setIsRoutine(request.getStatus()); + updateById(notification); + } + return Boolean.TRUE; + }); + } + if (request.getDetailType().equals("sms") && !notification.getIsSms().equals(request.getStatus())) { + notification.setIsSms(request.getStatus()); + return updateById(notification); + } + return true; + } + + /** + * 获取小程序订阅模板编号(小程序端调用) + * @param type 场景类型 + * 支付之前:beforePay + * 支付成功通知 + * 支付成功:afterPay + * 发货、配送、收货 + * 申请退款:refundApply + * 退款成功、拒绝退款 + * 充值之前:beforeRecharge + * 充值成功通知 + * 创建砍价:createBargain + * 砍价成功、失败通知 + * 参与拼团:pink + * 拼团成功、失败通知 + * 取消拼团:cancelPink + * 退款成功、拒绝退款 + * @return List + */ + @Override + public List getMiniTempList(String type) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SystemNotification::getIsRoutine, 1); + switch (type) { + case "beforePay":// 支付之前 + lqw.eq(SystemNotification::getMark, NotifyConstants.PAY_SUCCESS_MARK); + break; + case "afterPay":// 支付成功 + lqw.in(SystemNotification::getMark, NotifyConstants.DELIVER_GOODS_MARK, NotifyConstants.FULFILLMENT_ORDER_MARK, NotifyConstants.RECEIPT_GOODS_MARK); + break; + case "refundApply":// 申请退款 + lqw.eq(SystemNotification::getMark, "-1"); + break; + case "beforeRecharge":// 充值之前 + lqw.eq(SystemNotification::getMark, "-1"); + break; + case "createBargain":// 创建砍价 + lqw.in(SystemNotification::getMark, NotifyConstants.BARGAINING_SUCCESS_MARK); + break; + case "pink":// 参与拼团 + lqw.in(SystemNotification::getMark, NotifyConstants.GROUP_SUCCESS_MARK); + break; + case "cancelPink":// cancelPink + lqw.eq(SystemNotification::getMark, "-1"); + break; + } + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + List tidList = list.stream().map(SystemNotification::getRoutineId).collect(Collectors.toList()); + return templateMessageService.getByIdList(tidList); + } + + private SystemNotification getByIdException(Integer id) { + SystemNotification notification = getById(id); + if (ObjectUtil.isNull(notification)) { + throw new YztException("系统通知不存在"); + } + return notification; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleMenuServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleMenuServiceImpl.java new file mode 100644 index 0000000..922ca22 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleMenuServiceImpl.java @@ -0,0 +1,52 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.system.SystemRoleMenu; +import com.yzt.service.mapper.SystemRoleMenuMapper; +import com.yzt.service.service.SystemRoleMenuService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * SystemRoleMenuServiceImpl 接口实现 + * 角色菜单关联服务实现 + * + */ +@Service +public class SystemRoleMenuServiceImpl extends ServiceImpl implements SystemRoleMenuService { + + @Resource + private SystemRoleMenuMapper mapper; + + /** + * 通过角色id删除 + * @param rid 角色id + */ + @Override + public Boolean deleteByRid(Integer rid) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.eq(SystemRoleMenu::getRid, rid); + return mapper.delete(luw) > 0; + } + + /** + * 通过角色id获取菜单列表 + * @param rid 角色id + * @return List + */ + @Override + public List getMenuListByRid(Integer rid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(SystemRoleMenu::getMenuId); + lqw.eq(SystemRoleMenu::getRid, rid); + List roleMenuList = mapper.selectList(lqw); + return roleMenuList.stream().map(SystemRoleMenu::getMenuId).collect(Collectors.toList()); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleServiceImpl.java new file mode 100644 index 0000000..97725c5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemRoleServiceImpl.java @@ -0,0 +1,304 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.model.system.SystemRole; +import com.yzt.common.model.system.SystemRoleMenu; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemRoleRequest; +import com.yzt.common.request.SystemRoleSearchRequest; +import com.yzt.common.response.RoleInfoResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.vo.CategoryTreeVo; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.common.vo.MenuCheckTree; +import com.yzt.common.vo.MenuCheckVo; +import com.yzt.service.mapper.SystemRoleMapper; +import com.yzt.service.service.CategoryService; +import com.yzt.service.service.SystemMenuService; +import com.yzt.service.service.SystemRoleMenuService; +import com.yzt.service.service.SystemRoleService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * SystemRoleServiceImpl 接口实现 + * + */ +@Service +public class SystemRoleServiceImpl extends ServiceImpl implements SystemRoleService { + + @Resource + private SystemRoleMapper mapper; + + @Autowired + private CategoryService categoryService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private SystemRoleMenuService systemRoleMenuService; + + @Autowired + private SystemMenuService systemMenuService; + + /** + * 获取所有角色 + * @return List + */ + @Override + public List getAllList() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemRole::getStatus, true); + lambdaQueryWrapper.orderByAsc(SystemRole::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(SystemRoleSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SystemRole::getId, SystemRole::getRoleName, SystemRole::getStatus, + SystemRole::getCreateTime, SystemRole::getUpdateTime); + if (ObjectUtil.isNotNull(request.getStatus())) { + lambdaQueryWrapper.eq(SystemRole::getStatus, request.getStatus()); + } + if (ObjectUtil.isNotNull(request.getRoleName())) { + lambdaQueryWrapper.like(SystemRole::getRoleName, request.getRoleName()); + } + lambdaQueryWrapper.orderByAsc(SystemRole::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 根据id集合获取对应权限列表 + * @param ids id集合 + * @return 对应的权限列表 + */ + @Override + public List getListInIds(List ids) { + return mapper.selectBatchIds(ids); + } + + /** + * 带结构的无线级分类 + */ + @Override + public List menu() { + List categoryIdList = getRoleListInRoleId(); + System.out.println("权限列表:categoryIdList:"+ JSON.toJSONString(categoryIdList)); + return categoryService.getListTree(Constants.CATEGORY_TYPE_MENU, 1, categoryIdList); + } + + /** + * 修改身份状态 + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + SystemRole role = getById(id); + if (ObjectUtil.isNull(role)) { + throw new YztException("身份不存在"); + } + if (role.getStatus().equals(status)) { + return true; + } + role.setStatus(status); + role.setUpdateTime(DateUtil.date()); + return updateById(role); + } + + /** + * 添加身份 + * @param systemRoleRequest 身份参数 + * @return Boolean + */ + @Override + public Boolean add(SystemRoleRequest systemRoleRequest) { + if (existName(systemRoleRequest.getRoleName(), null)) { + throw new YztException("角色名称重复"); + } + List ruleList = Stream.of(systemRoleRequest.getRules().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); + SystemRole systemRole = new SystemRole(); + BeanUtils.copyProperties(systemRoleRequest, systemRole); + systemRole.setId(null); + systemRole.setRules(""); + + return transactionTemplate.execute(e -> { + boolean save = save(systemRole); + if (!save) { + return Boolean.FALSE; + } + List roleMenuList = ruleList.stream().map(rule -> { + SystemRoleMenu roleMenu = new SystemRoleMenu(); + roleMenu.setRid(systemRole.getId()); + roleMenu.setMenuId(rule); + return roleMenu; + }).collect(Collectors.toList()); + systemRoleMenuService.saveBatch(roleMenuList, 100); + return Boolean.TRUE; + }); + } + + /** + * 判断角色名称是否存在 + * @param roleName 角色名称 + * @param id 角色id + * @return Boolean + */ + private Boolean existName(String roleName, Integer id) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemRole::getRoleName, roleName); + if (ObjectUtil.isNotNull(id)) { + lqw.ne(SystemRole::getId, id); + } + lqw.last(" limit 1"); + Integer count = mapper.selectCount(lqw).intValue(); + return count > 0; + } + + /** + * 修改身份管理表 + * @param systemRoleRequest 修改参数 + */ + @Override + public Boolean edit(SystemRoleRequest systemRoleRequest) { + SystemRole role = getById(systemRoleRequest.getId()); + if (ObjectUtil.isNull(role)) { + throw new YztException("角色不存在"); + } + if (!role.getRoleName().equals(systemRoleRequest.getRoleName())) { + if (existName(systemRoleRequest.getRoleName(), systemRoleRequest.getId())) { + throw new YztException("角色名称重复"); + } + } + SystemRole systemRole = new SystemRole(); + BeanUtils.copyProperties(systemRoleRequest, systemRole); + systemRole.setRules(""); + List ruleList = Stream.of(systemRoleRequest.getRules().split(",")).map(Integer::valueOf).distinct().collect(Collectors.toList()); + List roleMenuList = ruleList.stream().map(rule -> { + SystemRoleMenu roleMenu = new SystemRoleMenu(); + roleMenu.setRid(systemRole.getId()); + roleMenu.setMenuId(rule); + return roleMenu; + }).collect(Collectors.toList()); + return transactionTemplate.execute(e -> { + systemRole.setUpdateTime(DateUtil.date()); + updateById(systemRole); + systemRoleMenuService.deleteByRid(systemRole.getId()); + systemRoleMenuService.saveBatch(roleMenuList, 100); + return Boolean.TRUE; + }); + } + + /** + * 删除角色 + * @param id 角色id + * @return Boolean + */ + @Override + public Boolean delete(Integer id) { + SystemRole systemRole = getById(id); + if (ObjectUtil.isNull(systemRole)) { + throw new YztException("角色已删除"); + } + return transactionTemplate.execute(e -> { + mapper.deleteById(id); + systemRoleMenuService.deleteByRid(id); + return Boolean.TRUE; + }); + } + + /** + * 获取角色详情 + * @param id 角色id + * @return RoleInfoResponse + */ + @Override + public RoleInfoResponse getInfo(Integer id) { + SystemRole systemRole = getById(id); + if (ObjectUtil.isNull(systemRole)) { + throw new YztException("角色不存在"); + } + // 查询角色对应的菜单(权限) + List menuList = systemMenuService.getCacheList(); + List menuIdList = systemRoleMenuService.getMenuListByRid(id); + + List menuCheckVoList = menuList.stream().map(menu -> { + MenuCheckVo menuCheckVo = new MenuCheckVo(); + BeanUtils.copyProperties(menu, menuCheckVo); + if (menuIdList.contains(menu.getId())) { + menuCheckVo.setChecked(true); + } else { + menuCheckVo.setChecked(false); + } + return menuCheckVo; + }).collect(Collectors.toList()); + + RoleInfoResponse response = new RoleInfoResponse(); + BeanUtils.copyProperties(systemRole, response); + response.setMenuList(new MenuCheckTree(menuCheckVoList).buildTree()); + return response; + } + + private List getRoleListInRoleId(){ + //获取当前用户的所有权限 +// SystemAdmin systemAdmin = systemAdminService.getInfo(); + LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo(); + SystemAdmin systemAdmin = loginUserVo.getUser(); + if (null == systemAdmin || StringUtils.isBlank(systemAdmin.getRoles())){ + throw new YztException("没有权限访问!"); + } + + //获取用户权限组 + List systemRoleList = getVoListInId(systemAdmin.getRoles()); + if (systemRoleList.size() < 1){ + throw new YztException("没有权限访问!"); + } + + //获取用户权限规则 + List categoryIdList = new ArrayList<>(); + for (SystemRole systemRole : systemRoleList) { + if (StringUtils.isBlank(systemRole.getRules())){ + continue; + } + + categoryIdList.addAll(YztUtil.stringToArray(systemRole.getRules())); + } + + return categoryIdList; + } + + private List getVoListInId(String roles) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(SystemRole::getId, YztUtil.stringToArray(roles)); + return mapper.selectList(lambdaQueryWrapper); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreServiceImpl.java new file mode 100644 index 0000000..eb9446a --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreServiceImpl.java @@ -0,0 +1,302 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreNearRequest; +import com.yzt.common.request.SystemStoreRequest; +import com.yzt.common.response.StoreNearResponse; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.SystemStoreNearVo; +import com.yzt.service.mapper.SystemStoreMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.SystemStoreService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * SystemStoreServiceImpl 接口实现 + * + */ +@Service +public class SystemStoreServiceImpl extends ServiceImpl implements SystemStoreService { + + @Resource + private SystemStoreMapper mapper; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + + /** + * 分页显示门店 + * @param keywords 搜索条件 + * @param pageParamRequest 分页参数 + */ + @Override + public List getList(String keywords, Integer status, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (status == 1) { // 显示中 + lambdaQueryWrapper.eq(SystemStore::getIsShow, true).eq(SystemStore::getIsDel, false); + }else if (status == 2) { // 回收站中 + lambdaQueryWrapper.eq(SystemStore::getIsDel, true); + } else { // 隐藏中的 + lambdaQueryWrapper.eq(SystemStore::getIsShow, false).eq(SystemStore::getIsDel, false); + } + if (!StringUtils.isBlank(keywords)) { + lambdaQueryWrapper.and(i -> i.or().like(SystemStore::getName, keywords) + .or().like(SystemStore::getPhone, keywords)); + } + lambdaQueryWrapper.orderByDesc(SystemStore::getUpdateTime).orderByDesc(SystemStore::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 根据基本参数查询 + * @param systemStore 基本参数 + * @return 门店结果 + */ + @Override + public SystemStore getByCondition(SystemStore systemStore) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.setEntity(systemStore); + return mapper.selectOne(lqw); + } + + /** + * 修改门店显示状态 + * @param id integer id + * @param status 状态 + * @return boolean + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + SystemStore systemStore = getById(id); + if (ObjectUtil.isNull(systemStore)) { + throw new YztException("门店自提点不存在"); + } + if (systemStore.getIsShow().equals(status)) { + return true; + } + systemStore.setIsShow(status); + systemStore.setUpdateTime(DateUtil.date()); + return updateById(systemStore); + } + + /** + * 删除门店自提 + * @param id Integer + * @return boolean + */ + @Override + public Boolean delete(Integer id) { + SystemStore systemStore = new SystemStore(); + systemStore.setId(id); + systemStore.setIsDel(true); + systemStore.setUpdateTime(DateUtil.date()); + mapper.updateById(systemStore); + return true; + } + + /** + * 数量 + * @param keywords 搜索条件:门店名称、门店电话 + * @return HashMap + */ + @Override + public HashMap getCount(String keywords) { + HashMap map = new HashMap<>(); + map.put("show", getCountByStatus(1, keywords));// 显示中 + map.put("hide", getCountByStatus(0, keywords));// 隐藏 + map.put("recycle", getCountByStatus(2, keywords));// 回收站 + return map; + } + + /** + * 根据状态获取总数 + * @return HashMap + */ + private Integer getCountByStatus(Integer status, String keywords) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (status == 2) { + lambdaQueryWrapper.eq(SystemStore::getIsDel, true); + } else { + lambdaQueryWrapper.eq(SystemStore::getIsShow, status).eq(SystemStore::getIsDel, false); + } + if (!StringUtils.isBlank(keywords)) { + lambdaQueryWrapper.and(i -> i.or().like(SystemStore::getName, keywords) + .or().like(SystemStore::getPhone, keywords)); + } + lambdaQueryWrapper.orderByDesc(SystemStore::getUpdateTime).orderByDesc(SystemStore::getId); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 根据id集合查询数据,返回 map + * @param storeIdList List id集合 + * @return HashMap + */ + @Override + public HashMap getMapInId(List storeIdList) { + HashMap map = new HashMap<>(); + if (storeIdList.size() < 1) { + return map; + } + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(SystemStore::getId, storeIdList); + List systemStoreList = mapper.selectList(lambdaQueryWrapper); + if (systemStoreList.size() < 1) { + return map; + } + for (SystemStore systemStore : systemStoreList) { + map.put(systemStore.getId(), systemStore); + } + return map; + } + + /** + * 附近的提货点 + * @param request StoreNearRequest 经纬度参数 + * @param pageParamRequest PageParamRequest 分页参数 + * @return StoreNearResponse + */ + @Override + public StoreNearResponse getNearList(StoreNearRequest request, PageParamRequest pageParamRequest) { + StoreNearResponse storeNearResponse = new StoreNearResponse(); + + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + List storeNearVoArrayList = new ArrayList<>(); + + if (StringUtils.isNotBlank(request.getLatitude()) && StringUtils.isNotBlank(request.getLongitude())) { + if (!request.getLatitude().matches("^(90(\\.0+)?|([1-8]?\\d)(\\.\\d+)?)$") + || !request.getLongitude().matches("^(180(\\.0+)?|(1[0-7]?\\d|[1-9]?\\d)(\\.\\d+)?)$")) { + throw new YztException("经纬度坐标输入有误"); + } + storeNearVoArrayList = mapper.getNearList(request); + } else { + List list = getList(null, 1, pageParamRequest); + for (SystemStore systemStore : list) { + SystemStoreNearVo systemStoreNearVo = new SystemStoreNearVo(); + BeanUtils.copyProperties(systemStore, systemStoreNearVo); + storeNearVoArrayList.add(systemStoreNearVo); + } + } + + storeNearResponse.setList(storeNearVoArrayList); + return storeNearResponse; + } + + /** + * 新增门店自提 + * @param request SystemStoreRequest 新增参数 + * @return Boolean + */ + @Override + public Boolean create(SystemStoreRequest request) { + SystemStore systemStore = new SystemStore(); + BeanUtils.copyProperties(request, systemStore); + clearPrefix(systemStore); + splitLat(systemStore); + return save(systemStore); + } + + /** + * 修改门店自提 + * @param id integer id + * @param request 修改参数 + * @return Boolean + */ + @Override + public Boolean update(Integer id, SystemStoreRequest request) { + SystemStore systemStore = new SystemStore(); + BeanUtils.copyProperties(request, systemStore); + systemStore.setId(id); + splitLat(systemStore); + clearPrefix(systemStore); + systemStore.setUpdateTime(DateUtil.date()); + return updateById(systemStore); + } + + /** + * 彻底删除 + * @param id 提货点编号 + * @return Boolean + */ + @Override + public Boolean completeLyDelete(Integer id) { + SystemStore systemStore = getById(id); + if (ObjectUtil.isNull(systemStore)) throw new YztException("提货点不存在!"); + int delete = mapper.deleteById(id); + return delete > 0; + } + + /** + * 提货点恢复 + * @param id 提货点编号 + * @return Boolean + */ + @Override + public Boolean recovery(Integer id) { + SystemStore systemStore = getById(id); + if (ObjectUtil.isNull(systemStore)) throw new YztException("提货点不存在!"); + if (!systemStore.getIsDel()) return Boolean.TRUE; + systemStore.setIsDel(false); + systemStore.setUpdateTime(DateUtil.date()); + return updateById(systemStore); + } + + /** + * 门店自提详情 + * @param id Integer + * @return SystemStore + */ + @Override + public SystemStore getInfo(Integer id) { + SystemStore systemStore = getById(id); + if (ObjectUtil.isNull(systemStore)) { + throw new YztException("门店自提点不存在"); + } + systemStore.setLatitude(systemStore.getLatitude() + "," + systemStore.getLongitude()); + return systemStore; + } + + /** + * 去掉图片前缀 + * @param systemStore SystemStore 新增参数 + */ + private void clearPrefix(SystemStore systemStore) { + systemStore.setImage(systemAttachmentService.clearPrefix(systemStore.getImage())); + } + + /** + * 分解经纬度 + * @param systemStore SystemStore 新增参数 + */ + private void splitLat(SystemStore systemStore) { + if (!StringUtils.isBlank(systemStore.getLatitude())) { + List list = YztUtil.stringToArrayStr(systemStore.getLatitude()); + systemStore.setLongitude(list.get(0)); + systemStore.setLatitude(list.get(1)); + } + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreStaffServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreStaffServiceImpl.java new file mode 100644 index 0000000..bf77eac --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemStoreStaffServiceImpl.java @@ -0,0 +1,160 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemStore; +import com.yzt.common.model.system.SystemStoreStaff; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.SystemStoreStaffRequest; +import com.yzt.common.response.SystemStoreStaffResponse; +import com.yzt.service.mapper.SystemStoreStaffMapper; +import com.yzt.service.service.SystemStoreService; +import com.yzt.service.service.SystemStoreStaffService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * SystemStoreStaffServiceImpl 接口实现 + * + */ +@Service +public class SystemStoreStaffServiceImpl extends ServiceImpl implements SystemStoreStaffService { + + @Resource + private SystemStoreStaffMapper mapper; + + @Autowired + private UserService userService; + + @Autowired + private SystemStoreService systemStoreService; + + /** + * 列表 + * @param storeId 门店id + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(Integer storeId, PageParamRequest pageParamRequest) { + Page systemStorePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (storeId > 0) { + lambdaQueryWrapper.eq(SystemStoreStaff::getStoreId, storeId); + } + ArrayList systemStoreStaffResponseArrayList = new ArrayList<>(); + List systemStoreStaffList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(systemStoreStaffList)) { + return new PageInfo<>(); + } + + //用户信息 + List userIdList = systemStoreStaffList.stream().map(SystemStoreStaff::getUid).collect(Collectors.toList()); + HashMap userList = null; + if (userIdList.size() >= 1) { + userList = userService.getMapListInUid(userIdList); + } + //门店信息 + List storeIdList = systemStoreStaffList.stream().map(SystemStoreStaff::getStoreId).collect(Collectors.toList()); + HashMap storeList = null; + if (storeIdList.size() >= 1) { + storeList = systemStoreService.getMapInId(storeIdList); + } + for (SystemStoreStaff systemStoreStaff : systemStoreStaffList) { + SystemStoreStaffResponse systemStoreStaffResponse = new SystemStoreStaffResponse(); + BeanUtils.copyProperties(systemStoreStaff, systemStoreStaffResponse); + if (CollUtil.isNotEmpty(userList) && userList.containsKey(systemStoreStaff.getUid())) { + systemStoreStaffResponse.setUser(userList.get(systemStoreStaff.getUid())); + } + if (CollUtil.isNotEmpty(storeList) && storeList.containsKey(systemStoreStaff.getStoreId())) { + systemStoreStaffResponse.setSystemStore(storeList.get(systemStoreStaff.getStoreId())); + } + systemStoreStaffResponseArrayList.add(systemStoreStaffResponse); + } + return CommonPage.copyPageInfo(systemStorePage, systemStoreStaffResponseArrayList); + } + + /** + * 查询核销员列表 + * @param userIds uidList + * @return storeList + */ + private List getByAdminUserIds(List userIds) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.in(SystemStoreStaff::getUid, userIds); + List existStaffs = mapper.selectList(lambdaQueryWrapper); + return existStaffs.stream().distinct().collect(Collectors.toList()); + } + + /** + * 添加核销员 唯一验证 + * + * @param request 当前添加参数 + * @return 添加结果 + */ + @Override + public Boolean saveUnique(SystemStoreStaffRequest request) { + List userIds = new ArrayList<>(); + userIds.add(request.getUid()); + List existStaffs = getByAdminUserIds(userIds); + if (CollUtil.isNotEmpty(existStaffs) && existStaffs.size() > 0) throw new YztException(Constants.RESULT_VERIFICATION_USER_EXIST); + SystemStoreStaff systemStoreStaff = new SystemStoreStaff(); + BeanUtils.copyProperties(request, systemStoreStaff); + return mapper.insert(systemStoreStaff) > 0; + } + + /** + * 更新核销员信息 + * @param id 核销员id + * @param systemStoreStaffRequest 更新参数 + */ + @Override + public Boolean edit(Integer id, SystemStoreStaffRequest systemStoreStaffRequest) { + SystemStoreStaff systemStoreStaff = new SystemStoreStaff(); + BeanUtils.copyProperties(systemStoreStaffRequest, systemStoreStaff); + systemStoreStaff.setId(id); + systemStoreStaff.setUpdateTime(DateUtil.date()); + return updateById(systemStoreStaff); + } + + /** + * 修改核销员状态 + * @param id 核销员id + * @param status 状态 + * @return Boolean + */ + @Override + public Boolean updateStatus(Integer id, Integer status) { + SystemStoreStaff systemStoreStaff = getById(id); + if (ObjectUtil.isNull(systemStoreStaff)) { + throw new YztException("核销员不存在"); + } + if (systemStoreStaff.getStatus().equals(status)) { + return true; + } + systemStoreStaff.setStatus(status); + systemStoreStaff.setUpdateTime(DateUtil.date()); + return updateById(systemStoreStaff); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemUserLevelServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemUserLevelServiceImpl.java new file mode 100644 index 0000000..341835e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/SystemUserLevelServiceImpl.java @@ -0,0 +1,266 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.request.SystemUserLevelRequest; +import com.yzt.common.request.SystemUserLevelUpdateShowRequest; +import com.yzt.service.mapper.SystemUserLevelMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.SystemUserLevelService; +import com.yzt.service.service.UserLevelService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * SystemUserLevelServiceImpl 接口实现 + * + */ +@Service +public class SystemUserLevelServiceImpl extends ServiceImpl implements SystemUserLevelService { + + @Resource + private SystemUserLevelMapper mapper; + + @Autowired + private SystemAttachmentService systemAttachmentService; + @Lazy + @Autowired + private UserLevelService userLevelService; + @Lazy + @Autowired + private UserService userService; + @Autowired + private TransactionTemplate transactionTemplate; + + + /** + * 分页显示设置用户等级表 + * @return List + */ + @Override + public List getList() { + LambdaQueryWrapper levelLambdaQueryWrapper = new LambdaQueryWrapper<>(); + levelLambdaQueryWrapper.eq(SystemUserLevel::getIsDel, false); + levelLambdaQueryWrapper.orderByAsc(SystemUserLevel::getGrade); + return mapper.selectList(levelLambdaQueryWrapper); + } + + public Map buildGradeToNameMap() { + List allLevels = getList(); + + // 3. 构建全量映射:levelId → levelName + return allLevels.stream() + .collect(Collectors.toMap( + SystemUserLevel::getGrade, + SystemUserLevel::getName, + (v1, v2) -> v1 // 防止重复 key + )); + } + + /** + * 新增设置用户等级表 + * @param request SystemUserLevelRequest 新增参数 + * @return boolean + * 等级名称不能重复 + * 等级级别不能重复 + */ + @Override + public Boolean create(SystemUserLevelRequest request) { + checkLevel(request); + SystemUserLevel systemUserLevel = new SystemUserLevel(); + BeanUtils.copyProperties(request, systemUserLevel); + systemUserLevel.setIcon(systemAttachmentService.clearPrefix(request.getIcon())); + return save(systemUserLevel); + } + + /** + * 添加、修改校验 + * @param request 用户等级参数 + * 等级名称不能重复 + * 等级级别不能重复 + */ + private void checkLevel(SystemUserLevelRequest request) { + SystemUserLevel temp; + // 校验名称 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SystemUserLevel::getName, request.getName()); + if (ObjectUtil.isNotNull(request.getId())) { + lqw.ne(SystemUserLevel::getId, request.getId()); + } + lqw.eq(SystemUserLevel::getIsDel, false); + temp = mapper.selectOne(lqw); + if (ObjectUtil.isNotNull(temp)) { + throw new YztException("用户等级名称重复"); + } + // 校验等级级别 + lqw.clear(); + lqw.eq(SystemUserLevel::getGrade, request.getGrade()); + if (ObjectUtil.isNotNull(request.getId())) { + lqw.ne(SystemUserLevel::getId, request.getId()); + } + lqw.eq(SystemUserLevel::getIsDel, false); + temp = mapper.selectOne(lqw); + if (ObjectUtil.isNotNull(temp)) { + throw new YztException("用户等级级别重复"); + } + // 校验等级经验不能比上一级别的低,不能比下一级别高 + if (request.getGrade() > 1) { + lqw.clear(); + lqw.lt(SystemUserLevel::getGrade, request.getGrade()); + if (ObjectUtil.isNotNull(request.getId())) { + lqw.ne(SystemUserLevel::getId, request.getId()); + } + lqw.eq(SystemUserLevel::getIsDel, false); + lqw.orderByDesc(SystemUserLevel::getGrade); + lqw.last(" limit 1"); + temp = mapper.selectOne(lqw); + if (ObjectUtil.isNotNull(temp) && temp.getExperience() >= request.getExperience()) { + throw new YztException("当前等级的经验不能比上一级别的经验低"); + } + } + lqw.clear(); + lqw.gt(SystemUserLevel::getGrade, request.getGrade()); + if (ObjectUtil.isNotNull(request.getId())) { + lqw.ne(SystemUserLevel::getId, request.getId()); + } + lqw.eq(SystemUserLevel::getIsDel, false); + lqw.orderByAsc(SystemUserLevel::getGrade); + lqw.last(" limit 1"); + temp = mapper.selectOne(lqw); + if (ObjectUtil.isNotNull(temp) && temp.getExperience() <= request.getExperience()) { + throw new YztException("当前等级的经验不能比下一级别的经验高"); + } + } + + + /** + * 系统等级更新 + * @param id 等级id + * @param request 等级数据 + * @return Boolean + */ + @Override + public Boolean update(Integer id, SystemUserLevelRequest request) { + SystemUserLevel level = getById(id); + if (ObjectUtil.isNull(level) || level.getIsDel()) { + throw new YztException("等级不存在"); + } + request.setId(id); + checkLevel(request); + SystemUserLevel systemUserLevel = new SystemUserLevel(); + BeanUtils.copyProperties(request, systemUserLevel); + systemUserLevel.setIcon(systemAttachmentService.clearPrefix(request.getIcon())); + systemUserLevel.setIsShow(level.getIsShow()); + return transactionTemplate.execute(e -> { + systemUserLevel.setUpdateTime(DateUtil.date()); + mapper.updateById(systemUserLevel); + // 删除对应的用户等级数据 + userLevelService.deleteByLevelId(id); + // 清除对应的用户等级 + userService.removeLevelByLevelId(id); + return Boolean.TRUE; + }); + } + + @Override + public SystemUserLevel getByLevelId(Integer levelId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SystemUserLevel::getIsShow, 1); + lambdaQueryWrapper.eq(SystemUserLevel::getIsDel, 0); + lambdaQueryWrapper.eq(SystemUserLevel::getId, levelId); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 获取系统等级列表(移动端) + */ + @Override + public List getH5LevelList() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(SystemUserLevel::getId, SystemUserLevel::getName, SystemUserLevel::getIcon, SystemUserLevel::getExperience); + lqw.eq(SystemUserLevel::getIsShow, true); + lqw.eq(SystemUserLevel::getIsDel, false); + lqw.orderByAsc(SystemUserLevel::getGrade); + return mapper.selectList(lqw); + } + + /** + * 删除系统等级 + * @param id 等级id + * @return Boolean + */ + @Override + public Boolean delete(Integer id) { + SystemUserLevel level = getById(id); + if (ObjectUtil.isNull(level) || level.getIsDel()) { + throw new YztException("系统等级不存在"); + } + level.setIsDel(true); + return transactionTemplate.execute(e -> { + level.setUpdateTime(DateUtil.date()); + mapper.updateById(level); + // 删除对应的用户等级数据 + userLevelService.deleteByLevelId(id); + // 清除对应的用户等级 + userService.removeLevelByLevelId(id); + return Boolean.TRUE; + }); + } + + /** + * 使用/禁用 + * @param request request + */ + @Override + public Boolean updateShow(SystemUserLevelUpdateShowRequest request) { + SystemUserLevel level = getById(request.getId()); + if (ObjectUtil.isNull(level) || level.getIsDel()) { + throw new YztException("等级不存在"); + } + if (level.getIsShow().equals(request.getIsShow())) { + return Boolean.TRUE; + } + level.setIsShow(request.getIsShow()); + if (request.getIsShow()) {// 启用直接保存 + level.setUpdateTime(DateUtil.date()); + return mapper.updateById(level) > 0 ? Boolean.TRUE : Boolean.FALSE; + } + return transactionTemplate.execute(e -> { + level.setUpdateTime(DateUtil.date()); + mapper.updateById(level); + // 删除对应的用户等级数据 + userLevelService.deleteByLevelId(request.getId()); + // 清除对应的用户等级 + userService.removeLevelByLevelId(request.getId()); + return Boolean.TRUE; + }); + } + + /** + * 获取可用等级列表 + * @return List + */ + @Override + public List getUsableList() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(SystemUserLevel::getIsShow, true); + lqw.eq(SystemUserLevel::getIsDel, false); + lqw.orderByAsc(SystemUserLevel::getGrade); + return mapper.selectList(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/TemplateMessageServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/TemplateMessageServiceImpl.java new file mode 100644 index 0000000..c4617b4 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/TemplateMessageServiceImpl.java @@ -0,0 +1,293 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemNotification; +import com.yzt.common.model.wechat.TemplateMessage; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.*; +import com.yzt.service.mapper.TemplateMessageMapper; +import com.yzt.service.service.SystemNotificationService; +import com.yzt.service.service.TemplateMessageService; +import com.yzt.service.service.WechatNewService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * TemplateMessageServiceImpl 接口实现 + * + */ +@Service +public class TemplateMessageServiceImpl extends ServiceImpl implements TemplateMessageService { + + private static final Logger logger = LoggerFactory.getLogger(TemplateMessageServiceImpl.class); + + @Resource + private TemplateMessageMapper mapper; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private WechatNewService wechatNewService; + + @Autowired + private SystemNotificationService systemNotificationService; + + /** + * 公众号消费队列消费 + */ + @Override + public void consumePublic() { + String redisKey = Constants.WE_CHAT_MESSAGE_KEY_PUBLIC; + Long size = redisUtil.getListSize(redisKey); + logger.info("TemplateMessageServiceImpl.consumePublic | size:" + size); + if(size < 1){ + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if(null == data){ + continue; + } + try{ + TemplateMessageVo templateMessage = JSONObject.toJavaObject(JSONObject.parseObject(data.toString()), TemplateMessageVo.class); + boolean result = wechatNewService.sendPublicTemplateMessage(templateMessage); +// boolean result = weChatService.sendPublicTempMessage(templateMessage); + if(!result){ + redisUtil.lPush(redisKey, data); + } + }catch (Exception e){ + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 小程序消费队列消费 + */ + @Override + public void consumeProgram() { + String redisKey = Constants.WE_CHAT_MESSAGE_KEY_PROGRAM; + Long size = redisUtil.getListSize(redisKey); + logger.info("TemplateMessageServiceImpl.consumeProgram | size:" + size); + if(size < 1){ + return; + } + for (int i = 0; i < size; i++) { + //如果10秒钟拿不到一个数据,那么退出循环 + Object data = redisUtil.getRightPop(redisKey, 10L); + if(null == data){ + continue; + } + try{ + TemplateMessageVo templateMessage = JSONObject.toJavaObject(JSONObject.parseObject(data.toString()), TemplateMessageVo.class); + boolean result = wechatNewService.sendMiniSubscribeMessage(templateMessage); + if(!result){ + redisUtil.lPush(redisKey, data); + } + }catch (Exception e){ + redisUtil.lPush(redisKey, data); + } + } + } + + /** + * 发送模板消息 + * @param templateId 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openid + */ + @Override + public void pushTemplateMessage(Integer templateId, HashMap temMap, String openId) { + TemplateMessageVo templateMessageVo = new TemplateMessageVo(); + + TemplateMessage templateMessage = info(templateId); + if(ObjectUtil.isNull(templateMessage) || StrUtil.isBlank(templateMessage.getContent())){ + return; + } + templateMessageVo.setTemplate_id(templateMessage.getTempId()); + + HashMap hashMap = new HashMap<>(); + for (Map.Entry entry : temMap.entrySet()){ + hashMap.put(entry.getKey(), new SendTemplateMessageItemVo(entry.getValue())); + } + + templateMessageVo.setData(hashMap); + templateMessageVo.setTouser(openId); + redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PUBLIC, JSONObject.toJSONString(templateMessageVo)); + } + + /** + * 发送小程序订阅消息 + * @param templateId 模板消息编号 + * @param temMap 内容Map + * @param openId 微信用户openId + */ + @Override + public void pushMiniTemplateMessage(Integer templateId, HashMap temMap, String openId) { + TemplateMessage templateMessage = info(templateId); + if(ObjectUtil.isNull(templateMessage) || StrUtil.isBlank(templateMessage.getContent())){ + return; + } + + ProgramTemplateMessageVo programTemplateMessageVo = new ProgramTemplateMessageVo(); + programTemplateMessageVo.setTemplate_id(templateMessage.getTempId()); + + //组装关键字数据 + HashMap hashMap = new HashMap<>(); + temMap.forEach((key, value) -> hashMap.put(key, new SendProgramTemplateMessageItemVo(value))); + + programTemplateMessageVo.setData(hashMap); + programTemplateMessageVo.setTouser(openId); + redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PROGRAM, JSONObject.toJSONString(programTemplateMessageVo)); + } + + /** + * 修改模板状态 + * @param id 模板id + * @param status 状态 + */ + @Override + public Boolean updateStatus(Integer id, Integer status) { + TemplateMessage templateMessage = getById(id); + if (ObjectUtil.isNull(templateMessage)) { + throw new YztException("此模板" + id + " 不存在或者已删除"); + } + templateMessage.setStatus(status); + templateMessage.setUpdateTime(DateUtil.date()); + return updateById(templateMessage); + } + + /** + * 公众号模板消息同步 + * @return Boolean + */ + @Override + public Boolean whcbqhnSync() { + List notificationList = systemNotificationService.getListByWechat("public"); + List wechatIdList = notificationList.stream().map(SystemNotification::getWechatId).collect(Collectors.toList()); + List templateMessageList = getListByIdList(wechatIdList); + if (CollUtil.isEmpty(templateMessageList)) { + throw new YztException("请先添加公众号模板消息"); + } + + // 获取公众平台所有的微信模板,删除之 + List templateVoList = wechatNewService.getPublicMyTemplateList(); + templateVoList.forEach(e -> wechatNewService.delPublicMyTemplate(e.getTemplate_id())); + // 将现在的模板保存到公众平台 + templateMessageList.forEach(e -> { + String templateId = wechatNewService.apiAddPublicTemplate(e.getTempKey()); + e.setTempId(templateId); + e.setUpdateTime(DateUtil.date()); + }); + return updateBatchById(templateMessageList); + } + + /** + * 小程序订阅消息同步 + * @return Boolean + */ + @Override + public Boolean routineSync() { + List notificationList = systemNotificationService.getListByWechat("routine"); + List routineIdList = notificationList.stream().map(SystemNotification::getRoutineId).collect(Collectors.toList()); + List templateMessageList = getListByIdList(routineIdList); + if (CollUtil.isEmpty(templateMessageList)) { + throw new YztException("请先配置小程序订阅消息"); + } + // 获取当前帐号下的个人模板列表 + List templateVoList = wechatNewService.getRoutineMyTemplateList(); + // 删除原有模板 + templateVoList.forEach(e -> wechatNewService.delRoutineMyTemplate(e.getPriTmplId())); + // 将现在的模板保存到小程序平台 + templateMessageList.forEach(e -> { + // 获取小程序平台上的标准模板 + List templateKeyVoList = wechatNewService.getRoutineTemplateByWechat(e.getTempKey()); + List kidList = getRoutineKidList(e.getContent(), templateKeyVoList); + String priTmplId = wechatNewService.apiAddRoutineTemplate(e.getTempKey(), kidList); + e.setTempId(priTmplId); + e.setUpdateTime(DateUtil.date()); + }); + return updateBatchById(templateMessageList); + } + + /** + * 获取小程序订阅消息kidList + * @param content 本地保存的内容 + * @param templateKeyVoList 小程序模板key对象数组 + * @return List + */ + private List getRoutineKidList(String content, List templateKeyVoList) { + // 分解出本地的关键词内容数组 + String replace = content.replace("\r\n", ""); + String[] split = replace.split("}}"); + List collect = Stream.of(split).map(s -> { + s = s.substring(0, s.indexOf("{")); + return s; + }).collect(Collectors.toList()); + + Map map = new HashMap<>(); + templateKeyVoList.forEach(e -> map.put(e.getName(), e.getKid())); + + List kidList = new ArrayList<>(); + collect.forEach(e -> { + if (map.containsKey(e)) { + kidList.add(map.get(e)); + } + }); + return kidList; + } + + /** + * 通过模板编号获取列表 + * @param idList 模板编号列表 + * @return List + */ + private List getListByIdList(List idList) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.in(TemplateMessage::getId, idList); + return mapper.selectList(lqw); + } + + /** + * 查询单条数据 + * @param id Integer id + */ + @Override + public TemplateMessage info(Integer id) { + return getById(id); + } + + /** + * 获取模板列表 + * @param tidList id数组 + * @return List + */ + @Override + public List getByIdList(List tidList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(TemplateMessage::getId, tidList); + return mapper.selectList(lambdaQueryWrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/TenantServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/TenantServiceImpl.java new file mode 100644 index 0000000..3db9ed3 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/TenantServiceImpl.java @@ -0,0 +1,211 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.util.StringUtil; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.TenantPageRequest; +import com.yzt.common.request.TenantSaveRequest; +import com.yzt.common.response.SystemAdminResponse; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.TenantVo; +import com.yzt.common.vo.WechatMerchantConfigVo; +import com.yzt.service.mapper.SystemAdminMapper; +import com.yzt.service.mapper.TenantMapper; + +import com.yzt.service.service.SystemAdminService; +import com.yzt.service.service.TenantService; +import com.yzt.service.service.WechatMerchantConfigService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: pengsz + * @Date: 2025/11/07 + * @Description: + */ +@Service +public class TenantServiceImpl extends ServiceImpl implements TenantService { + + @Resource + private TenantMapper mapper; + + @Resource + private SystemAdminService systemAdminService; + + @Resource + private WechatMerchantConfigService wechatMerchantConfigService; + + @Autowired + private TransactionTemplate transactionTemplate; + @Override + public Long saveTenant(TenantSaveRequest tenantSaveRequest) { + // 保存租户 +// checkNameExist(tenantSaveRequest); + Tenant tenant = BeanUtil.copyProperties(tenantSaveRequest, Tenant.class); + if (Objects.isNull(getById(tenantSaveRequest.getTenantId()))){ + tenant.setIsDel(0); + tenant.setCreatedTime(YztDateUtil.nowDateTime()); + tenant.setCreatedBy(SecurityUtil.getLoginUserVo().getUser().getId()); + } + tenant.setUpdatedTime(YztDateUtil.nowDateTime()); + tenant.setUpdatedBy(SecurityUtil.getLoginUserVo().getUser().getId()); + + return transactionTemplate.execute(e -> { + this.saveOrUpdate(tenant); + wechatMerchantConfigService.saveOrUpdateByTenant(tenantSaveRequest.getWechatMerchantConfigVo(),tenant.getTenantId(), Objects.requireNonNull(SecurityUtil.getLoginUserVo()).getUser().getId()); + return tenant.getTenantId(); + }); + } + + @Override + public List getList(TenantPageRequest tenantRequest, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + LocalDateTime startTime = tenantRequest.getStartTime(); + LocalDateTime endTime = tenantRequest.getEndTime(); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.like(StringUtil.isNotEmpty(tenantRequest.getTenantName()), Tenant::getTenantName, tenantRequest.getTenantName()) + .eq(StringUtil.isNotEmpty(tenantRequest.getCode()), Tenant::getCode, tenantRequest.getCode()) + .eq(Objects.nonNull(tenantRequest.getCreatedBy()), Tenant::getCreatedBy, tenantRequest.getCreatedBy()) + .between(Objects.nonNull(startTime) && Objects.nonNull(endTime), Tenant::getCreatedTime, startTime, endTime); + + if(Objects.nonNull(tenantRequest.getStatus())){ + queryWrapper.eq(Tenant::getStatus,tenantRequest.getStatus()); + } + List tenantVoList = mapper.selectList(queryWrapper); + if (CollUtil.isEmpty(tenantVoList)) { + return CollUtil.newArrayList(); + } + List tenantVos = new ArrayList<>(); + + for (Tenant tenant : tenantVoList) { + TenantVo tv = new TenantVo(); + BeanUtils.copyProperties(tenant, tv); + tenantVos.add(tv); + } + return tenantVos; + } + + @Override + public TenantVo getInfo(Long tenantId) { + Tenant tenant = getById(tenantId); + TenantVo tenantVo = BeanUtil.copyProperties(tenant, TenantVo.class); + tenantVo.setWechatMerchantConfigVo(Objects.requireNonNull(wechatMerchantConfigService.getByTenant(tenantId))); + return tenantVo; + } + + @Override + public Boolean setStatus(Integer status, Long tenantId) { + Tenant tenant = new Tenant(); + tenant.setTenantId(tenantId); + tenant.setStatus(status); + if (this.updateById(tenant)) { + return true; + } + return false; + } + /** + * 获取租户列表 + */ + @Override + public List getTenantsByCurrentAdmin() { + // 1. 获取当前用户ID + Integer userId = SecurityUtil.getCurrentUserId(); + if (userId == null) { + return Collections.emptyList(); + } + + // 2. 查询管理员详情(注意:tenantId 字段应为 String 类型!) + SystemAdmin admin = systemAdminService.getDetail(userId); + if (admin == null || Objects.isNull(admin.getTenantId())) { + return Collections.emptyList(); + } + + // 3. 拆分 tenantId 字符串(假设格式为 "1,2,3") + String tenantIdsStr = String.valueOf(admin.getTenantId()); + List tenantIdList; + try { + tenantIdList = Arrays.stream(tenantIdsStr.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .map(Long::parseLong) + .collect(Collectors.toList()); + } catch (NumberFormatException e) { + new YztException("管理员 "+userId+" 的 tenantId 格式错误:"+tenantIdsStr+e); + return Collections.emptyList(); + } + + if (tenantIdList.isEmpty()) { + return Collections.emptyList(); + } + + // 4. 批量查询租户(需确保 tenantMapper 支持 selectBatchIds) + List tenantVos = new ArrayList<>(); + for (Tenant tenant : mapper.selectBatchIds(tenantIdList)) { + TenantVo tenantVo = new TenantVo(); + BeanUtils.copyProperties(tenant,tenantVo); + tenantVos.add(tenantVo); + } + + return tenantVos; + } + + private void checkNameExist(TenantSaveRequest req) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Tenant.class) + .select(Tenant::getTenantId, Tenant::getTenantName, Tenant::getCode, Tenant::getCreditCode) + .ne(ObjectUtil.isNotNull(req.getTenantId()), Tenant::getTenantId, req.getTenantId()); + List tenants = this.list(wrapper); + if (CollUtil.isNotEmpty(tenants)) { + Map tenantNameMap = tenants.stream() + .collect(Collectors.toMap( + Tenant::getTenantId, + Tenant::getTenantName, + (existing, replacement) -> replacement + )); + Map codeMap = tenants.stream() + .collect(Collectors.toMap( + Tenant::getTenantId, + Tenant::getCode, + (existing, replacement) -> replacement + )); + + Map creditCodeMap = tenants.stream() + .collect(Collectors.toMap( + Tenant::getTenantId, + Tenant::getCreditCode, + (existing, replacement) -> replacement + )); + tenants.forEach(tenant -> { + String tenantName = tenantNameMap.get(tenant.getTenantId()); + String code = codeMap.get(tenant.getTenantId()); + String creditCode = creditCodeMap.get(tenant.getTenantId()); + if (ObjectUtil.equal(tenantName, req.getTenantName())) { + throw new YztException("租户名称已存在"); + } + if (ObjectUtil.equal(code, req.getCode())) { + throw new YztException("租户编码已存在"); + } + if (ObjectUtil.equal(creditCode, req.getCreditCode())) { + throw new YztException("社会统一信用代码已存在"); + } + }); + } + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UploadServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UploadServiceImpl.java new file mode 100644 index 0000000..c9a2061 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UploadServiceImpl.java @@ -0,0 +1,294 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.SysConfigConstants; +import com.yzt.common.constants.UploadConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemAttachment; +import com.yzt.common.result.CommonResultCode; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.UploadUtil; +import com.yzt.common.vo.CloudVo; +import com.yzt.common.vo.FileResultVo; +import com.yzt.service.plugin.file.FilePluginFactory; +import com.yzt.service.service.*; +import org.apache.commons.io.FilenameUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.List; + + +/** + * UploadServiceImpl 接口实现 + * + */ +@Service +public class UploadServiceImpl implements UploadService { + + private static final Logger logger = LoggerFactory.getLogger(UploadServiceImpl.class); + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private QiNiuService qiNiuService; + + @Autowired + private OssService ossService; + + @Autowired + private CosService cosService; + + @Autowired + YztConfig yztConfig; + + @Autowired + private JdCloudService jdCloudService; + + @Autowired + private ApplicationContext applicationContext; + + @Autowired + private FilePluginFactory filePluginFactory; + + /** + * 图片上传 + * @param multipartFile 文件 + * @param model 模块 用户user,商品product,微信wechat,news文章 + * @param pid 分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 + * @return FileResultVo + */ + @Override + public FileResultVo imageUpload(MultipartFile multipartFile, String model, Integer pid) { + FileResultVo fileResultVo = new FileResultVo(); + try { + fileResultVo = commonUpload(multipartFile, model, pid, UploadConstants.UPLOAD_FILE_KEYWORD); + } catch (IOException e) { + logger.error("图片上传IO异常,{}", e.getMessage(), e); + throw new YztException("图片上传 IO异常"); + } + return fileResultVo; + } + + /** + * 文件长传 + * @param multipartFile 文件 + * @param model 模块 用户user,商品product,微信wechat,news文章 + * @param pid 分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 + * @return FileResultVo + * @throws IOException + */ + @Override + public FileResultVo fileUpload(MultipartFile multipartFile, String model, Integer pid) throws IOException { + FileResultVo fileResultVo = new FileResultVo(); + try { + fileResultVo = commonUpload(multipartFile, model, pid, UploadConstants.UPLOAD_FILE_KEYWORD); + } catch (IOException e) { + logger.error("文件上传IO异常,{}", e.getMessage()); + throw new YztException("文件上传 IO异常"); + } + return fileResultVo; + } + + /** + * 上传校验 + * + * @param fileName 文件名称 + * @param fileSize 文件大小 + * @return 后缀名 + */ + private String uploadValidate(String fileName, float fileSize, String fileType, String contentType) { + // 文件后缀名 + String extName = FilenameUtils.getExtension(fileName).toLowerCase(); + if (StrUtil.isEmpty(extName)) { + if (StrUtil.isNotBlank(contentType)) { + extName = contentType.split("/")[1]; + } else { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "文件类型未定义,无法上传..."); + } + } + + String extStr = systemConfigService.getValueByKey(fileType.equals(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD) ? SysConfigConstants.UPLOAD_FILE_EXT_STR_CONFIG_KEY : SysConfigConstants.UPLOAD_IMAGE_EXT_STR_CONFIG_KEY); + // 判断文件的后缀名是否符合规则 + if (StrUtil.isNotBlank(extStr)) { + // 切割文件扩展名 + List extensionList = YztUtil.stringToArrayStr(extStr); + if (CollUtil.isNotEmpty(extensionList)) { + //判断 + if (!extensionList.contains(extName)) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "上载文件类型只能为:" + extStr); + } + } else { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "上载文件类型只能为:" + extStr); + } + } + // 文件大小验证 + int size = Integer.parseInt(systemConfigService.getValueByKey(fileType.equals(UploadConstants.UPLOAD_AFTER_FILE_KEYWORD) ? SysConfigConstants.UPLOAD_FILE_MAX_SIZE_CONFIG_KEY : SysConfigConstants.UPLOAD_IMAGE_MAX_SIZE_CONFIG_KEY)); + String fs = String.format("%.2f", fileSize); + if (fileSize > size) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, StrUtil.format("最大允许上传 {} MB文件,当前文件大小为 {} MB", size, fs)); + } + return extName; + } + + + /** + * 公共上传 + * + * @param multipartFile 文件 + * @param model 模块 用户user,商品product,微信wechat,文章article,系统system + * @param pid 分类ID 0编辑器,1商品图片,2拼团图片,3砍价图片,4秒杀图片,5文章图片,6组合数据图,7前台用户,8微信系列 + * @param fileType 文件类型 + * @return FileResultVo + * @throws IOException IOE异常 + */ + private FileResultVo commonUpload(MultipartFile multipartFile, String model, Integer pid, String fileType) throws IOException { + if (ObjectUtil.isNull(multipartFile) || multipartFile.isEmpty()) { + throw new YztException(CommonResultCode.VALIDATE_FAILED, "上载的文件对象不存在..."); + } + // 校验 + String fileName = multipartFile.getOriginalFilename(); + float fileSize = (float) multipartFile.getSize() / 1024 / 1024; + // 文件后缀名 + String extName = uploadValidate(fileName, fileSize, fileType, multipartFile.getContentType()); + if (fileName.length() > 99) { + fileName = StrUtil.subPre(fileName, 90).concat(".").concat(extName); + } + + // 服务器存储地址 + String rootPath = ""; + + String osName = applicationContext.getEnvironment().getProperty("os.name"); + assert osName != null; + if (osName.contains("Windows")) { + rootPath = "D:/yzt/"; + } else { + rootPath = yztConfig.getImagePath().trim(); + } + // 模块 + String modelPath = "public/" + model + "/"; + // 类型 + String type = (fileType.equals(UploadConstants.UPLOAD_FILE_KEYWORD) ? UploadConstants.UPLOAD_FILE_KEYWORD : UploadConstants.UPLOAD_AFTER_FILE_KEYWORD) + "/"; + + // 变更文件名 + String newFileName = UploadUtil.fileName(extName); + // 创建目标文件的名称,规则: 子目录/年/月/日.后缀名 + String webPath = type + modelPath + YztDateUtil.nowDate("yyyy/MM/dd") + "/"; + // 文件分隔符转化为当前系统的格式 + String destPath = FilenameUtils.separatorsToSystem(rootPath + webPath) + newFileName; + // 创建文件 + File file = UploadUtil.createFile(destPath); + + // 拼装返回的数据 + FileResultVo resultFile = new FileResultVo(); + resultFile.setFileSize(multipartFile.getSize()); + resultFile.setFileName(fileName); + resultFile.setExtName(extName); + resultFile.setUrl(webPath + newFileName); + resultFile.setType(multipartFile.getContentType()); + if (fileType.equals(UploadConstants.UPLOAD_FILE_KEYWORD)) { + resultFile.setType(resultFile.getType().replace("image/", "")); + } else { + resultFile.setType(resultFile.getType().replace("file/", "")); + } + + SystemAttachment systemAttachment = new SystemAttachment(); + systemAttachment.setName(resultFile.getFileName()); + systemAttachment.setSattDir(resultFile.getUrl()); + systemAttachment.setAttSize(resultFile.getFileSize().toString()); + systemAttachment.setAttType(resultFile.getType()); + systemAttachment.setImageType(1); //图片上传类型 1本地 2七牛云 3OSS 4COS, 默认本地 + systemAttachment.setPid(pid); + + //图片上传类型 1本地 2七牛云 3OSS 4COS, 默认本地 + String uploadType = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_UPLOAD_TYPE); + Integer uploadTypeInt = Integer.parseInt(uploadType); + if (uploadTypeInt.equals(1)) { + // 保存文件 + multipartFile.transferTo(file); + systemAttachmentService.save(systemAttachment); + return resultFile; + } + CloudVo cloudVo = new CloudVo(); + switch (uploadTypeInt) { + case 2: + systemAttachment.setImageType(2); + cloudVo.setDomain(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_QN_UPLOAD_URL)); + cloudVo.setAccessKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_QN_ACCESS_KEY)); + cloudVo.setSecretKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_QN_SECRET_KEY)); + cloudVo.setBucketName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_QN_STORAGE_NAME)); + cloudVo.setRegion(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_QN_STORAGE_REGION)); + try { + // 构造一个带指定Zone对象的配置类, 默认华东 + Configuration cfg = new Configuration(Region.autoRegion()); + + // 其他参数参考类注释 + UploadManager uploadManager = new UploadManager(cfg); + // 生成上传凭证,然后准备上传 + Auth auth = Auth.create(cloudVo.getAccessKey(), cloudVo.getSecretKey()); + String upToken = auth.uploadToken(cloudVo.getBucketName()); + + String webPathQn = yztConfig.getImagePath(); + qiNiuService.uploadFile(uploadManager, upToken, + systemAttachment.getSattDir(), webPathQn + "/" + systemAttachment.getSattDir(), file); //异步处理 + } catch (Exception e) { + logger.error("AsyncServiceImpl.qCloud.fail " + e.getMessage()); + } + break; + case 3: + systemAttachment.setImageType(3); + cloudVo.setDomain(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_UPLOAD_URL)); + cloudVo.setAccessKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_ACCESS_KEY)); + cloudVo.setSecretKey(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_SECRET_KEY)); + cloudVo.setBucketName(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_STORAGE_NAME)); + cloudVo.setRegion(systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_AL_STORAGE_REGION)); + try { + String webPathAl = yztConfig.getImagePath(); + ossService.upload(cloudVo, systemAttachment.getSattDir(), webPathAl + "/" + systemAttachment.getSattDir(), + file); + } catch (Exception e) { + logger.error("AsyncServiceImpl.oss fail " + e.getMessage()); + } + break; + case 4: + systemAttachment.setImageType(4); + try { + filePluginFactory.filePlugin().inputStreamUpload(multipartFile.getInputStream(), systemAttachment.getSattDir()); + } catch (Exception e) { + logger.error("AsyncServiceImpl.cos.fail " + e.getMessage(), e); + } + break; + case 5: // 京东云存储 + systemAttachment.setImageType(5); + String bucket = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_BUCKET_NAME); + try { + String webPathTx = yztConfig.getImagePath(); + jdCloudService.uploadFile(systemAttachment.getSattDir(), webPathTx + "/" + systemAttachment.getSattDir(), bucket); + } catch (Exception e) { + logger.error("AsyncServiceImpl.cos.fail " + e.getMessage()); + } + break; + } + systemAttachmentService.save(systemAttachment); + return resultFile; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserAddressServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserAddressServiceImpl.java new file mode 100644 index 0000000..ff5ca63 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserAddressServiceImpl.java @@ -0,0 +1,233 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemCity; +import com.yzt.common.model.user.UserAddress; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserAddressRequest; +import com.yzt.service.mapper.UserAddressMapper; +import com.yzt.service.service.SystemCityService; +import com.yzt.service.service.UserAddressService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * UserAddressServiceImpl 接口实现 + * + */ +@Service +public class UserAddressServiceImpl extends ServiceImpl implements UserAddressService { + + @Resource + private UserAddressMapper mapper; + + @Autowired + private SystemCityService systemCityService; + + @Autowired + private UserService userService; + + /** + * 列表 + * + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest,Boolean isAddress) { + Integer UserId = userService.getUserIdException(); + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserAddress::getId, UserAddress::getRealName, UserAddress::getPhone, UserAddress::getProvince, + UserAddress::getCity, UserAddress::getDistrict, UserAddress::getDetail, UserAddress::getIsDefault, + UserAddress::getSex,UserAddress::getType); + lqw.eq(UserAddress::getUid, UserId); + lqw.eq(UserAddress::getIsDel, false); + if(isAddress){ + lqw.isNull(UserAddress::getType); + }else { + lqw.isNotNull(UserAddress::getType); + } + lqw.orderByDesc(UserAddress::getIsDefault); + lqw.orderByDesc(UserAddress::getId); + return mapper.selectList(lqw); + } + + public List getUserList(PageParamRequest pageParamRequest) { + return getList(pageParamRequest,true); + } + + public List getCustomerList(PageParamRequest pageParamRequest) { + return getList(pageParamRequest,false); + } + + /** + * 创建地址 + * @param request UserAddressRequest 参数 + * @return List + */ + @Override + public UserAddress create(UserAddressRequest request) { + UserAddress userAddress = new UserAddress(); + BeanUtils.copyProperties(request, userAddress); + userAddress.setCity(request.getAddress().getCity()); + userAddress.setCityId(request.getAddress().getCityId()); + userAddress.setDistrict(request.getAddress().getDistrict()); + userAddress.setProvince(request.getAddress().getProvince()); + userAddress.setSex(request.getSex()); + userAddress.setType(request.getType()); + + // 添加地址时cityId和城市名称不能同时为空,如果id为空,必须用城市名称自查后set CityId + if (request.getAddress().getCityId() == 0 && StrUtil.isBlank(request.getAddress().getDistrict())) { + throw new YztException("请选择正确城市数据"); + } + if (StrUtil.isNotBlank(request.getAddress().getCity()) && request.getAddress().getCityId() == 0) { + SystemCity systemCity = systemCityService.getCityByCityName(request.getAddress().getCity()); + if (ObjectUtil.isNull(systemCity)) { + throw new YztException("当前城市未找到"); + } + SystemCity currentCity = systemCityService.getByAreaNameAndPid(request.getAddress().getDistrict(), systemCity.getCityId()); + if (ObjectUtil.isNull(currentCity)) throw new YztException("当前城市区域未找到!"); + userAddress.setCityId(currentCity.getCityId()); + } + + if (request.getAddress().getCityId() > 0 && StrUtil.isNotBlank(request.getAddress().getDistrict())) { + checkCity(userAddress.getCityId()); + } + userAddress.setUid(userService.getUserIdException()); + if (userAddress.getIsDefault()) { + //把当前用户其他默认地址取消 + cancelDefault(userAddress.getUid()); + } + saveOrUpdate(userAddress); + return userAddress; + } + + /** + * 设置默认 + * + * @param id Integer id + * @return UserAddress + */ + @Override + public Boolean def(Integer id) { + //把当前用户其他默认地址取消 + cancelDefault(userService.getUserIdException()); + UserAddress userAddress = new UserAddress(); + userAddress.setId(id); + userAddress.setUid(userService.getUserIdException()); + userAddress.setIsDefault(true); + userAddress.setUpdateTime(DateUtil.date()); + return updateById(userAddress); + } + + /** + * 删除 + * + * @param id Integer id + * @return UserAddress + */ + @Override + public Boolean delete(Integer id) { + //把当前用户其他默认地址取消 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserAddress::getId, id); + lambdaQueryWrapper.eq(UserAddress::getUid, userService.getUserIdException()); + mapper.delete(lambdaQueryWrapper); + return true; + } + + /** + * 获取默认地址 + * + * @return UserAddress + */ + @Override + public UserAddress getDefault() { + //把当前用户其他默认地址取消 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserAddress::getIsDefault, true); + lambdaQueryWrapper.eq(UserAddress::getUid, userService.getUserId()); + lambdaQueryWrapper.eq(UserAddress::getIsDel, false); + return mapper.selectOne(lambdaQueryWrapper); + } + + @Override + public UserAddress getById(Integer addressId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserAddress::getId, addressId); + lambdaQueryWrapper.eq(UserAddress::getIsDel, false); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 获取地址详情 + * + * @param id 地址id + * @return UserAddress + */ + @Override + public UserAddress getDetail(Integer id) { + Integer UserId = userService.getUserIdException(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserAddress::getId, UserAddress::getRealName, UserAddress::getPhone, UserAddress::getProvince, + UserAddress::getCity, UserAddress::getDistrict, UserAddress::getDetail, UserAddress::getIsDefault); + lqw.eq(UserAddress::getId, id); + lqw.eq(UserAddress::getUid, UserId); + lqw.eq(UserAddress::getIsDel, false); + return mapper.selectOne(lqw); + } + + /** + * 获取默认地址 + * + * @return UserAddress + */ + @Override + public UserAddress getDefaultByUid(Integer uid) { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.eq(UserAddress::getIsDefault, true); + lambdaQueryWrapper.eq(UserAddress::getUid, uid); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 检测城市id是否合法 + * + * @param cityId Integer 城市id + */ + private void checkCity(Integer cityId) { + //检测城市Id是否存在 + SystemCity systemCity = systemCityService.getByAreaId(cityId); + if (ObjectUtil.isNull(systemCity)) { + throw new YztException("请选择正确的城市"); + } + } + + /** + * 取消默认地址 + * + * @param userId Integer 城市id + */ + private void cancelDefault(Integer userId) { + //检测城市Id是否存在 + UserAddress userAddress = new UserAddress(); + userAddress.setIsDefault(false); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserAddress::getUid, userId); + update(userAddress, lambdaQueryWrapper); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBankCardServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBankCardServiceImpl.java new file mode 100644 index 0000000..c263aa5 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBankCardServiceImpl.java @@ -0,0 +1,135 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.model.user.UserBankCard; +import com.yzt.common.model.user.UserBankCard; + +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserBankCardRequest; +import com.yzt.service.mapper.UserBankCardMapper; + +import com.yzt.service.service.UserBankCardService; +import com.yzt.service.service.UserService; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @Author: pengsz + * @Date: 2025/11/17 + * @Description: + */ +@Service +public class UserBankCardServiceImpl extends ServiceImpl implements UserBankCardService { + + @Resource + private UserBankCardMapper mapper; + + @Autowired + private UserService userService; + + /** + * 列表 + * + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest) { + Integer UserId = userService.getUserIdException(); + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserBankCard::getId, UserBankCard::getHolderName, UserBankCard::getPhone, UserBankCard::getIsDefault,UserBankCard::getUid,UserBankCard::getBankName,UserBankCard::getBankName,UserBankCard::getBankCode,UserBankCard::getCardNo); + lqw.eq(UserBankCard::getUid, UserId); + lqw.eq(UserBankCard::getIsDel, false); + lqw.orderByDesc(UserBankCard::getIsDefault); + lqw.orderByDesc(UserBankCard::getId); + List userBankCards = mapper.selectList(lqw); + return userBankCards; + } + + + /** + * 创建银行卡 + * + * @param request UserBankCardRequest 参数 + * @return List + */ + @Override + public UserBankCard create(UserBankCardRequest request) { + UserBankCard userBankCard = new UserBankCard(); + BeanUtils.copyProperties(request,userBankCard); + + userBankCard.setUid(userService.getUserIdException()); + if (userBankCard.getIsDefault()) { + //把当前用户其他默认地址取消 + cancelDefault(userBankCard.getUid()); + } + saveOrUpdate(userBankCard); + return userBankCard; + } + + @Override + public boolean delete(Integer id) { + //把当前用户其他默认地址取消 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserBankCard::getId, id); + lambdaQueryWrapper.eq(UserBankCard::getUid, userService.getUserIdException()); + mapper.delete(lambdaQueryWrapper); + return true; + } + + @Override + public UserBankCard getDetail(Integer id) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserBankCard::getId, UserBankCard::getHolderName, UserBankCard::getPhone, UserBankCard::getIsDefault,UserBankCard::getUid,UserBankCard::getBankName,UserBankCard::getBankName,UserBankCard::getBankCode,UserBankCard::getCardNo); + lqw.eq(UserBankCard::getId, id); + lqw.eq(UserBankCard::getIsDel, false); + return mapper.selectOne(lqw); + } + + @Override + public UserBankCard getDefault() { + //把当前用户其他默认地址取消 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserBankCard::getIsDefault, true); + lambdaQueryWrapper.eq(UserBankCard::getUid, userService.getUserId()); + lambdaQueryWrapper.eq(UserBankCard::getIsDel, false); + return mapper.selectOne(lambdaQueryWrapper); + } + + @Override + public boolean def(Long id) { + //把当前用户其他默认地址取消 + cancelDefault(userService.getUserIdException()); + UserBankCard userBankCard = new UserBankCard(); + userBankCard.setId(id); + userBankCard.setUid(userService.getUserIdException()); + userBankCard.setIsDefault(true); + userBankCard.setUpdateTime(DateUtil.date()); + return updateById(userBankCard); + } + + /** + * 取消默认地址 + * + * @param userId Integer + */ + private void cancelDefault(Integer userId) { + //检测Id是否存在 + UserBankCard userBankCard = new UserBankCard(); + userBankCard.setIsDefault(false); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserBankCard::getUid, userId); + update(userBankCard, lambdaQueryWrapper); + } + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBillServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBillServiceImpl.java new file mode 100644 index 0000000..047c66b --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBillServiceImpl.java @@ -0,0 +1,359 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.FundsMonitorRequest; +import com.yzt.common.request.FundsMonitorSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.StoreOrderRefundRequest; +import com.yzt.common.response.MonitorResponse; +import com.yzt.common.response.UserBillResponse; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserBillMapper; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.TenantService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * UserBillServiceImpl 接口实现 + * + */ +@Service +public class UserBillServiceImpl extends ServiceImpl implements UserBillService { + + @Resource + private UserBillMapper mapper; + + @Resource + private TenantService tenantService; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(FundsMonitorSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + getMonthSql(request, queryWrapper); + + //排序 + if (request.getSort() == null) { + queryWrapper.orderByDesc("create_time"); + }else{ + if (request.getSort().equals("asc")) { + queryWrapper.orderByAsc("number"); + }else{ + queryWrapper.orderByDesc("number"); + } + } + + // 查询类型 + if (StringUtils.isNotBlank(request.getCategory())) { + queryWrapper.eq("category", request.getCategory()); + } + if (ObjectUtil.isNotNull(request.getPm())) { + queryWrapper.eq("pm", request.getPm()); + } + + return mapper.selectList(queryWrapper); + } + + private void getMonthSql(FundsMonitorSearchRequest request, QueryWrapper queryWrapper) { + queryWrapper.gt("status", 0); // -1无效 + if (!StringUtils.isBlank(request.getKeywords())) { + queryWrapper.and(i -> i. + or().eq("id", request.getKeywords()). //用户账单id + or().eq("uid", request.getKeywords()). //用户uid + or().eq("link_id", request.getKeywords()). //关联id + or().like("title", request.getKeywords()) //账单标题 + ); + } + + //时间范围 + if (StringUtils.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + //判断时间 + int compareDateResult = YztDateUtil.compareDate(dateLimit.getEndTime(), dateLimit.getStartTime(), Constants.DATE_FORMAT); + if (compareDateResult == -1) { + throw new YztException("开始时间不能大于结束时间!"); + } + + queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + + //资金范围 + if (request.getMax() != null && request.getMin() != null) { + //判断时间 + if (request.getMax().compareTo(request.getMin()) < 0) { + throw new YztException("最大金额不能小于最小金额!"); + } + queryWrapper.between("number", request.getMin(), request.getMax()); + } + } + + + //关联id + if (StringUtils.isNotBlank(request.getLinkId())) { + if (request.getLinkId().equals("gt")) { + queryWrapper.ne("link_id", 0); + }else{ + queryWrapper.eq("link_id", request.getLinkId()); + } + } + + //用户id集合 + if (null != request.getUserIdList() && request.getUserIdList().size() > 0) { + queryWrapper.in("uid", request.getUserIdList()); + } else if (ObjectUtil.isNotNull(request.getUid())) { + queryWrapper.eq("uid", request.getUid()); + } + + + + if (StringUtils.isNotBlank(request.getCategory())) { + queryWrapper.eq("category", request.getCategory()); + } + + if (StringUtils.isNotBlank(request.getType())) { + queryWrapper.eq("type", request.getType()); + } + } + + /** + * 新增/消耗 总金额 + * @param pm Integer 0 = 支出 1 = 获得 + * @param userId Integer 用户uid + * @param category String 类型 + * @param date String 时间范围 + * @param type String 小类型 + * @return UserBill + */ + @Override + public BigDecimal getSumBigDecimal(Integer pm, Integer userId, String category, String date, String type) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("category", category). + eq("status", 1); + if (ObjectUtil.isNotNull(userId)) { + queryWrapper.eq("uid", userId); + } + if (null != pm) { + queryWrapper.eq("pm", pm); + } + if (null != type) { + queryWrapper.eq("type", type); + } + if (null != date) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + List userBills = mapper.selectList(queryWrapper); + if (CollUtil.isEmpty(userBills)) { + return BigDecimal.ZERO; + } + return userBills.stream().map(UserBill::getNumber).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, BigDecimal.ROUND_DOWN); + } + + /** + * 保存退款日志 + * @return boolean + */ + @Override + public Boolean saveRefundBill(StoreOrderRefundRequest request, User user) { + UserBill userBill = new UserBill(); + userBill.setTitle("商品退款"); + userBill.setUid(user.getUid()); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_ORDER_REFUND); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_PAY_PRODUCT_REFUND); + userBill.setNumber(request.getAmount()); + userBill.setLinkId(request.getOrderId().toString()); + userBill.setBalance(user.getNowMoney().add(request.getAmount())); + userBill.setMark("订单退款到余额" + request.getAmount() + "元"); + userBill.setPm(1); + return save(userBill); + } + + /** + * 资金监控 + * @param request 查询参数 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo fundMonitoring(FundsMonitorRequest request, PageParamRequest pageParamRequest) { + Page billPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + Map map = new HashMap<>(); + + // 客户昵称(模糊查询) + if (StrUtil.isNotBlank(request.getKeywords())) { + map.put("keywords", StrUtil.format("%{}%", request.getKeywords())); + } + + // 手机号码 + if (StrUtil.isNotBlank(request.getPhone())) { + map.put("phone", request.getPhone()); + } + + // 身份类型(用户等级) + if (request.getLevel() != null) { + map.put("level", request.getLevel()); + } + + // 流水状态 + if (request.getStatus() != null) { + map.put("status", request.getStatus()); + } + + // 流水类型(pm)和 linkType 校验 + if (request.getPm() != null) { + map.put("pm", request.getPm()); + + // 如果传了 linkType,需要校验是否符合规定 + if (StrUtil.isNotBlank(request.getLinkType())) { + String linkType = request.getLinkType(); + if (request.getPm() == 0) { + // 支出时,linkType 只能是以下几种 + if (!Constants.USER_BILL_LINK_TYPE_ORDER_PAY.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_TRANSFER_OUT.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_EXTRACT.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_SYSTEM_SUB.equals(linkType)) { + throw new YztException("支出类型的 linkType 不符合规定"); + } + } else if (request.getPm() == 1) { + // 获得时,linkType 只能是以下几种 + if (!Constants.USER_BILL_LINK_TYPE_PERSONAL_RECHARGE.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_TRANSFER_IN.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_QUEUE_REWARD.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_SALE_REWARD.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_INCUBATOR_REWARD.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_MANAGE_REWARD.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_SUBSIDY_REWARD.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_ORDER_REFUND.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_EXTRACT_FAIL.equals(linkType) && + !Constants.USER_BILL_LINK_TYPE_SYSTEM_ADD.equals(linkType)) { + throw new YztException("获得类型的 linkType 不符合规定"); + } + } + map.put("linkType", linkType); + } + } else { + // 不传 pm 时,如果传了 linkType,也需要添加到查询条件 + if (StrUtil.isNotBlank(request.getLinkType())) { + map.put("linkType", request.getLinkType()); + } + } + + //时间范围 + if (StrUtil.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + map.put("startTime", dateLimit.getStartTime()); + map.put("endTime", dateLimit.getEndTime()); + } + + // 明细类型筛选 + if (StrUtil.isNotBlank(request.getTitle())) { + switch (request.getTitle()) { + case "recharge" : + map.put("title", "充值支付"); + break; + case "admin" : + map.put("title", "后台操作"); + break; + case "productRefund" : + map.put("title", "商品退款"); + break; + case "payProduct" : + map.put("title", "购买商品"); + break; + } + } + + List userBillResponses = mapper.fundMonitoring(map); + if (CollUtil.isEmpty(userBillResponses)) { + return CommonPage.copyPageInfo(billPage, CollUtil.newArrayList()); + } + // 批量根据 tenantId 查询租户名称 + List tenantIdList = userBillResponses.stream() + .map(UserBillResponse::getTenantId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map tenantNameMap = new HashMap<>(); + if (CollUtil.isNotEmpty(tenantIdList)) { + List tenants = tenantService.listByIds(tenantIdList); + if (CollUtil.isNotEmpty(tenants)) { + for (Tenant tenant : tenants) { + tenantNameMap.put(tenant.getTenantId(), tenant.getTenantName()); + } + } + } + List responseList = userBillResponses.stream().map(e -> { + MonitorResponse monitorResponse = new MonitorResponse(); + BeanUtils.copyProperties(e, monitorResponse); + Long tenantId = e.getTenantId(); + if (tenantId != null) { + monitorResponse.setTenantName(tenantNameMap.get(tenantId)); + } + return monitorResponse; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(billPage, responseList); + } + + /** + * 用户账单记录(现金) + * @param uid 用户uid + * @param type 记录类型:all-全部,expenditure-支出,income-收入 + * @return PageInfo + */ + @Override + public PageInfo nowMoneyBillRecord(Integer uid, String type, PageParamRequest pageRequest) { + Page billPage = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserBill::getTitle, UserBill::getNumber, UserBill::getBalance, UserBill::getMark, UserBill::getCreateTime, UserBill::getPm); + lqw.eq(UserBill::getUid, uid); + lqw.eq(UserBill::getCategory, Constants.USER_BILL_CATEGORY_MONEY); + switch (type) { + case "all": + break; + case "expenditure": + lqw.eq(UserBill::getPm, 0); + break; + case "income": + lqw.eq(UserBill::getPm, 1); + break; + } + lqw.eq(UserBill::getStatus, 1); + lqw.orderByDesc(UserBill::getId); + List billList = mapper.selectList(lqw); + return CommonPage.copyPageInfo(billPage, billList); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBrokerageRecordServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBrokerageRecordServiceImpl.java new file mode 100644 index 0000000..c30e6bd --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserBrokerageRecordServiceImpl.java @@ -0,0 +1,831 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.BrokerageRecordConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.BrokerageRecordRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.RetailShopStairUserRequest; +import com.yzt.common.response.SpreadCommissionDetailResponse; +import com.yzt.common.response.UserBrokerageRecordResponse; +import com.yzt.common.utils.ArrayUtil; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.constants.IntegralRecordConstants; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.service.service.*; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserBrokerageRecordMapper; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户佣金记录服务接口实现类 + * + */ +@Service +public class UserBrokerageRecordServiceImpl extends ServiceImpl implements UserBrokerageRecordService { + + private static final Logger logger = LoggerFactory.getLogger(UserBrokerageRecordServiceImpl.class); + + @Resource + private UserBrokerageRecordMapper mapper; + + @Lazy + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBillService userBillService; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + @Autowired + private StoreOrderService storeOrderService; + + /** + * 根据订单编号获取记录列表 + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + @Override + public List findListByLinkIdAndLinkType(String linkId, String linkType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getLinkId, linkId); + lqw.eq(UserBrokerageRecord::getLinkType, linkType); + return mapper.selectList(lqw); + } + + /** + * 获取记录(订单不可用此方法) + * @param linkId 关联id + * @param linkType 关联类型 + * @return 记录列表 + */ + @Override + public UserBrokerageRecord getByLinkIdAndLinkType(String linkId, String linkType) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getLinkId, linkId); + lqw.eq(UserBrokerageRecord::getLinkType, linkType); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 佣金解冻 + */ + @Override + public void brokerageThaw() { + // 查询需要解冻的佣金 + List thawList = findThawList(); + if (CollUtil.isEmpty(thawList)) { + return; + } + for (UserBrokerageRecord record : thawList) { + // 查询对应的用户 + User user = userService.getById(record.getUid()); + if (ObjectUtil.isNull(user)) { + continue ; + } + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + // 计算佣金余额 + BigDecimal balance = user.getBrokeragePrice().add(record.getPrice()); + record.setBalance(balance); + record.setUpdateTime(DateUtil.date()); + + // 分佣 + Boolean execute = transactionTemplate.execute(e -> { + record.setUpdateTime(DateUtil.date()); + updateById(record); + userService.operationBrokerage(record.getUid(), record.getPrice(), user.getBrokeragePrice(), "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("佣金解冻处理—分佣出错,记录id = {}", record.getId())); + } + } + + } + + /** + * 每日释放超过7天的佣金记录 + */ + @Override + public void brokerageRelease() { + // 查询需要释放的佣金:status = 1 且 update_time < now() - 7天 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("status", 1); + queryWrapper.lt("update_time", DateUtil.offsetDay(DateUtil.date(), -7)); + + List releaseList = mapper.selectList(queryWrapper); + if (CollUtil.isEmpty(releaseList)) { + return; + } + + for (UserBrokerageRecord record : releaseList) { + // 查询对应用户 + User user = userService.getById(record.getUid()); + if (ObjectUtil.isNull(user)) { + continue; + } + + BigDecimal price = record.getPrice() == null ? BigDecimal.ZERO : record.getPrice(); + // 按 price * 6% 计算积分,保留两位小数(向下舍入) + BigDecimal integralDecimal = price.multiply(new BigDecimal("0.06")).setScale(2, BigDecimal.ROUND_DOWN); + // 积分对应的金额即为积分本身(1 积分 = 1 单位货币) + BigDecimal remainingMoneyCalc = price.subtract(integralDecimal).setScale(2, BigDecimal.ROUND_DOWN); + final BigDecimal remainingMoneyFinal = remainingMoneyCalc.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : remainingMoneyCalc; + + // 计算新的用户余额(只加剩余金额) + final BigDecimal newBalanceFinal = (user.getNowMoney() == null ? BigDecimal.ZERO : user.getNowMoney()).add(remainingMoneyFinal); + record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + record.setBalance(newBalanceFinal); + record.setUpdateTime(DateUtil.date()); + + // 在事务内更新佣金记录、用户余额并插入账单与积分记录 + Boolean execute = transactionTemplate.execute(e -> { + // 更新佣金记录状态 + updateById(record); + + // 如果有积分需要发放,生成并保存积分记录并更新用户积分(保留两位小数) + if (integralDecimal.compareTo(BigDecimal.ZERO) > 0) { + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(record.getUid()); + integralRecord.setLinkId(String.valueOf(record.getId())); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_BROKERAGE_RELEASE); + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + integralRecord.setTitle(IntegralRecordConstants.INTEGRAL_RECORD_TITLE_BROKERAGE_RELEASE); + integralRecord.setIntegral(integralDecimal); + // user.getIntegral 已为 BigDecimal + BigDecimal userIntegralDecimal = user.getIntegral() == null ? BigDecimal.ZERO : user.getIntegral(); + integralRecord.setBalance(userIntegralDecimal.add(integralDecimal)); + integralRecord.setMark("佣金释放转积分"); + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + integralRecord.setCreateTime(DateUtil.date()); + integralRecord.setUpdateTime(DateUtil.date()); + userIntegralRecordService.save(integralRecord); + + // 直接在数据库中增加用户积分(使用原子 SQL,避免修改大量调用) + com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper integralUpdate = new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<>(); + integralUpdate.setSql(StrUtil.format("integral = integral + {}", integralDecimal)); + integralUpdate.eq("uid", record.getUid()); + userService.update(integralUpdate); + } + + // 根据佣金记录的 linkType 决定账单标题/备注/linkType + String linkType = record.getLinkType(); + String billTitle; + String billMark; + String billLinkType; + if ("sale_reward".equals(linkType)) { + billTitle = "销售奖励佣金释放"; + billMark = "销售奖励佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_SALE_REWARD; + } else if ("queue".equals(linkType)) { + billTitle = "免单奖佣金释放"; + billMark = "免单奖佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_QUEUE_REWARD; + } else if ("incubator_reward".equals(linkType)) { + billTitle = "孵化奖佣金释放"; + billMark = "孵化奖佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_INCUBATOR_REWARD; + } else if ("queue_incubator".equals(linkType)) { + billTitle = "免单孵化奖佣金释放"; + billMark = "免单孵化奖佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_INCUBATOR_REWARD; + } else if ("manage_incubator_reward".equals(linkType)) { + billTitle = "管理奖孵化奖佣金释放"; + billMark = "管理奖孵化奖佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_INCUBATOR_REWARD; + } else if ("manage_reward".equals(linkType)) { + billTitle = "管理奖佣金释放"; + billMark = "管理奖佣金释放到账"; + billLinkType = Constants.USER_BILL_LINK_TYPE_MANAGE_REWARD; + } else { + billTitle = "佣金释放"; + billMark = "佣金释放到账"; + billLinkType = null; // 默认为空 + } + + // 生成 UserBill 并保存(账单中记录剩余金额) + com.yzt.common.model.user.UserBill bill = new com.yzt.common.model.user.UserBill(); + bill.setUid(record.getUid()); + bill.setLinkId(String.valueOf(record.getId())); + bill.setLinkType(billLinkType); + bill.setPm(1); + bill.setTitle(billTitle); + bill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + bill.setType("brokerage_release"); + bill.setNumber(remainingMoneyFinal); + bill.setBalance(newBalanceFinal); + bill.setMark(billMark); + bill.setStatus(1); + bill.setCreateTime(DateUtil.date()); + bill.setUpdateTime(DateUtil.date()); + userBillService.save(bill); + + // 更新用户余额(乐观校验由 UserService 执行) + userService.operationNowMoney(record.getUid(), remainingMoneyFinal, user.getNowMoney(), "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("佣金释放处理出错,记录id = {}", record.getId())); + } + } + } + + /** + * 昨天得佣金 + * @param uid 用户uid + * @return BigDecimal + */ + @Override + public BigDecimal getYesterdayIncomes(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(Constants.SEARCH_DATE_YESTERDAY); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + lqw.eq(UserBrokerageRecord::getType, 1); + lqw.eq(UserBrokerageRecord::getLinkType, "order"); + lqw.eq(UserBrokerageRecord::getStatus, 3); + List recordList = mapper.selectList(lqw); + if (CollUtil.isEmpty(recordList)) { + return BigDecimal.ZERO; + } + return recordList.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + @Override + public BigDecimal getTodayIncomes(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(Constants.SEARCH_DATE_DAY); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + lqw.eq(UserBrokerageRecord::getType, 1); + lqw.eq(UserBrokerageRecord::getStatus, 3); + List recordList = mapper.selectList(lqw); + if (CollUtil.isEmpty(recordList)) { + return BigDecimal.ZERO; + } + return recordList.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取佣金明细列表根据uid + * @param uid uid + * @param pageParamRequest 分页参数 + */ + @Override + public PageInfo findDetailListByUid(Integer uid, PageParamRequest pageParamRequest) { + Page recordPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + // 使用SQL分组查询,按link_id和link_type分组,price自动求和 + List list = mapper.findDetailListByUidGrouped(uid); + return CommonPage.copyPageInfo(recordPage, list); + } + + /** + * 获取累计推广条数 + * @param uid 用户uid + * @return Integer + */ + @Override + public Integer getSpreadCountByUid(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getId); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + return mapper.selectCount(lqw).intValue(); + } + + /** + * 获取推广记录列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List findSpreadListByUid(Integer uid, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + lqw.orderByDesc(UserBrokerageRecord::getUpdateTime); + return mapper.selectList(lqw); + } + + /** + * 获取推广记录列表 + * @param request 用户uid + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo findAdminSpreadListByUid(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, request.getUid()); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + if (request.getType().equals(1)) { + lqw.eq(UserBrokerageRecord::getBrokerageLevel, 1); + } + if (request.getType().equals(2)) { + lqw.eq(UserBrokerageRecord::getBrokerageLevel, 2); + } + if (StrUtil.isNotBlank(request.getNickName())) { + lqw.like(UserBrokerageRecord::getLinkId, request.getNickName()); + } + if (StrUtil.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + + lqw.orderByDesc(UserBrokerageRecord::getUpdateTime); + return CommonPage.copyPageInfo(page, mapper.selectList(lqw)); + } + + /** + * 获取月份对应的推广订单数 + * @param uid 用户uid + * @param monthList 月份列表 + * @return Map + */ + @Override + public Map getSpreadCountByUidAndMonth(Integer uid, List monthList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 按月份统计数量,使用别名 month/cnt,通过 selectMaps 获取结果 + queryWrapper.select("left(update_time, 7) as month", "count(id) as cnt"); + queryWrapper.eq("uid", uid); + queryWrapper.eq("link_type", BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + queryWrapper.eq("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + queryWrapper.apply(StrUtil.format("left(update_time, 7) in ({})", ArrayUtil.strListToSqlJoin(monthList))); + queryWrapper.groupBy("left(update_time, 7)"); + List> list = mapper.selectMaps(queryWrapper); + Map map = CollUtil.newHashMap(); + if (CollUtil.isEmpty(list)) { + return map; + } + list.forEach(item -> { + Object monthObj = item.get("month"); + Object cntObj = item.get("cnt"); + if (monthObj != null) { + String month = monthObj.toString(); + Integer cnt = cntObj == null ? 0 : ((Number) cntObj).intValue(); + map.put(month, cnt); + } + }); + return map; + } + + /** + * 获取佣金排行榜(周、月) + * @param type week、month + * @return List + */ + @Override + public List getBrokerageTopByDate(String type) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("uid", "sum(price) AS price"); + queryWrapper.eq("link_type", BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + queryWrapper.eq("status", BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(type); + if(!StringUtils.isBlank(dateLimit.getStartTime())){ + queryWrapper.between("update_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + queryWrapper.groupBy("uid"); + queryWrapper.orderByDesc("price"); + return mapper.selectList(queryWrapper); + } + + /** + * 根据Uid获取分佣记录列表 + * @param uid 用户uid + * @return List + */ + @Override + public List getSpreadListByUid(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + return mapper.selectList(lqw); + } + + /** + * 佣金总金额(单位时间) + * @param dateLimit 时间参数 + * @return BigDecimal + */ + @Override + public BigDecimal getTotalSpreadPriceBydateLimit(String dateLimit) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + if (StrUtil.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitVo = YztDateUtil.getDateLimit(dateLimit); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + + /** + * 佣金总金额 + * @return BigDecimal + */ + public BigDecimal getCurrentUserTotalSpreadPrice(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + lqw.eq(UserBrokerageRecord::getUid, uid); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 单位时间消耗的佣金 + * @param dateLimit 时间参数 + * @return + */ + @Override + public BigDecimal getSubSpreadPriceByDateLimit(String dateLimit) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + if (StrUtil.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitVo = YztDateUtil.getDateLimit(dateLimit); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取冻结期佣金 + * @param uid uid + * @return BigDecimal + */ + @Override + public BigDecimal getFreezePrice(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取待结算收益 + * @param uid uid + * @return BigDecimal + */ + @Override + public BigDecimal getPendingIncomes(Integer uid) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserBrokerageRecord::getPrice); + lqw.eq(UserBrokerageRecord::getUid, uid); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return BigDecimal.ZERO; + } + return list.stream().map(UserBrokerageRecord::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add); + } + + + + @Override + public List getUserBrokerageRecords(Integer uid, String customerName, String phone, PageParamRequest pageParamRequest) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select( + UserBrokerageRecord::getId, + UserBrokerageRecord::getUid, + UserBrokerageRecord::getLinkId, + UserBrokerageRecord::getTitle, + UserBrokerageRecord::getPrice, + UserBrokerageRecord::getStatus, + UserBrokerageRecord::getCreateTime); + lqw.eq(UserBrokerageRecord::getUid, uid); + List records = mapper.selectList(lqw); + if (records.isEmpty()) { + return Collections.emptyList(); + } + // 2. 提取所有 orderNo + Set orderNos = records.stream() + .map(UserBrokerageRecord::getLinkId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + // 3. 批量查订单(fw_order) + Map orderMap; + if (!orderNos.isEmpty()) { + orderMap = storeOrderService.getMapInOrderNo(new ArrayList<>(orderNos)); + } else { + orderMap = new HashMap<>(); + } + // 4. 提取所有 buyer UIDs + Set buyerUids = orderMap.values().stream() + .map(StoreOrder::getUid) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map userMap; + if (!buyerUids.isEmpty()) { + userMap = userService.getMapListInUid(new ArrayList<>(buyerUids)); + } else { + userMap = new HashMap<>(); + } +// 6. 组装结果 + return records.stream().map(record -> { + UserBrokerageRecordResponse resp = new UserBrokerageRecordResponse(); + resp.setId(record.getId()); + resp.setCreateTime(record.getCreateTime()); + resp.setBrokerage(record.getPrice()); + resp.setStatus(record.getStatus()); + resp.setTitle(record.getTitle()); + + // 关联订单 & 用户 + StoreOrder order = orderMap.get(record.getLinkId()); + if (order != null) { + resp.setSalesAmount(order.getPayPrice()); + User buyer = userMap.get(order.getUid()); + if (buyer != null) { + resp.setCustomerName(buyer.getNickname()); + resp.setPhone(buyer.getPhone()); + } + } + return resp; + }).filter(resp -> { + // 如果没有筛选条件,全部通过 + if (StringUtils.isBlank(customerName) && StringUtils.isBlank(phone)) { + return true; + } + String name = resp.getCustomerName(); + String p = resp.getPhone(); + + boolean matchName = StringUtils.isBlank(customerName) || + (name != null && name.contains(customerName.trim())); + + boolean matchPhone = StringUtils.isBlank(phone) || + (p != null && p.contains(phone.trim())); // 模糊匹配 + // 如果要精确匹配手机号,把 contains 改成 equals + + return matchName && matchPhone; + }).collect(Collectors.toList()); + } + + /** + * 佣金记录列表 + * @param request 筛选条件 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getAdminList(BrokerageRecordRequest request, PageParamRequest pageParamRequest) { + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + //已废弃:按需求不再根据 type 参数进行区分,只保留代码作为注释 +// if (ObjectUtil.isNotNull(request.getType())) { +// switch (request.getType()) { +// case 1:// 订单返佣 +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); +// lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); +// lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); +// break; +// case 2:// 申请提现 +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); +// lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW); +// lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); +// break; +// case 3:// 提现失败 +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); +// lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); +// lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); +// break; +// case 4:// 提现成功 +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); +// lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); +// lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); +// break; +// case 5:// 佣金转余额 +// lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_YUE); +// lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); +// lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); +// break; + + //用户筛选:客户昵称/手机/身份等级 + boolean hasUserFilter = StrUtil.isNotBlank(request.getKeywords()) + || StrUtil.isNotBlank(request.getPhone()) + || ObjectUtil.isNotNull(request.getLevel()); + if (hasUserFilter) { + LambdaQueryWrapper userLqw = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getKeywords())) { + userLqw.like(User::getNickname, request.getKeywords().trim()); + } + if (StrUtil.isNotBlank(request.getPhone())) { + userLqw.eq(User::getPhone, request.getPhone().trim()); + } + if (ObjectUtil.isNotNull(request.getLevel())) { + userLqw.eq(User::getLevel, request.getLevel()); + } + List users = userService.list(userLqw); + if (CollUtil.isEmpty(users)) { + // 无匹配用户,直接返回空分页 + return CommonPage.copyPageInfo(page, Collections.emptyList()); + } + List uidList = users.stream().map(User::getUid).collect(Collectors.toList()); + lqw.in(UserBrokerageRecord::getUid, uidList); + } + + // 结算状态筛选(1-待结算,3-已结算,4-已取消) + if (ObjectUtil.isNotNull(request.getStatus())) { + lqw.eq(UserBrokerageRecord::getStatus, request.getStatus()); + } + + // 收益类型 linkType(sale_reward、queue、incubator_reward、queue_incubator、manage_incubator_reward、manage_reward 等) + if (StrUtil.isNotBlank(request.getLinkType())) { + String linkType = request.getLinkType().trim(); + // 孵化奖合并查询:前端传 incubator_all 时,查询 incubator_reward / queue_incubator / manage_incubator_reward + if ("incubator_all".equals(linkType)) { + lqw.in(UserBrokerageRecord::getLinkType, + "incubator_reward", + "queue_incubator", + "manage_incubator_reward"); + } else { + lqw.eq(UserBrokerageRecord::getLinkType, linkType); + } + } + + // 创建时间区间(create_time) + if (StrUtil.isNotBlank(request.getCreateDateLimit())) { + DateLimitUtilVo dateLimitVo = YztDateUtil.getDateLimit(request.getCreateDateLimit()); + if (StrUtil.isNotBlank(dateLimitVo.getStartTime()) && StrUtil.isNotBlank(dateLimitVo.getEndTime())) { + lqw.between(UserBrokerageRecord::getCreateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + } + + // 结算时间区间(已结算 update_time),使用 settleDateLimit 时强制 status=3 + if (StrUtil.isNotBlank(request.getSettleDateLimit())) { + DateLimitUtilVo dateLimitVo = YztDateUtil.getDateLimit(request.getSettleDateLimit()); + if (StrUtil.isNotBlank(dateLimitVo.getStartTime()) && StrUtil.isNotBlank(dateLimitVo.getEndTime())) { + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + lqw.between(UserBrokerageRecord::getUpdateTime, dateLimitVo.getStartTime(), dateLimitVo.getEndTime()); + } + } + + // 订单号(link_id)精确匹配 + if (StrUtil.isNotBlank(request.getOrderNo())) { + lqw.eq(UserBrokerageRecord::getLinkId, request.getOrderNo().trim()); + } + + lqw.orderByDesc(UserBrokerageRecord::getUpdateTime, UserBrokerageRecord::getId); + List list = mapper.selectList(lqw); + return CommonPage.copyPageInfo(page, list); + } + + /** + * 根据日期获取支付佣金金额(确认到账佣金) + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + @Override + public BigDecimal getBrokerageAmountByDate(String date) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("IFNULL(sum(price), 0) as price"); + queryWrapper.eq("link_type", "order"); + queryWrapper.eq("type", 1); + queryWrapper.eq("status", 3); + queryWrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectOne(queryWrapper).getPrice(); + } + + /** + * 获取累计佣金转余额金额 + * @return BigDecimal + */ + @Override + public BigDecimal getTotalYuePrice() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("IFNULL(sum(price), 0) as price"); + queryWrapper.eq("link_type", "yue"); + queryWrapper.eq("type", 2); + queryWrapper.eq("status", 3); + return mapper.selectOne(queryWrapper).getPrice(); + } + + /** + * 根据月份获取佣金明细 + * @param uid uid + * @param month 月份 + * @return + */ + private List getListByUidAndMonth(Integer uid, String month) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id", "title", "price", "update_time", "type", "status"); + queryWrapper.eq("uid", uid); + queryWrapper.eq("left(update_time, 7)", month); + queryWrapper.orderByDesc("update_time"); + return mapper.selectList(queryWrapper); + } + + /** + * 获取需要解冻的记录列表 + * @return 记录列表 + */ + private List findThawList() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.le(UserBrokerageRecord::getThawTime, System.currentTimeMillis()); + lqw.eq(UserBrokerageRecord::getLinkType, BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserBrokerageRecord::getType, BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + lqw.eq(UserBrokerageRecord::getStatus, BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN); + return mapper.selectList(lqw); + } + + /** + * 统计某个用户针对某类型商品(会员/加盟店/会馆)实际已获得的轮循奖励次数 + * @param uid 用户ID + * @param attrType 奖励商品类型 0=会员,1=加盟店,2=会馆 + * @return 当前用户对应类型的奖励次数 + */ + @Override + public int countByUidAndAttrType(Integer uid, Integer attrType) { + // 创建查询条件对象 + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + // 匹配用户ID + lqw.eq(UserBrokerageRecord::getUid, uid); + // 只看销售奖励类型 + lqw.eq(UserBrokerageRecord::getLinkType, "sale_reward"); + // 匹配商品类型字段(0会员/1加盟店/2会馆) + lqw.eq(UserBrokerageRecord::getAttrType, attrType); + // 查询匹配记录数量(对应奖励次数) + return mapper.selectCount(lqw).intValue(); + } + + /** + * 将指定订单号相关的佣金记录标记为失效(订单退款导致) + * @param orderId 订单号 + */ + @Override + public void invalidateByOrderId(String orderId) { + if (StrUtil.isBlank(orderId)) return; + com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper uw = new com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper<>(); + uw.eq("link_id", orderId); + // 只影响增加类的佣金记录(type=1)且状态不是已失效 + uw.eq("type", 1); + uw.ne("status", 4); + uw.set("status", 4); + uw.set("update_time", DateUtil.date()); + mapper.update(null, uw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserDetailServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserDetailServiceImpl.java new file mode 100644 index 0000000..06afcf6 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserDetailServiceImpl.java @@ -0,0 +1,74 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.SystemMenu; +import com.yzt.common.model.system.SystemPermissions; +import com.yzt.common.vo.LoginUserVo; +import com.yzt.service.service.SystemAdminService; +import com.yzt.service.service.SystemMenuService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 用户验证处理 + */ +@Service +public class UserDetailServiceImpl implements UserDetailsService { + + private static final Logger log = LoggerFactory.getLogger(UserDetailServiceImpl.class); + + @Autowired + private SystemAdminService systemAdminService; + + @Autowired + private SystemMenuService systemMenuService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + SystemAdmin user = systemAdminService.selectUserByUserName(username); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); + } else if (!user.getStatus()) { + log.info("登录用户:{} 已被停用.", username); + throw new UsernameNotFoundException("对不起,您的账号:" + username + " 已停用"); + } + + return createLoginUser(user); + } + + public UserDetails createLoginUser(SystemAdmin user) { + List roles = Stream.of(user.getRoles().split(",")).map(Integer::valueOf).collect(Collectors.toList()); + List menuList; + if (roles.contains(1)) {// 超级管理员 + // 获取全部权限 + menuList = systemMenuService.getAllPermissions(); + } else { + menuList = systemMenuService.findPermissionByUserId(user.getId()); + } + menuList = menuList.stream().filter(e -> StrUtil.isNotEmpty(e.getPerms())).collect(Collectors.toList()); + List permissionsList = menuList.stream().map(e -> { + SystemPermissions permissions = new SystemPermissions(); + permissions.setId(e.getId()); + permissions.setPid(e.getPid()); + permissions.setName(e.getName()); + permissions.setPath(e.getPerms()); + permissions.setSort(e.getSort()); + return permissions; + }).collect(Collectors.toList()); + return new LoginUserVo(user, permissionsList); + } + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExperienceRecordServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExperienceRecordServiceImpl.java new file mode 100644 index 0000000..c6c88e8 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExperienceRecordServiceImpl.java @@ -0,0 +1,58 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.ExperienceRecordConstants; +import com.yzt.common.model.user.UserExperienceRecord; +import com.yzt.common.request.PageParamRequest; +import com.yzt.service.mapper.UserExperienceRecordMapper; +import com.yzt.service.service.UserExperienceRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 用户经验记录服务接口实现类 + * + */ +@Service +public class UserExperienceRecordServiceImpl extends ServiceImpl implements UserExperienceRecordService { + + @Resource + private UserExperienceRecordMapper mapper; + + /** + * 获取用户经验列表(移动端) + * @param userId 用户id + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getH5List(Integer userId, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserExperienceRecord::getId, UserExperienceRecord::getTitle, UserExperienceRecord::getType, UserExperienceRecord::getExperience, UserExperienceRecord::getCreateTime); + lqw.eq(UserExperienceRecord::getUid, userId); + lqw.orderByDesc(UserExperienceRecord::getId); + return mapper.selectList(lqw); + } + + /** + * 通过订单编号获取记录 + * @param orderNo 订单编号 + * @param uid uid + * @return UserExperienceRecord + */ + @Override + public UserExperienceRecord getByOrderNoAndUid(String orderNo, Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserExperienceRecord::getLinkId, orderNo); + lqw.eq(UserExperienceRecord::getLinkType, ExperienceRecordConstants.EXPERIENCE_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserExperienceRecord::getUid, uid); + return mapper.selectOne(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExtractServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExtractServiceImpl.java new file mode 100644 index 0000000..abf2fb7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserExtractServiceImpl.java @@ -0,0 +1,808 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.BrokerageRecordConstants; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.finance.UserExtract; +import com.yzt.common.model.system.SystemAdmin; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserExtractRequest; +import com.yzt.common.request.UserExtractSearchRequest; +import com.yzt.common.response.BalanceResponse; +import com.yzt.common.response.UserExtractRecordResponse; +import com.yzt.common.response.UserExtractResponse; +import com.yzt.common.response.UserExtractDetailResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserExtractMapper; +import com.yzt.service.service.*; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserIntegralRecordService; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.constants.IntegralRecordConstants; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static java.math.BigDecimal.ZERO; + +/** + * UserExtractServiceImpl 接口实现 + * + */ +@Service +public class UserExtractServiceImpl extends ServiceImpl implements UserExtractService { + + @Resource + private UserExtractMapper mapper; + + @Autowired + private UserService userService; + + @Autowired + private UserBillService userBillService; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private TenantService tenantService; + + @Autowired + private SystemAdminService systemAdminService; + + + /** + * 列表 + * + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(UserExtractSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + // 带 UserExtract 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (!StringUtils.isBlank(request.getKeywords())) { + String keywords = request.getKeywords().trim(); + + // 仅按客户昵称(用户表 nickname)模糊查询 + List uidListByNickname = userService.findIdListLikeName(keywords); + if (CollUtil.isEmpty(uidListByNickname)) { + // 没有匹配的客户昵称,直接返回空列表 + return new ArrayList<>(); + } + lambdaQueryWrapper.in(UserExtract::getUid, uidListByNickname); + } + + //提现状态 + if (request.getUid() != null) { + lambdaQueryWrapper.eq(UserExtract::getUid, request.getUid()); + } + + //提现状态 + if (request.getStatus() != null) { + lambdaQueryWrapper.eq(UserExtract::getStatus, request.getStatus()); + } + + //提现方式 + if (!StringUtils.isBlank(request.getExtractType())) { + lambdaQueryWrapper.eq(UserExtract::getExtractType, request.getExtractType()); + } + + // 时间范围:继续沿用原来的 dateLimit 作为创建时间范围 + if (StringUtils.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + lambdaQueryWrapper.between(UserExtract::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + + //按创建时间降序排列 + lambdaQueryWrapper.orderByDesc(UserExtract::getCreateTime, UserExtract::getId); + + List extractList = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(extractList)) { + return extractList; + } + + // 关联用户信息 + List uidList = extractList.stream().map(UserExtract::getUid).distinct().collect(Collectors.toList()); + HashMap userMap = userService.getMapListInUid(uidList); + + // 根据用户的 tenantId 批量查询租户名称 + List tenantIdList = userMap.values().stream() + .filter(ObjectUtil::isNotNull) + .map(User::getTenantId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map tenantNameMap = new HashMap<>(); + if (CollUtil.isNotEmpty(tenantIdList)) { + List tenants = tenantService.listByIds(tenantIdList); + if (CollUtil.isNotEmpty(tenants)) { + for (Tenant tenant : tenants) { + tenantNameMap.put(tenant.getTenantId(), tenant.getTenantName()); + } + } + } + + // 关联审核管理员信息 + List adminIdList = extractList.stream() + .map(UserExtract::getAuditAdminId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map adminNameMap = new HashMap<>(); + if (CollUtil.isNotEmpty(adminIdList)) { + List admins = systemAdminService.listByIds(adminIdList); + if (CollUtil.isNotEmpty(admins)) { + for (SystemAdmin admin : admins) { + adminNameMap.put(admin.getId(), admin.getRealName()); + } + } + } + + // 先按用户信息补充字段 + List resultList = new ArrayList<>(); + for (UserExtract userExtract : extractList) { + User user = userMap.get(userExtract.getUid()); + String nickName = user != null ? Optional.ofNullable(user.getNickname()).orElse("") : ""; + userExtract.setNickName(nickName); + + if (user != null) { + // 手机号码 + userExtract.setPhone(user.getPhone()); + // 归属公司名称 + Long tenantId = user.getTenantId(); + if (tenantId != null) { + userExtract.setTenantName(tenantNameMap.get(tenantId)); + } + // 身份类型(用户等级)用于后续筛选 + userExtract.setLevel(user.getLevel()); + } + + // 审核日期:status 为未通过(-1)和已提现(1)时使用 updateTime,其它状态为空 + if (ObjectUtil.isNotNull(userExtract.getStatus()) + && (userExtract.getStatus() == -1 || userExtract.getStatus() == 1) + && ObjectUtil.isNotNull(userExtract.getUpdateTime())) { + userExtract.setAuditTime(userExtract.getUpdateTime()); + } else { + userExtract.setAuditTime(null); + } + + // 审核人姓名 + if (ObjectUtil.isNotNull(userExtract.getAuditAdminId())) { + userExtract.setAuditAdminName(adminNameMap.get(userExtract.getAuditAdminId())); + } + + resultList.add(userExtract); + } + + // 审核时间范围过滤(基于 auditTime) + if (StringUtils.isNotBlank(request.getAuditDateLimit())) { + DateLimitUtilVo auditLimit = YztDateUtil.getDateLimit(request.getAuditDateLimit()); + Date start = DateUtil.parse(auditLimit.getStartTime()); + Date end = DateUtil.parse(auditLimit.getEndTime()); + resultList = resultList.stream().filter(e -> + e.getAuditTime() != null && !e.getAuditTime().before(start) && !e.getAuditTime().after(end) + ).collect(Collectors.toList()); + } + + // 手机号筛选 + if (StringUtils.isNotBlank(request.getPhone())) { + String phone = request.getPhone(); + resultList = resultList.stream() + .filter(e -> phone.equals(e.getPhone())) + .collect(Collectors.toList()); + } + + // 身份类型(用户等级)筛选 + if (request.getLevel() != null) { + Integer level = request.getLevel(); + resultList = resultList.stream() + .filter(e -> ObjectUtil.isNotNull(e.getLevel()) && level.equals(e.getLevel())) + .collect(Collectors.toList()); + } + + return resultList; + } + + /** + * 提现总金额 + * 总佣金 = 已提现佣金 + 未提现佣金 + * 已提现佣金 = 用户成功提现的金额 + * 未提现佣金 = 用户未提现的佣金 = 可提现佣金 + 冻结佣金 = 用户佣金 + * 可提现佣金 = 包括解冻佣金、提现未通过的佣金 = 用户佣金 - 冻结期佣金 + * 待提现佣金 = 待审核状态的佣金 + * 冻结佣金 = 用户在冻结期的佣金,不包括退回佣金 + * 退回佣金 = 因退款导致的冻结佣金退回 + */ + @Override + public BalanceResponse getBalance(String dateLimit) { + String startTime = ""; + String endTime = ""; + if (StringUtils.isNotBlank(dateLimit)) { + DateLimitUtilVo dateRage = YztDateUtil.getDateLimit(dateLimit); + startTime = dateRage.getStartTime(); + endTime = dateRage.getEndTime(); + } + + // 已提现 + BigDecimal withdrawn = getWithdrawn(startTime, endTime); + // 待提现(审核中) + BigDecimal toBeWithdrawn = getWithdrawning(startTime, endTime); + + // 佣金总金额(单位时间) + BigDecimal commissionTotal = userBrokerageRecordService.getTotalSpreadPriceBydateLimit(dateLimit); + // 单位时间消耗的佣金 + BigDecimal subWithdarw = userBrokerageRecordService.getSubSpreadPriceByDateLimit(dateLimit); + // 未提现 + BigDecimal unDrawn = commissionTotal.subtract(subWithdarw); + return new BalanceResponse(withdrawn, unDrawn, commissionTotal, toBeWithdrawn); + } + + + /** + * 提现总金额 + * + * @return BalanceResponse + */ + @Override + public BigDecimal getWithdrawn(String startTime, String endTime) { + return getSum(null, 1, startTime, endTime); + } + + /** + * 审核中总金额 + * + * @return BalanceResponse + */ + private BigDecimal getWithdrawning(String startTime, String endTime) { + return getSum(null, 0, startTime, endTime); + } + + /** + * 根据状态获取总额 + * + * @return BigDecimal + */ + private BigDecimal getSum(Integer userId, int status, String startTime, String endTime) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + if (null != userId) { + lqw.eq(UserExtract::getUid, userId); + } + lqw.eq(UserExtract::getStatus, status); + if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(endTime)) { + lqw.between(UserExtract::getCreateTime, startTime, endTime); + } + List userExtracts = mapper.selectList(lqw); + BigDecimal sum = ZERO; + if (CollUtil.isNotEmpty(userExtracts)) { + sum = userExtracts.stream().map(UserExtract::getExtractPrice).reduce(ZERO, BigDecimal::add); + } + return sum; + } + + /** + * 获取用户对应的提现数据 + * + * @param userId 用户id + * @return 提现数据 + */ + @Override + public UserExtractResponse getUserExtractByUserId(Integer userId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.select("SUM(extract_price) as extract_price,count(id) as id, uid"); + qw.ge("status", 1); + qw.eq("uid", userId); + qw.groupBy("uid"); + UserExtract ux = mapper.selectOne(qw); + UserExtractResponse uexr = new UserExtractResponse(); +// uexr.setEuid(ux.getUid()); + if (null != ux) { + uexr.setExtractCountNum(ux.getId()); // 这里的id其实是数量,借变量传递 + uexr.setExtractCountPrice(ux.getExtractPrice()); + } else { + uexr.setExtractCountNum(0); // 这里的id其实是数量,借变量传递 + uexr.setExtractCountPrice(ZERO); + } + + return uexr; + } + + /** + * 提现审核 + * + * @param id 提现申请id + * @param status 审核状态 -1 未通过 0 审核中 1 已提现 + * @param backMessage 驳回原因 + * @return 审核结果 + */ + @Override + public Boolean updateStatus(Integer id, Integer status, String backMessage, String auditRemark, String transferVoucherUrl) { + if (status == -1 && StringUtils.isBlank(backMessage)) + throw new YztException("驳回时请填写驳回原因"); + + UserExtract userExtract = getById(id); + if (ObjectUtil.isNull(userExtract)) { + throw new YztException("提现申请记录不存在"); + } + if (userExtract.getStatus() != 0) { + throw new YztException("提现申请已处理过"); + } + userExtract.setStatus(status); + Integer currentAdminId = SecurityUtil.getCurrentUserId(); + userExtract.setAuditAdminId(currentAdminId); + + // 审核备注写入 mark,转账凭证写入 transfer_voucher_url 字段 + if (StrUtil.isNotBlank(auditRemark)) { + userExtract.setMark(auditRemark); + } + if (StrUtil.isNotBlank(transferVoucherUrl)) { + userExtract.setTransferVoucherUrl(transferVoucherUrl); + } + + User user = userService.getById(userExtract.getUid()); + if (ObjectUtil.isNull(user)) { + throw new YztException("提现用户数据异常"); + } + + Boolean execute = false; + + userExtract.setUpdateTime(DateUtil.date()); + // 拒绝 + if (status == -1) {//未通过时恢复用户总金额 + userExtract.setFailMsg(backMessage); + // 添加提现申请拒绝佣金记录 + // 查询是否存在对应的佣金记录(佣金提现情况) + UserBrokerageRecord existBrokerageRecord = userBrokerageRecordService.getByLinkIdAndLinkType(userExtract.getId().toString(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + if (ObjectUtil.isNotNull(existBrokerageRecord)) { + // 佣金提现:返还佣金并保存一条返还记录 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(user.getUid()); + brokerageRecord.setLinkId(userExtract.getId().toString()); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_ADD); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_FAIL); + brokerageRecord.setPrice(userExtract.getExtractPrice()); + brokerageRecord.setBalance(user.getBrokeragePrice().add(userExtract.getExtractPrice())); + brokerageRecord.setMark(StrUtil.format("提现申请拒绝返还佣金{}", userExtract.getExtractPrice())); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + brokerageRecord.setCreateTime(YztDateUtil.nowDateTime()); + + execute = transactionTemplate.execute(e -> { + // 返还佣金 + userService.operationBrokerage(userExtract.getUid(), userExtract.getExtractPrice(), user.getBrokeragePrice(), "add"); + userExtract.setUpdateTime(DateUtil.date()); + updateById(userExtract); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + } else { + // 余额提现:返还余额(now_money) + execute = transactionTemplate.execute(e -> { + userService.operationNowMoney(userExtract.getUid(), userExtract.getExtractPrice(), user.getNowMoney(), "add"); + userExtract.setUpdateTime(DateUtil.date()); + updateById(userExtract); + + // 创建提现不通过退回的UserBill记录 + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId(userExtract.getId().toString()); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_EXTRACT_FAIL); + userBill.setTitle("提现不通过退回"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setNumber(userExtract.getExtractPrice()); + userBill.setPm(1); + userBill.setType(Constants.USER_BILL_TYPE_EXTRACT); + userBill.setBalance(user.getNowMoney().add(userExtract.getExtractPrice())); + userBill.setMark(StrUtil.format("提现审核不通过,退回{}元", userExtract.getExtractPrice())); + userBill.setStatus(1); + userBill.setCreateTime(YztDateUtil.nowDateTime()); + userBillService.save(userBill); + + return Boolean.TRUE; + }); + } + + // 驳回时如果存在待发放的积分记录则标记为失效 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserIntegralRecord::getLinkId, userExtract.getId().toString()); + lqw.eq(UserIntegralRecord::getLinkType, IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT); + lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE); + List pendingIntegralList = userIntegralRecordService.list(lqw); + if (CollUtil.isNotEmpty(pendingIntegralList)) { + for (UserIntegralRecord record : pendingIntegralList) { + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_INVALIDATION); + record.setUpdateTime(DateUtil.date()); + userIntegralRecordService.updateById(record); + } + } + } + + // 同意 + if (status == 1) { + // 查看是否为佣金提现(存在对应佣金记录)或余额提现(无佣金记录) + UserBrokerageRecord brokerageRecord = userBrokerageRecordService.getByLinkIdAndLinkType(userExtract.getId().toString(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + if (ObjectUtil.isNotNull(brokerageRecord)) { + // 佣金提现:标记佣金记录为已完成 + execute = transactionTemplate.execute(e -> { + userExtract.setUpdateTime(DateUtil.date()); + updateById(userExtract); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE); + brokerageRecord.setUpdateTime(DateUtil.date()); + userBrokerageRecordService.updateById(brokerageRecord); + return Boolean.TRUE; + }); + } else { + // 余额提现:记录手续费和实际到账金额,并将待发放积分发放给用户(若存在) + execute = transactionTemplate.execute(e -> { + // 计算 6% 手续费和实际到账金额 + BigDecimal extractPrice = userExtract.getExtractPrice(); + BigDecimal fee = extractPrice.multiply(new BigDecimal("0.06")).setScale(2, RoundingMode.DOWN); + BigDecimal actualAmount = extractPrice.subtract(fee); + + userExtract.setIntegralAmount(fee); + userExtract.setActualAmount(actualAmount); + userExtract.setUpdateTime(DateUtil.date()); + updateById(userExtract); + + // 查询是否存在待发放的积分记录 + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserIntegralRecord::getLinkId, userExtract.getId().toString()); + lqw.eq(UserIntegralRecord::getLinkType, IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT); + lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE); + List pendingIntegralList = userIntegralRecordService.list(lqw); + if (CollUtil.isNotEmpty(pendingIntegralList)) { + for (UserIntegralRecord record : pendingIntegralList) { + // 更新为完成并真正增加用户积分 + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + java.math.BigDecimal newBalance = user.getIntegral().add(record.getIntegral()); + record.setBalance(newBalance); + record.setUpdateTime(DateUtil.date()); + userIntegralRecordService.updateById(record); + // 增加用户积分 + userService.operationIntegral(record.getUid(), record.getIntegral(), user.getIntegral(), "add"); + } + } + return Boolean.TRUE; + }); + } + } + return execute; + } + + /** + * 获取提现记录列表 + * + * @param userId 用户uid + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getExtractRecord(Integer userId, PageParamRequest pageParamRequest) { + Page userExtractPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(UserExtract::getUid, userId); + queryWrapper.orderByDesc(UserExtract::getCreateTime); + + List extractList = mapper.selectList(queryWrapper); + + // 为每条提现记录计算实际到账金额和会旅积分 + if (CollUtil.isNotEmpty(extractList)) { + for (UserExtract extract : extractList) { + // 查询对应的积分记录 + LambdaQueryWrapper integralLqw = Wrappers.lambdaQuery(); + integralLqw.eq(UserIntegralRecord::getLinkId, extract.getId().toString()); + integralLqw.eq(UserIntegralRecord::getLinkType, IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT); + List integralRecords = userIntegralRecordService.list(integralLqw); + + // 计算会旅积分总金额 + BigDecimal integralAmount = ZERO; + if (CollUtil.isNotEmpty(integralRecords)) { + integralAmount = integralRecords.stream() + .map(UserIntegralRecord::getIntegral) + .reduce(ZERO, BigDecimal::add); + } + + // 设置会旅积分金额 + extract.setIntegralAmount(integralAmount); + + // 计算实际到账金额 = 申请提现金额 - 会旅积分金额 + BigDecimal actualAmount = extract.getExtractPrice().subtract(integralAmount); + extract.setActualAmount(actualAmount); + } + } + + return CommonPage.copyPageInfo(userExtractPage, extractList); + } + + /** + * 获取用户提现总金额 + * + * @param userId 用户uid + * @return BigDecimal + */ + @Override + public BigDecimal getExtractTotalMoney(Integer userId) { + return getSum(userId, 1, null, null); + } + + + /** + * 提现申请 + * + * @return Boolean + */ + @Override + public Boolean extractApply(UserExtractRequest request) { + //添加判断,提现金额不能后台配置金额 + String value = systemConfigService.getValueByKeyException(Constants.CONFIG_EXTRACT_MIN_PRICE); + BigDecimal ten = new BigDecimal(value); + if (request.getExtractPrice().compareTo(ten) < 0) { + throw new YztException(StrUtil.format("最低提现金额{}元", ten)); + } + + User user = userService.getInfo(); + if (ObjectUtil.isNull(user)) { + throw new YztException("提现用户信息异常"); + } + if(!user.getTradePassword().equals(YztUtil.encryptPassword(request.getTradePassword(),user.getPhone()))){ + throw new YztException("交易密码错误"); + } + // 支持从余额(now_money)提现的分支:当请求带上 fromNowMoney = true 时,从 now_money 扣款并生成 UserBill、积分记录 + if (request.getFromNowMoney() != null && request.getFromNowMoney()) { + BigDecimal balanceMoney = user.getNowMoney();// 可提现余额 + if (balanceMoney.compareTo(ZERO) < 1) { + throw new YztException("您当前没有余额可以提现"); + } + if (balanceMoney.compareTo(request.getExtractPrice()) < 0) { + throw new YztException("你当前最多可提现 " + balanceMoney + "元"); + } + + UserExtract userExtract = new UserExtract(); + BeanUtils.copyProperties(request, userExtract); + userExtract.setUid(user.getUid()); + userExtract.setBalance(balanceMoney.subtract(request.getExtractPrice())); + //存入银行名称 + if (StrUtil.isNotBlank(userExtract.getQrcodeUrl())) { + userExtract.setQrcodeUrl(systemAttachmentService.clearPrefix(userExtract.getQrcodeUrl())); + } + + Boolean execute = transactionTemplate.execute(e -> { + // 保存提现记录 + save(userExtract); + + // 生成 UserBill(支出) + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_EXTRACT); + userBill.setTitle("提现"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setNumber(request.getExtractPrice()); + userBill.setPm(0); + userBill.setType(Constants.USER_BILL_TYPE_EXTRACT); + userBill.setBalance(balanceMoney.subtract(request.getExtractPrice())); + userBill.setMark(StrUtil.format("提现扣除{}余额", request.getExtractPrice())); + userBill.setStatus(1); + userBill.setCreateTime(YztDateUtil.nowDateTime()); + userBillService.save(userBill); + + // 扣减用户余额 + userService.operationNowMoney(user.getUid(), request.getExtractPrice(), user.getNowMoney(), "sub"); + + // 计算 6% 手续费,作为积分待发放(向下取整为整数积分),申请通过后再发放积分 + BigDecimal fee = request.getExtractPrice().multiply(new BigDecimal("0.06")); + int integralPoints = fee.setScale(0, RoundingMode.DOWN).intValue(); + if (integralPoints > 0) { + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(user.getUid()); + integralRecord.setLinkId(userExtract.getId().toString()); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT); + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + integralRecord.setTitle(IntegralRecordConstants.INTEGRAL_RECORD_TITLE_EXTRACT); + integralRecord.setIntegral(java.math.BigDecimal.valueOf(integralPoints)); + // pending 状态时 balance 保持为当前积分(未添加) + integralRecord.setBalance(user.getIntegral()); + integralRecord.setMark(StrUtil.format("提现已发放{}积分", integralPoints)); + // 标记为创建/待发放状态,审批通过后再更新为完成并真正增加用户积分 + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE); + integralRecord.setCreateTime(YztDateUtil.nowDateTime()); + userIntegralRecordService.save(integralRecord); + } + + return Boolean.TRUE; + }); + return execute; + } + + // 原有佣金提现逻辑(不变) + BigDecimal money = user.getBrokeragePrice();//可提现总金额 + if (money.compareTo(ZERO) < 1) { + throw new YztException("您当前没有金额可以提现"); + } + + if (money.compareTo(request.getExtractPrice()) < 0) { + throw new YztException("你当前最多可提现 " + money + "元"); + } + + UserExtract userExtract = new UserExtract(); + BeanUtils.copyProperties(request, userExtract); + userExtract.setUid(user.getUid()); + userExtract.setBalance(money.subtract(request.getExtractPrice())); + //存入银行名称 + if (StrUtil.isNotBlank(userExtract.getQrcodeUrl())) { + userExtract.setQrcodeUrl(systemAttachmentService.clearPrefix(userExtract.getQrcodeUrl())); + } + + // 添加佣金记录 + UserBrokerageRecord brokerageRecord = new UserBrokerageRecord(); + brokerageRecord.setUid(user.getUid()); + brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW); + brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB); + brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_APPLY); + brokerageRecord.setPrice(userExtract.getExtractPrice()); + brokerageRecord.setBalance(money.subtract(userExtract.getExtractPrice())); + brokerageRecord.setMark(StrUtil.format("提现申请扣除佣金{}", userExtract.getExtractPrice())); + brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW); + brokerageRecord.setCreateTime(YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 保存提现记录 + save(userExtract); + // 修改用户佣金 + userService.operationBrokerage(user.getUid(), userExtract.getExtractPrice(), money, "sub"); + // 添加佣金记录 + brokerageRecord.setLinkId(userExtract.getId().toString()); + userBrokerageRecordService.save(brokerageRecord); + return Boolean.TRUE; + }); + // 此处可添加提现申请通知 + + return execute; + } + + /** + * 修改提现申请 + * + * @param id 申请id + * @param userExtractRequest 具体参数 + */ + @Override + public Boolean updateExtract(Integer id, UserExtractRequest userExtractRequest) { + UserExtract userExtract = new UserExtract(); + BeanUtils.copyProperties(userExtractRequest, userExtract); + userExtract.setId(id); + userExtract.setUpdateTime(DateUtil.date()); + return updateById(userExtract); + } + + /** + * 提现申请详情 + * @param id 提现申请记录id + * @return 详情数据 + */ + @Override + public UserExtractDetailResponse getDetailById(Integer id) { + UserExtract extract = getById(id); + if (ObjectUtil.isNull(extract)) { + throw new YztException("提现申请记录不存在"); + } + + UserExtractDetailResponse resp = new UserExtractDetailResponse(); + resp.setId(extract.getId()); + + // 提现信息 + resp.setApplyDate(extract.getCreateTime()); + resp.setExtractAmount(extract.getExtractPrice()); + resp.setActualAmount(extract.getActualAmount()); + resp.setFeeIntegral(extract.getIntegralAmount()); + + // 收款信息:从提现记录表 fw_user_extract 取 + resp.setPayeeName(extract.getRealName()); + resp.setPayBankName(extract.getBankName()); + resp.setPayAccount(extract.getBankCode()); + + // 审核信息 + resp.setAuditStatus(extract.getStatus()); + resp.setAuditDate(extract.getUpdateTime()); + resp.setTransferVoucherUrl(extract.getTransferVoucherUrl()); + resp.setAuditRemark(extract.getMark()); + + if (ObjectUtil.isNotNull(extract.getAuditAdminId())) { + SystemAdmin admin = systemAdminService.getById(extract.getAuditAdminId()); + if (ObjectUtil.isNotNull(admin)) { + resp.setAuditAdminName(admin.getRealName()); + } + } + + // 用户信息 + User user = userService.getById(extract.getUid()); + if (ObjectUtil.isNotNull(user)) { + resp.setCustomerName(user.getNickname()); + resp.setCustomerLevel(user.getLevel()); + resp.setPhone(user.getPhone()); + + // 归属公司名称 + Long tenantId = user.getTenantId(); + if (tenantId != null) { + Tenant tenant = tenantService.getById(tenantId); + if (ObjectUtil.isNotNull(tenant)) { + resp.setTenantName(tenant.getTenantName()); + } + } + + // 上级信息 + if (ObjectUtil.isNotNull(user.getSpreadUid())) { + User parent = userService.getById(user.getSpreadUid()); + if (ObjectUtil.isNotNull(parent)) { + resp.setParentName(parent.getNickname()); + resp.setParentLevel(parent.getLevel()); + } + } + } + + return resp; + } + + /** + * 提现申请待审核数量 + * + * @return Integer + */ + @Override + public Integer getNotAuditNum() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserExtract::getStatus, 0); + return mapper.selectCount(lqw).intValue(); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserFundsMonitorServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserFundsMonitorServiceImpl.java new file mode 100644 index 0000000..4779aca --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserFundsMonitorServiceImpl.java @@ -0,0 +1,148 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.BrokerageRecordConstants; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBrokerageRecord; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.request.BrokerageRecordRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.vo.UserFundsMonitor; +import com.yzt.service.mapper.UserFundsMonitorMapper; +import com.yzt.service.service.UserBrokerageRecordService; +import com.yzt.service.service.UserFundsMonitorService; +import com.yzt.service.service.UserService; +import com.yzt.service.service.TenantService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** +* UserRechargeServiceImpl 接口实现 +* fw_ +*/ +@Service +public class UserFundsMonitorServiceImpl extends ServiceImpl implements UserFundsMonitorService { + + @Resource + private UserFundsMonitorMapper mapper; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private UserService userService; + + @Autowired + private TenantService tenantService; + + /** + * 佣金记录 + * @param request 筛选条件 + * @param pageParamRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getBrokerageRecord(BrokerageRecordRequest request, PageParamRequest pageParamRequest) { + PageInfo pageInfo = userBrokerageRecordService.getAdminList(request, pageParamRequest); + List list = pageInfo.getList(); + if (CollUtil.isEmpty(list)) { + pageInfo.setList(list); + return pageInfo; + } + List uidList = list.stream().map(e -> e.getUid()).distinct().collect(Collectors.toList()); + HashMap userMap = userService.getMapListInUid(uidList); + + // 根据用户的 tenantId 批量查询租户名称 + List tenantIdList = userMap.values().stream() + .map(User::getTenantId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map tenantNameMap = new HashMap<>(); + if (CollUtil.isNotEmpty(tenantIdList)) { + List tenants = tenantService.listByIds(tenantIdList); + if (CollUtil.isNotEmpty(tenants)) { + for (Tenant tenant : tenants) { + tenantNameMap.put(tenant.getTenantId(), tenant.getTenantName()); + } + } + } + list.forEach(e -> { + if (e.getLinkType().equals(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW) + && e.getStatus().equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE) + && e.getType().equals(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB)) { + e.setTitle("提现成功"); + } + User user = userMap.get(e.getUid()); + String name = "-"; + if (ObjectUtil.isNotNull(user)) { + name = user.getNickname(); + // 归属公司名称 + Long tenantId = user.getTenantId(); + if (tenantId != null) { + e.setTenantName(tenantNameMap.get(tenantId)); + } + // 手机号码 + e.setPhone(user.getPhone()); + } + e.setUserName(name); + + // 结算时间:status=3 使用 updateTime,其它状态为空 + if (ObjectUtil.isNotNull(e.getStatus()) + && e.getStatus().equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE)) { + e.setSettleTime(e.getUpdateTime()); + } else { + e.setSettleTime(null); + } + }); + + // 汇总计算:1.已结算总收益 2.今日已结算收益 3.待结算总收益 + BigDecimal totalIncome = BigDecimal.ZERO; + BigDecimal todayIncome = BigDecimal.ZERO; + BigDecimal pendingIncome = BigDecimal.ZERO; + Date today = DateUtil.date(); + + for (UserBrokerageRecord record : list) { + BigDecimal price = record.getPrice() == null ? BigDecimal.ZERO : record.getPrice(); + Integer status = record.getStatus(); + if (ObjectUtil.isNotNull(status)) { + // 已结算总收益 & 今日收益 + if (status.equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE)) { + totalIncome = totalIncome.add(price); + if (record.getUpdateTime() != null && DateUtil.isSameDay(record.getUpdateTime(), today)) { + todayIncome = todayIncome.add(price); + } + } + // 待结算总收益(status=1) + if (status.equals(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_CREATE)) { + pendingIncome = pendingIncome.add(price); + } + } + } + + // 将汇总结果回填到每条记录中,前端可从任意一条读取 + for (UserBrokerageRecord record : list) { + record.setTotalIncome(totalIncome); + record.setTodayIncome(todayIncome); + record.setPendingIncome(pendingIncome); + } + pageInfo.setList(list); + return pageInfo; + } + + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserGroupServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserGroupServiceImpl.java new file mode 100644 index 0000000..dca7463 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserGroupServiceImpl.java @@ -0,0 +1,107 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.UserGroup; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserGroupRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.UserGroupMapper; +import com.yzt.service.service.UserGroupService; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * UserGroupServiceImpl 接口实现 + * + */ +@Service +public class UserGroupServiceImpl extends ServiceImpl implements UserGroupService { + + @Resource + private UserGroupMapper mapper; + + /** + * 列表 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + return mapper.selectList(null); + } + + /** + * 根据id in,返回字符串拼接 + * @param groupIdValue String 分组id + * @return List + */ + @Override + public String getGroupNameInId(String groupIdValue) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(UserGroup::getId, YztUtil.stringToArray(groupIdValue)).orderByDesc(UserGroup::getId); + List userTags = mapper.selectList(lambdaQueryWrapper); + if(null == userTags){ + return "无"; + } + + return userTags.stream().map(UserGroup::getGroupName).distinct().collect(Collectors.joining(",")); + } + + /** + * 新增用户分组 + * @param userGroupRequest 分组参数 + */ + @Override + public Boolean create(UserGroupRequest userGroupRequest) { + if (isExistName(userGroupRequest.getGroupName(), null)) { + throw new YztException("分组名称已存在"); + } + UserGroup userGroup = new UserGroup(); + BeanUtils.copyProperties(userGroupRequest, userGroup); + return save(userGroup); + } + + /** + * 是否存在用户分组 + * @param groupName 分组名称 + * @param id 分组ID + */ + private Boolean isExistName(String groupName, Integer id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserGroup::getId); + lqw.eq(UserGroup::getGroupName, groupName); + if (ObjectUtil.isNotNull(id)) { + lqw.ne(UserGroup::getId, id); + } + lqw.last(" limit 1"); + UserGroup userGroup = mapper.selectOne(lqw); + return ObjectUtil.isNotNull(userGroup); + } + + /** + * 修改用户分组 + * @param id 分组id + * @param userGroupRequest 修改参数 + */ + @Override + public Boolean edit(Integer id, UserGroupRequest userGroupRequest) { + if (isExistName(userGroupRequest.getGroupName(), id)) { + throw new YztException("分组名称已存在"); + } + UserGroup userGroup = new UserGroup(); + BeanUtils.copyProperties(userGroupRequest, userGroup); + userGroup.setId(id); + return updateById(userGroup); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserIntegralRecordServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserIntegralRecordServiceImpl.java new file mode 100644 index 0000000..d4676a2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserIntegralRecordServiceImpl.java @@ -0,0 +1,530 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.IntegralRecordConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.model.system.Tenant; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.AdminIntegralSearchRequest; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserIntegralRecordResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserIntegralRecordMapper; +import com.yzt.service.service.UserIntegralRecordService; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserService; +import com.yzt.service.service.TenantService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 用户积分记录Service实现类 + * + */ +@Service +public class UserIntegralRecordServiceImpl extends ServiceImpl implements UserIntegralRecordService { + + private static final Logger logger = LoggerFactory.getLogger(UserIntegralRecordServiceImpl.class); + + @Resource + private UserIntegralRecordMapper mapper; + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBillService userBillService; + + @Autowired + private TenantService tenantService; + + /** + * 根据订单编号、uid获取记录列表 + * @param orderNo 订单编号 + * @param uid 用户uid + * @return 记录列表 + */ + @Override + public List findListByOrderIdAndUid(String orderNo, Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserIntegralRecord::getUid, uid); + lqw.eq(UserIntegralRecord::getLinkId, orderNo); + lqw.in(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_CREATE, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + List recordList = mapper.selectList(lqw); + if (CollUtil.isEmpty(recordList)) { + return recordList; + } + for (int i = 0; i < recordList.size();) { + UserIntegralRecord record = recordList.get(i); + if (record.getType().equals(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD)) { + if (record.getStatus().equals(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE)) { + recordList.remove(i); + continue; + } + } + i++; + } + return recordList; + } + + /** + * 积分解冻 + */ + @Override + public void integralThaw() { + // 查询需要解冻的积分 + List thawList = findThawList(); + if (CollUtil.isEmpty(thawList)) { + return; + } + for (UserIntegralRecord record : thawList) { + // 查询对应的用户 + User user = userService.getById(record.getUid()); + if (ObjectUtil.isNull(user)) { + continue ; + } + record.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + // 计算积分余额 + java.math.BigDecimal balance = user.getIntegral().add(record.getIntegral()); + record.setBalance(balance); + record.setUpdateTime(cn.hutool.core.date.DateUtil.date()); + + // 解冻 + Boolean execute = transactionTemplate.execute(e -> { + updateById(record); + userService.operationIntegral(record.getUid(), record.getIntegral(), user.getIntegral(), "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("积分解冻处理—解冻出错,记录id = {}", record.getId())); + } + } + } + + /** + * PC后台列表 + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + * @return 记录列表 + */ + @Override + public PageInfo findAdminList(AdminIntegralSearchRequest request, PageParamRequest pageParamRequest) { + Page page = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserIntegralRecord::getId, UserIntegralRecord::getTitle, UserIntegralRecord::getBalance, UserIntegralRecord::getIntegral, + UserIntegralRecord::getMark, UserIntegralRecord::getUid, UserIntegralRecord::getUpdateTime, + UserIntegralRecord::getLinkType, UserIntegralRecord::getType, UserIntegralRecord::getStatus); + // 校验:传了 linkType 必须同时指定合法的流水类型 flowType(1-收入,2-支出),并且 linkType 值要符合对应大类 + if (StrUtil.isNotBlank(request.getLinkType())) { + if (ObjectUtil.isNull(request.getFlowType())) { + throw new YztException("参数错误:使用 linkType 时必须同时指定流水类型 flowType"); + } + if (request.getFlowType().equals(1)) { + if (!IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_BROKERAGE_RELEASE.equals(request.getLinkType()) + && !IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT.equals(request.getLinkType()) + && !IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_IN.equals(request.getLinkType())) { + throw new YztException("参数错误:收入类型下 linkType 仅支持 brokerage_release、extract、transfer_in"); + } + } else if (request.getFlowType().equals(2)) { + if (!IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_OUT.equals(request.getLinkType()) + && !IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ACTIVITY_DEDUCTION.equals(request.getLinkType())) { + throw new YztException("参数错误:支出类型下 linkType 仅支持 transfer_out、activity_deduction"); + } + } else { + throw new YztException("参数错误:flowType 仅支持 1-收入 或 2-支出"); + } + } + // 流水状态:未传则查询全部,传入则按传入值过滤(3-正常,4-失效) + if (ObjectUtil.isNotNull(request.getStatus())) { + lqw.eq(UserIntegralRecord::getStatus, request.getStatus()); + } + + // 用户id精确匹配 + if (ObjectUtil.isNotNull(request.getUid())) { + lqw.eq(UserIntegralRecord::getUid, request.getUid()); + } + + // 客户昵称模糊匹配 + if (StrUtil.isNotBlank(request.getKeywords())) { + List idList = userService.findIdListLikeName(request.getKeywords()); + if (CollUtil.isNotEmpty(idList)) { + lqw.in(UserIntegralRecord::getUid, idList); + } else { + return CommonPage.copyPageInfo(page, CollUtil.newArrayList()); + } + } + + // 手机号精确匹配 + if (StrUtil.isNotBlank(request.getPhone())) { + User userByPhone = userService.getByPhone(request.getPhone()); + if (ObjectUtil.isNotNull(userByPhone)) { + lqw.eq(UserIntegralRecord::getUid, userByPhone.getUid()); + } else { + return CommonPage.copyPageInfo(page, CollUtil.newArrayList()); + } + } + + // 身份类型(用户等级)筛选 + if (ObjectUtil.isNotNull(request.getLevel())) { + List levelUserList = userService.list(Wrappers.lambdaQuery().eq(User::getLevel, request.getLevel())); + if (CollUtil.isNotEmpty(levelUserList)) { + List levelUidList = levelUserList.stream().map(User::getUid).collect(Collectors.toList()); + lqw.in(UserIntegralRecord::getUid, levelUidList); + } else { + return CommonPage.copyPageInfo(page, CollUtil.newArrayList()); + } + } + + // 流水类型:1-收入,2-支出 + if (ObjectUtil.isNotNull(request.getFlowType())) { + if (request.getFlowType() == 1) { + // 收入:如果指定了具体流水类型,则仅按该类型筛选;否则按收入大类包含的类型筛选 + if (StrUtil.isNotBlank(request.getLinkType())) { + lqw.eq(UserIntegralRecord::getLinkType, request.getLinkType()); + } else { + lqw.in(UserIntegralRecord::getLinkType, + IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_BROKERAGE_RELEASE, + IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_EXTRACT, + IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_IN); + } + } else if (request.getFlowType() == 2) { + // 支出:如果指定了具体流水类型,则仅按该类型筛选;否则按支出大类包含的类型筛选 + if (StrUtil.isNotBlank(request.getLinkType())) { + lqw.eq(UserIntegralRecord::getLinkType, request.getLinkType()); + } else { + lqw.in(UserIntegralRecord::getLinkType, + IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_OUT, + IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ACTIVITY_DEDUCTION); + } + } + } + //时间范围 + if (StrUtil.isNotBlank(request.getDateLimit())) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + //判断时间 + int compareDateResult = YztDateUtil.compareDate(dateLimit.getEndTime(), dateLimit.getStartTime(), Constants.DATE_FORMAT); + if (compareDateResult == -1) { + throw new YztException("开始时间不能大于结束时间!"); + } + + lqw.between(UserIntegralRecord::getUpdateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + lqw.orderByDesc(UserIntegralRecord::getUpdateTime); + List list = mapper.selectList(lqw); + if (CollUtil.isEmpty(list)) { + return CommonPage.copyPageInfo(page, CollUtil.newArrayList()); + } + + // 批量查询用户和租户,填充昵称、手机号和归属公司名称 + List uidList = list.stream().map(UserIntegralRecord::getUid).distinct().collect(Collectors.toList()); + Map userMap = new HashMap<>(); + if (CollUtil.isNotEmpty(uidList)) { + List users = userService.listByIds(uidList); + if (CollUtil.isNotEmpty(users)) { + for (User user : users) { + userMap.put(user.getUid(), user); + } + } + } + + List tenantIdList = userMap.values().stream() + .map(User::getTenantId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + Map tenantNameMap = new HashMap<>(); + if (CollUtil.isNotEmpty(tenantIdList)) { + List tenants = tenantService.listByIds(tenantIdList); + if (CollUtil.isNotEmpty(tenants)) { + for (Tenant tenant : tenants) { + tenantNameMap.put(tenant.getTenantId(), tenant.getTenantName()); + } + } + } + + List responseList = list.stream().map(i -> { + UserIntegralRecordResponse response = new UserIntegralRecordResponse(); + BeanUtils.copyProperties(i, response); + // 获取用户信息:昵称、手机号码、归属公司名称 + User user = userMap.get(i.getUid()); + if (ObjectUtil.isNotNull(user)) { + response.setNickName(user.getNickname()); + response.setPhone(user.getPhone()); + Long tenantId = user.getTenantId(); + if (tenantId != null) { + response.setTenantName(tenantNameMap.get(tenantId)); + } + } else { + response.setNickName(""); + response.setPhone(""); + } + return response; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(page, responseList); + } + + /** + * 根据类型条件计算积分总数 + * @param uid 用户uid + * @param type 类型:1-增加,2-扣减 + * @param date 日期 + * @param linkTypeList 关联类型 + * @return 积分总数 + */ + @Override + public Integer getSumIntegral(Integer uid, Integer type, String date, List linkTypeList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("sum(integral) as integral"); + queryWrapper.eq("uid", uid); + queryWrapper.eq("type", type); + if (CollUtil.isNotEmpty(linkTypeList)) { + queryWrapper.in("link_type", linkTypeList); + } + queryWrapper.eq("status", IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + if (StrUtil.isNotBlank(date)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + queryWrapper.between("update_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + UserIntegralRecord integralRecord = mapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(integralRecord) || ObjectUtil.isNull(integralRecord.getIntegral())) { + return 0; + } + return integralRecord.getIntegral().intValue(); + } + + /** + * H5用户积分列表 + * @param uid 用户uid + * @param pageParamRequest 分页参数 + * @return 记录列表 + */ + @Override + public List findUserIntegralRecordList(Integer uid, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserIntegralRecord::getId, UserIntegralRecord::getTitle, UserIntegralRecord::getType, UserIntegralRecord::getIntegral, + UserIntegralRecord::getLinkId, UserIntegralRecord::getLinkType, UserIntegralRecord::getMark, UserIntegralRecord::getUpdateTime); + lqw.eq(UserIntegralRecord::getUid, uid); + lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + lqw.orderByDesc(UserIntegralRecord::getUpdateTime); + return mapper.selectList(lqw); + } + + /** + * 获取用户冻结的积分 + * @param uid 用户uid + * @return 积分数量 + */ + @Override + public Integer getFrozenIntegralByUid(Integer uid) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("sum(integral) as integral"); + queryWrapper.eq("uid", uid); + queryWrapper.eq("type", IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + queryWrapper.eq("link_type", IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ORDER); + queryWrapper.eq("status", IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN); + UserIntegralRecord integralRecord = mapper.selectOne(queryWrapper); + if (ObjectUtil.isNull(integralRecord) || ObjectUtil.isNull(integralRecord.getIntegral())) { + return 0; + } + return integralRecord.getIntegral().intValue(); + } + + /** + * 获取需要解冻的记录列表 + * @return 记录列表 + */ + private List findThawList() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.le(UserIntegralRecord::getThawTime, System.currentTimeMillis()); + lqw.eq(UserIntegralRecord::getLinkType, IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_ORDER); + lqw.eq(UserIntegralRecord::getType, IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + lqw.eq(UserIntegralRecord::getStatus, IntegralRecordConstants.INTEGRAL_RECORD_STATUS_FROZEN); + return mapper.selectList(lqw); + } + + /** + * 用户间积分转让 + * @param phone 收款人手机号 + * @param integral 转让积分 + * @param tradePassword 交易密码 + * @return Boolean + */ + @Override + public Boolean transferIntegral(String phone, Integer integral, String tradePassword, String transferType) { + if (integral == null || integral <= 0) { + throw new YztException("转让积分必须大于0"); + } + // 转出用户(当前登录用户) + com.yzt.common.model.user.User fromUser = userService.getInfo(); + if (ObjectUtil.isNull(fromUser)) { + throw new YztException("用户信息异常"); + } + // 校验交易密码 + if (StrUtil.isBlank(fromUser.getTradePassword())) { + throw new YztException("请先设置交易密码"); + } + String encrypted = YztUtil.encryptPassword(tradePassword, fromUser.getPhone()); + if (!fromUser.getTradePassword().equals(encrypted)) { + throw new YztException("交易密码错误"); + } + // 默认转账类型为 integral + if (StrUtil.isBlank(transferType)) { + transferType = "integral"; + } + + // 收款用户 + com.yzt.common.model.user.User toUser = userService.getByPhone(phone); + if (ObjectUtil.isNull(toUser)) { + throw new YztException("收款用户不存在"); + } + if (toUser.getUid().equals(fromUser.getUid())) { + throw new YztException("不能给自己转账"); + } + + if ("now_money".equalsIgnoreCase(transferType)) { + // 余额转账逻辑(now_money) + java.math.BigDecimal amount = java.math.BigDecimal.valueOf(integral); + if (fromUser.getNowMoney() == null || fromUser.getNowMoney().compareTo(amount) < 0) { + throw new YztException("余额不足"); + } + + // 构建账单:转出(支出) + UserBill fromBill = new UserBill(); + fromBill.setUid(fromUser.getUid()); + fromBill.setLinkId("0"); + fromBill.setLinkType(Constants.USER_BILL_LINK_TYPE_TRANSFER_OUT); + fromBill.setPm(0); + fromBill.setTitle("转账支出"); + fromBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + fromBill.setType("transfer"); + fromBill.setNumber(amount); + fromBill.setBalance(fromUser.getNowMoney().subtract(amount)); + fromBill.setMark(StrUtil.format("转给{}({})", toUser.getNickname(), toUser.getPhone())); + fromBill.setStatus(1); + fromBill.setCreateTime(com.yzt.common.utils.YztDateUtil.nowDateTime()); + fromBill.setUpdateTime(com.yzt.common.utils.YztDateUtil.nowDateTime()); + + // 构建账单:转入(收入) + UserBill toBill = new UserBill(); + toBill.setUid(toUser.getUid()); + toBill.setLinkId("0"); + toBill.setLinkType(Constants.USER_BILL_LINK_TYPE_TRANSFER_IN); + toBill.setPm(1); + toBill.setTitle("转账收入"); + toBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + toBill.setType("transfer"); + toBill.setNumber(amount); + toBill.setBalance(toUser.getNowMoney() == null ? amount : toUser.getNowMoney().add(amount)); + toBill.setMark(StrUtil.format("来自{}({})", fromUser.getNickname(), fromUser.getPhone())); + toBill.setStatus(1); + toBill.setCreateTime(com.yzt.common.utils.YztDateUtil.nowDateTime()); + toBill.setUpdateTime(com.yzt.common.utils.YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 扣减转出用户余额 + boolean subOk = userService.operationNowMoney(fromUser.getUid(), amount, fromUser.getNowMoney(), "sub"); + if (!subOk) { + throw new YztException("扣减余额失败"); + } + // 增加收款用户余额 + boolean addOk = userService.operationNowMoney(toUser.getUid(), amount, toUser.getNowMoney(), "add"); + if (!addOk) { + throw new YztException("增加余额失败"); + } + // 保存账单 + userBillService.save(fromBill); + userBillService.save(toBill); + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("余额转账失败"); + } + return execute; + } + + // 以下为积分转账原逻辑 + // 校验积分余额 + if (fromUser.getIntegral() == null || fromUser.getIntegral().compareTo(java.math.BigDecimal.valueOf(integral)) < 0) { + throw new YztException("积分不足"); + } + // 构建积分记录:转出(减) + UserIntegralRecord fromRecord = new UserIntegralRecord(); + fromRecord.setUid(fromUser.getUid()); + // 转账类记录 link_id 为 "0",并使用新增的转出 linkType/title + fromRecord.setLinkId("0"); + fromRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_OUT); + fromRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_SUB); + fromRecord.setTitle(IntegralRecordConstants.INTEGRAL_RECORD_TITLE_TRANSFER_OUT); + fromRecord.setIntegral(java.math.BigDecimal.valueOf(integral)); + fromRecord.setBalance(fromUser.getIntegral().subtract(java.math.BigDecimal.valueOf(integral))); + fromRecord.setMark(StrUtil.format("转给{}({})", toUser.getNickname(), toUser.getPhone())); + fromRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + fromRecord.setCreateTime(YztDateUtil.nowDateTime()); + + // 构建积分记录:转入(加) + UserIntegralRecord toRecord = new UserIntegralRecord(); + toRecord.setUid(toUser.getUid()); + // 转账类记录 link_id 为 "0",并使用新增的转入 linkType/title + toRecord.setLinkId("0"); + toRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_TRANSFER_IN); + toRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + toRecord.setTitle(IntegralRecordConstants.INTEGRAL_RECORD_TITLE_TRANSFER_IN); + toRecord.setIntegral(java.math.BigDecimal.valueOf(integral)); + toRecord.setBalance(toUser.getIntegral().add(java.math.BigDecimal.valueOf(integral))); + toRecord.setMark(StrUtil.format("来自{}({})", fromUser.getNickname(), fromUser.getPhone())); + toRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + toRecord.setCreateTime(YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + // 扣减转出用户积分(检查返回值以保证一致性) + boolean subOk = userService.operationIntegral(fromUser.getUid(), java.math.BigDecimal.valueOf(integral), fromUser.getIntegral(), "sub"); + if (!subOk) { + throw new YztException("扣减积分失败"); + } + // 增加收款用户积分 + boolean addOk = userService.operationIntegral(toUser.getUid(), java.math.BigDecimal.valueOf(integral), toUser.getIntegral(), "add"); + if (!addOk) { + throw new YztException("增加积分失败"); + } + // 保存积分记录 + this.save(fromRecord); + this.save(toRecord); + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("积分转让失败"); + } + return execute; + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelServiceImpl.java new file mode 100644 index 0000000..6c5e96c --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelServiceImpl.java @@ -0,0 +1,195 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserLevel; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.service.mapper.UserLevelMapper; +import com.yzt.service.service.SystemUserLevelService; +import com.yzt.service.service.UserLevelService; +import com.yzt.service.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * UserLevelServiceImpl 接口实现 + * + */ +@Service +public class UserLevelServiceImpl extends ServiceImpl implements UserLevelService { + + @Resource + private UserLevelMapper mapper; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Autowired + private UserService userService; + + @Autowired + private TransactionTemplate transactionTemplate; + + + /** + * 列表 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + return mapper.selectList(null); + } + + /** + * 用户升级 + * @param user 用户数据 + * @return Boolean + */ + @Override + public Boolean upLevel(User user) { + //确定当前经验所达到的等级 + List list = systemUserLevelService.getUsableList(); + if (CollUtil.isEmpty(list)) { + log.error("系统会员等级未配置,请配置对应数据"); + return Boolean.TRUE; + } + + SystemUserLevel userLevelConfig = null; + for (SystemUserLevel systemUserLevel : list) { + if(user.getExperience() > systemUserLevel.getExperience()){ + userLevelConfig = systemUserLevel; + continue; + } + break; + } + + if(ObjectUtil.isNull(userLevelConfig)) { + log.warn("未找到用户对应的会员等级,uid = " + user.getUid()); + return Boolean.TRUE; + } + + // 判断用户是否还在原等级 + if (user.getLevel().equals(userLevelConfig.getId())) { + return Boolean.TRUE; + } + + // 判断用户等级经过向上调整 + List collect = list.stream().filter(e -> e.getId().equals(user.getLevel())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(collect)) { + if (collect.get(0).getGrade() > userLevelConfig.getGrade()) { + return Boolean.TRUE; + } + } + UserLevel newLevel = new UserLevel(); + newLevel.setStatus(true); + newLevel.setIsDel(false); + newLevel.setGrade(userLevelConfig.getGrade()); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(userLevelConfig.getId()); + newLevel.setDiscount(userLevelConfig.getDiscount()); + + Date date = YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT); + String mark = Constants.USER_LEVEL_UP_LOG_MARK.replace("【{$userName}】", user.getNickname()). + replace("{$date}", YztDateUtil.dateToStr(date, Constants.DATE_FORMAT)). + replace("{$levelName}", userLevelConfig.getName()); + newLevel.setMark(mark); + + //更新会员等级 + user.setLevel(userLevelConfig.getId()); + return transactionTemplate.execute(e -> { + save(newLevel); + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + return Boolean.TRUE; + }); + } + + /** + * 经验降级 + * @param user 用户 + * @return Boolean + */ + @Override + public Boolean downLevel(User user) { + //确定当前经验所达到的等级 + List list = systemUserLevelService.getUsableList(); + if (CollUtil.isEmpty(list)) { + log.error("系统会员等级未配置,请配置对应数据"); + return Boolean.TRUE; + } + + SystemUserLevel userLevelConfig = null; + for (SystemUserLevel systemUserLevel : list) { + if(user.getExperience() > systemUserLevel.getExperience()){ + userLevelConfig = systemUserLevel; + continue; + } + break; + } + + if(ObjectUtil.isNull(userLevelConfig)) { + log.warn("未找到用户对应的会员等级,uid = " + user.getUid()); + return Boolean.TRUE; + } + + // 判断用户是否还在原等级 + if (user.getLevel().equals(userLevelConfig.getId())) { + return Boolean.TRUE; + } + + UserLevel newLevel = new UserLevel(); + newLevel.setStatus(true); + newLevel.setIsDel(false); + newLevel.setGrade(userLevelConfig.getGrade()); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(userLevelConfig.getId()); + newLevel.setDiscount(userLevelConfig.getDiscount()); + + Date date = YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT); + String mark = Constants.USER_LEVEL_OPERATE_LOG_MARK.replace("【{$userName}】", user.getNickname()). + replace("{$date}", YztDateUtil.dateToStr(date, Constants.DATE_FORMAT)). + replace("{$levelName}", userLevelConfig.getName()); + newLevel.setMark(mark); + + //更新会员等级 + user.setLevel(userLevelConfig.getId()); + return transactionTemplate.execute(e -> { + save(newLevel); + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + return Boolean.TRUE; + }); + } + + /** + * 删除(通过系统等级id) + * @param levelId 系统等级id + * @return Boolean + */ + @Override + public Boolean deleteByLevelId(Integer levelId) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(UserLevel::getIsDel, true); + luw.eq(UserLevel::getLevelId, levelId); + luw.eq(UserLevel::getIsDel, false); + return update(luw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelUpgradeAuditServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelUpgradeAuditServiceImpl.java new file mode 100644 index 0000000..c31dc48 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserLevelUpgradeAuditServiceImpl.java @@ -0,0 +1,373 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserLevel; +import com.yzt.common.model.user.UserLevelUpgradeAudit; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserLevelUpgradeAuditQueryRequest; +import com.yzt.common.request.UserLevelUpgradeAuditRequest; +import com.yzt.common.response.UserLevelUpgradeAuditResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.UserLevelUpgradeAuditMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author: pengsz + * @Date: 2025/11/22 + * @Description: + */ +@Service +public class UserLevelUpgradeAuditServiceImpl extends ServiceImpl implements UserLevelUpgradeAuditService { + + @Autowired + private UserLevelUpgradeAuditMapper mapper; + + @Autowired + private UserService userService; + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private TenantService tenantService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + /** + * 列表 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest, UserLevelUpgradeAuditQueryRequest request) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + + // 客户名称 - 模糊查询 + if (StrUtil.isNotBlank(request.getUserName())) { + lqw.like(UserLevelUpgradeAudit::getUserName, request.getUserName()); + } + + // 手机号 - 模糊查询(也可用 eq,但通常支持模糊) + if (StrUtil.isNotBlank(request.getPhone())) { + lqw.like(UserLevelUpgradeAudit::getPhone, request.getPhone()); + } + + // 审核状态 - 精确匹配 + if (request.getStatus() != null) { + lqw.eq(UserLevelUpgradeAudit::getStatus, request.getStatus()); + } + // 按申请时间倒序(可选,建议加上) + lqw.orderByDesc(UserLevelUpgradeAudit::getApplyTime); + List userLevelUpgradeAudits = mapper.selectList(lqw); + + List levels = systemUserLevelService.getList(); + Map gradeToNameMap = levels.stream() + .filter(level -> level.getGrade() != null && StrUtil.isNotBlank(level.getName())) + .collect(Collectors.toMap( + SystemUserLevel::getGrade, // key: grade + SystemUserLevel::getName // value: name + )); + + + return userLevelUpgradeAudits.stream().map(audit -> { + UserLevelUpgradeAuditResponse resp = new UserLevelUpgradeAuditResponse(); + + resp.setId(audit.getId()); + resp.setUid(audit.getUid()); + resp.setUserName(audit.getUserName()); + resp.setPhone(audit.getPhone()); + resp.setCurrentLevel(audit.getCurrentLevel()); + resp.setTargetLevel(audit.getTargetLevel()); + resp.setDescription(audit.getDescription()); + resp.setBusinessLicenseUrl(audit.getBusinessLicenseUrl()); + resp.setStatus(audit.getStatus()); + resp.setAuditRemark(audit.getAuditRemark()); + resp.setAuditorId(audit.getAuditorId()); + resp.setApplyTime(audit.getApplyTime()); + resp.setAuditTime(audit.getAuditTime()); + resp.setSourceType(audit.getSourceType()); + + // 补充租户名称 + User user = userService.getInfoByUid(audit.getUid()); + if (user != null) { + String tenantName = tenantService.getInfo(user.getTenantId()).getTenantName(); + resp.setTenantName(tenantName); + } + resp.setCurrentLevelName(gradeToNameMap.get(Integer.valueOf(audit.getCurrentLevel()))); + resp.setTargetLevelName(gradeToNameMap.get(Integer.valueOf(audit.getTargetLevel()))); + return resp; + }).collect(Collectors.toList()); + } + + /** + * 创建审核记录 + */ + @Override + public Boolean createAuditRecord(Integer uid, Integer currentLevel, Integer targetLevel, String orderId,Integer sourceType) { + // 检查是否已存在待审核记录 + if (hasPendingAudit(uid, targetLevel)) { + return Boolean.FALSE; + } + + User user = userService.getById(uid); + if (user == null) { + throw new YztException("用户不存在"); + } + + UserLevelUpgradeAudit audit = new UserLevelUpgradeAudit(); + audit.setUid(uid); + audit.setUserName(user.getNickname()); + audit.setPhone(user.getPhone()); + audit.setCurrentLevel(String.valueOf(currentLevel)); + audit.setTargetLevel(String.valueOf(targetLevel)); + audit.setSourceType(sourceType); + + // 在description中记录订单号 + String productTypeName = getProductTypeName(targetLevel); + audit.setDescription(StrUtil.format("购买了{}商品,订单号:{}", productTypeName, orderId)); + + audit.setStatus(1); // 1=待审核 + audit.setApplyTime(new Date()); + + return save(audit); + } + + @Override + public boolean create(UserLevelUpgradeAudit request) { + User user = userService.getById(request.getUid()); + if (user == null) { + throw new YztException("用户不存在"); + } + if(hasPendingAudit(request.getUid(), Integer.valueOf(request.getTargetLevel()))){ + throw new YztException("当前用户存在其他待审核记录!"); + } + User spreadUser = userService.getById(user.getSpreadUid()); + if (user.getLevel()>Integer.parseInt(request.getTargetLevel())||spreadUser.getLevel() { + if (userLevelUpgradeAudit.getStatus() == 2) { + User user = userService.getById(request.getUid()); + user.setLevel(Integer.valueOf(request.getTargetLevel())); + userService.updateById(user); + } + saveOrUpdate(userLevelUpgradeAudit); + return Boolean.TRUE; + })); + } + + @Override + public UserLevelUpgradeAuditResponse getInfoById(Integer id) { + UserLevelUpgradeAudit userLevelUpgradeAudit = getById(id); + UserLevelUpgradeAuditResponse userLevelUpgradeAuditResponse = new UserLevelUpgradeAuditResponse(); + BeanUtils.copyProperties(userLevelUpgradeAudit,userLevelUpgradeAuditResponse); + + User user = userService.getInfoByUid(userLevelUpgradeAudit.getUid()); + if (user != null) { + String tenantName = tenantService.getInfo(user.getTenantId()).getTenantName(); + userLevelUpgradeAuditResponse.setTenantName(tenantName); + } + + List levels = systemUserLevelService.getList(); + Map gradeToNameMap = levels.stream() + .filter(level -> level.getGrade() != null && StrUtil.isNotBlank(level.getName())) + .collect(Collectors.toMap( + SystemUserLevel::getGrade, // key: grade + SystemUserLevel::getName // value: name + )); + userLevelUpgradeAuditResponse.setCurrentLevelName(gradeToNameMap.get(Integer.valueOf(userLevelUpgradeAudit.getCurrentLevel()))); + userLevelUpgradeAuditResponse.setTargetLevelName(gradeToNameMap.get(Integer.valueOf(userLevelUpgradeAudit.getTargetLevel()))); + return userLevelUpgradeAuditResponse; + } + + /** + * 检查是否已存在待审核记录 + */ + @Override + public Boolean hasPendingAudit(Integer uid, Integer targetLevel) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(UserLevelUpgradeAudit::getUid, uid.longValue()) + .eq(UserLevelUpgradeAudit::getTargetLevel, String.valueOf(targetLevel)) + .eq(UserLevelUpgradeAudit::getStatus, 1); // 1=待审核 + return count(wrapper) > 0; + } + + /** + * 审核通过 + */ + @Override + public Boolean approve(UserLevelUpgradeAuditRequest request, Long auditorId) { + UserLevelUpgradeAudit audit = getById(request.getId()); + if (audit == null) { + throw new YztException("审核记录不存在"); + } + if (!audit.getStatus().equals(1)) { + throw new YztException("该记录已审核,请勿重复操作"); + } + + // 更新审核记录 + audit.setStatus(2); // 2=通过 + audit.setAuditTime(new Date()); + audit.setAuditorId(auditorId); + audit.setAuditRemark(request.getAuditRemark()); + if (StrUtil.isNotBlank(request.getBusinessLicenseUrl())) { + audit.setBusinessLicenseUrl(request.getBusinessLicenseUrl()); + } + + // 从description中提取订单号 + String orderId = extractOrderIdFromDescription(audit.getDescription()); + + // 升级用户等级 + Integer targetLevelId = Integer.valueOf(audit.getTargetLevel()); + User user = userService.getById(audit.getUid().intValue()); + if (user == null) { + throw new YztException("用户不存在"); + } + + return transactionTemplate.execute(e -> { + // 更新审核记录 + updateById(audit); + + // 创建等级记录 + UserLevel newLevel = new UserLevel(); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(targetLevelId); + newLevel.setGrade(targetLevelId); + newLevel.setStatus(true); + newLevel.setIsDel(false); + newLevel.setDiscount(100); // 默认折扣 + newLevel.setCreateTime(new Date()); + + // 在mark中记录订单号 + String mark = StrUtil.format("尊敬的用户【{}】,在{}通过等级审核升级为{}级,订单号:{}", + user.getNickname(), + YztDateUtil.nowDateTimeStr(), + targetLevelId, + orderId); + newLevel.setMark(mark); + + userLevelService.save(newLevel); + + // 更新用户等级 + user.setLevel(targetLevelId); + user.setUpdateTime(new Date()); + userService.updateById(user); + + return Boolean.TRUE; + }); + } + + /** + * 审核拒绝 + */ + @Override + public Boolean reject(UserLevelUpgradeAuditRequest request, Long auditorId) { + UserLevelUpgradeAudit audit = getById(request.getId()); + if (audit == null) { + throw new YztException("审核记录不存在"); + } + if (!audit.getStatus().equals(1)) { + throw new YztException("该记录已审核,请勿重复操作"); + } + if (StrUtil.isBlank(request.getAuditRemark())) { + throw new YztException("拒绝审核时必须填写拒绝理由"); + } + + audit.setStatus(3); // 3=拒绝 + audit.setAuditTime(new Date()); + audit.setAuditorId(auditorId); + audit.setAuditRemark(request.getAuditRemark()); + + return updateById(audit); + } + + /** + * 根据订单号标记待审核记录为拒绝(退款时调用) + */ + @Override + public Boolean rejectByOrderIdForRefund(String orderId, Long auditorId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(UserLevelUpgradeAudit::getDescription, orderId) + .eq(UserLevelUpgradeAudit::getStatus, 1); // 只处理待审核的 + + List auditList = list(wrapper); + if (CollUtil.isEmpty(auditList)) { + return Boolean.TRUE; // 没有待审核记录,直接返回成功 + } + + // 批量更新为审核拒绝状态 + auditList.forEach(audit -> { + audit.setStatus(3); // 3=拒绝 + audit.setAuditTime(new Date()); + audit.setAuditorId(auditorId); + audit.setAuditRemark("订单已退款"); + }); + + return updateBatchById(auditList); + } + + /** + * 获取商品类型名称 + */ + private String getProductTypeName(Integer targetLevel) { + if (targetLevel == 3) { + return "加盟店"; + } else if (targetLevel == 4) { + return "会馆"; + } + return ""; + } + + /** + * 从description中提取订单号 + */ + private String extractOrderIdFromDescription(String description) { + if (StrUtil.isBlank(description)) { + return ""; + } + // 格式:"购买了加盟店商品,订单号:xxxxx" + int index = description.indexOf("订单号:"); + if (index > 0) { + return description.substring(index + 4).trim(); + } + return ""; + } +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeApplicationServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeApplicationServiceImpl.java new file mode 100644 index 0000000..401e994 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeApplicationServiceImpl.java @@ -0,0 +1,249 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserBill; +import com.yzt.common.model.user.UserRechargeApplication; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeApplicationRequest; +import com.yzt.common.request.UserRechargeApplicationSearchRequest; +import com.yzt.common.response.UserRechargeApplicationResponse; +import com.yzt.common.response.UserRechargeResponse; +import com.yzt.common.utils.SecurityUtil; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserRechargeApplicationMapper; +import com.yzt.service.service.TenantService; +import com.yzt.service.service.UserBillService; +import com.yzt.service.service.UserRechargeApplicationService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.security.Security; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Author: pengsz + * @Date: 2025/11/18 + * @Description: + */ +@Service +public class UserRechargeApplicationServiceImpl extends ServiceImpl implements UserRechargeApplicationService { + + @Resource + UserRechargeApplicationMapper mapper; + + @Autowired + UserService userService; + + @Autowired + TenantService tenantService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserBillService userBillService; + + @Override + public PageInfo getList(UserRechargeApplicationSearchRequest request, PageParamRequest pageParamRequest) { + // 1. 先根据 phone / name 查询符合条件的用户 IDs + List filteredUids = null; + + if (StrUtil.isNotBlank(request.getPhone()) || StrUtil.isNotBlank(request.getName())) { + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(request.getPhone())) { + userWrapper.like(User::getPhone, request.getPhone()); + } + if (StrUtil.isNotBlank(request.getName())) { + userWrapper.like(User::getNickname, request.getName()); + } + List matchedUsers = userService.list(userWrapper); + if (CollUtil.isEmpty(matchedUsers)) { + // 没有匹配的用户,直接返回空分页 + Page emptyPage = new Page<>(pageParamRequest.getPage(), pageParamRequest.getLimit()); + return CommonPage.copyPageInfo(emptyPage, CollUtil.newArrayList()); + } + filteredUids = matchedUsers.stream().map(User::getUid).collect(Collectors.toList()); + } + // 2. 开始分页 + Page userRechargesList = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + //带 UserExtract 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + + //时间范围 + if (StrUtil.isNotBlank(dateLimit.getStartTime()) && StrUtil.isNotBlank(dateLimit.getEndTime())) { + //判断时间 + int compareDateResult = YztDateUtil.compareDate(dateLimit.getEndTime(), dateLimit.getStartTime(), Constants.DATE_FORMAT); + if(compareDateResult == -1){ + throw new YztException("开始时间不能大于结束时间!"); + } + + if (Objects.nonNull(request.getStatus())) { + lambdaQueryWrapper.eq(UserRechargeApplication::getStatus, request.getStatus()); + } + lambdaQueryWrapper.between(UserRechargeApplication::getCreatedTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + // 用户 ID 条件(来自 phone/name 查询结果) + if (filteredUids != null) { + if (filteredUids.isEmpty()) { + return CommonPage.copyPageInfo(userRechargesList, CollUtil.newArrayList()); + } + lambdaQueryWrapper.in(UserRechargeApplication::getUid, filteredUids); + } + + List userRechargeApplications = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(userRechargeApplications)) { + return CommonPage.copyPageInfo(userRechargesList, CollUtil.newArrayList()); + } + List userIds = userRechargeApplications.stream().map(UserRechargeApplication::getUid).collect(Collectors.toList()); + HashMap userHashMap = userService.getMapListInUid(userIds); + List responseList = userRechargeApplications.stream().map(e -> { + User user = userHashMap.get(e.getUid()); + UserRechargeApplicationResponse r = new UserRechargeApplicationResponse(); + BeanUtils.copyProperties(e, r); + if (null != user) { + r.setPhone(user.getPhone()); + r.setName(user.getNickname()); + r.setTenantName(tenantService.getInfo(user.getTenantId()).getTenantName()); + } + r.setReviewerName(SecurityUtil.getLoginUserVo().getUser().getRealName()); + return r; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(userRechargesList, responseList); + } + + @Override + public Boolean userRechargeApply(UserRechargeApplicationRequest request) { + Integer userId = userService.getUserIdException(); + + UserRechargeApplication userRechargeApplication = new UserRechargeApplication(); + userRechargeApplication.setUid(userId); + userRechargeApplication.setAmount(request.getAmount()); + String prefix = "https://file.dev.iesaylink.com"; + if (request.getPaymentProofUrl().startsWith(prefix)) { + request.setPaymentProofUrl(request.getPaymentProofUrl().substring(prefix.length())); ; + } + userRechargeApplication.setPaymentProofUrl(request.getPaymentProofUrl()); + userRechargeApplication.setStatus(1); + + Date now = new Date(); + userRechargeApplication.setCreatedTime(now); + userRechargeApplication.setUpdatedTime(now); + return save(userRechargeApplication); + } + + public Boolean create(UserRechargeApplicationRequest request) { + + UserRechargeApplication userRechargeApplication = new UserRechargeApplication(); + userRechargeApplication.setUid(request.getUid()); + userRechargeApplication.setAmount(request.getAmount()); + userRechargeApplication.setPaymentProofUrl(request.getPaymentProofUrl()); +// userRechargeApplication.setStatus(1); + userRechargeApplication.setStatus(request.getStatus()); + userRechargeApplication.setRemark(request.getRemark()); +// userRechargeApplication.setReviewerId(); + + Date now = new Date(); + userRechargeApplication.setCreatedTime(now); + userRechargeApplication.setUpdatedTime(now); + userRechargeApplication.setReviewedTime(now); + return save(userRechargeApplication); + } + + @Override + public UserRechargeApplicationResponse info(Integer id) { + UserRechargeApplicationResponse userRechargeApplicationResponse = new UserRechargeApplicationResponse(); + UserRechargeApplication userRechargeApplication = getById(id); + if (Objects.isNull(userRechargeApplication)){ + throw new YztException("信息不存在!"); + } + BeanUtils.copyProperties(userRechargeApplication,userRechargeApplicationResponse); + User user = userService.getInfoByUid(userRechargeApplication.getUid()); + if (Objects.isNull(user)){ + throw new YztException("用户不存在!"); + } + userRechargeApplicationResponse.setPhone(user.getPhone()); + userRechargeApplicationResponse.setName(user.getNickname()); + return userRechargeApplicationResponse; + } + + @Override + public Boolean approve(UserRechargeApplicationRequest request) { + UserRechargeApplication userRechargeApplication = getById(request.getId()); + userRechargeApplication.setStatus(request.getStatus()); + userRechargeApplication.setRemark(request.getRemark()); + userRechargeApplication.setReviewerId(SecurityUtil.getLoginUserVo().getUser().getId()); + Date now = new Date(); + userRechargeApplication.setUpdatedTime(now); + userRechargeApplication.setReviewedTime(now); + userRechargeApplication.setAmount(request.getAmount()); + return Boolean.TRUE.equals(transactionTemplate.execute(e -> { + if(request.getStatus() == 1){ + User user = userService.getById(request.getUid()); + user.setNowMoney(request.getAmount().add(user.getNowMoney())); + userService.updateById(user); + } + updateById(userRechargeApplication); + UserBill userBill = new UserBill(); + userBill.setUid(request.getUid()); + userBill.setLinkId(String.valueOf(userRechargeApplication.getId())); + userBill.setPm(1); + userBill.setTitle("充值支付"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setType(Constants.USER_BILL_TYPE_PAY_RECHARGE); + userBillService.save(userBill); + return Boolean.TRUE; + })); + } + + /** + * 列表 + * @param status 请求参数 + * @return List + */ + @Override + public List getUserApplications(Integer status,Integer uid) { + + if (uid == null){ + throw new YztException("用户未登录"); + } + + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(UserRechargeApplication::getStatus,status); + lqw.eq(UserRechargeApplication::getUid,uid); + + List userRechargeApplicationList = mapper.selectList(lqw); + return userRechargeApplicationList; + } + + + +// /** +// * @param id 请求参数 +// * @param status 请求参数 +// */ +// public Boolean approve(Integer status, Integer id) { +// UserRechargeApplication userRechargeApplication = getById(id); +// userRechargeApplication.setStatus(status); +// return updateById(userRechargeApplication); +// } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeServiceImpl.java new file mode 100644 index 0000000..4acf42f --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserRechargeServiceImpl.java @@ -0,0 +1,272 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.user.User; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserRechargeSearchRequest; +import com.yzt.common.response.UserRechargeResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserRechargeMapper; +import com.yzt.service.service.UserRechargeService; +import com.yzt.service.service.UserService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** +* UserRechargeServiceImpl 接口实现 +* fw_ +*/ +@Service +public class UserRechargeServiceImpl extends ServiceImpl implements UserRechargeService { + + @Resource + private UserRechargeMapper mapper; + + @Autowired + private UserService userService; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public PageInfo getList(UserRechargeSearchRequest request, PageParamRequest pageParamRequest) { + Page userRechargesList = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + //带 UserExtract 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (ObjectUtil.isNotNull(request.getUid()) && request.getUid() > 0) { + lambdaQueryWrapper.eq(UserRecharge::getUid, request.getUid()); + } + if (StrUtil.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.like(UserRecharge::getOrderId, request.getKeywords()); //订单号 + } + //是否充值 + lambdaQueryWrapper.eq(UserRecharge::getPaid, true); + + //时间范围 + if (StrUtil.isNotBlank(dateLimit.getStartTime()) && StrUtil.isNotBlank(dateLimit.getEndTime())) { + //判断时间 + int compareDateResult = YztDateUtil.compareDate(dateLimit.getEndTime(), dateLimit.getStartTime(), Constants.DATE_FORMAT); + if(compareDateResult == -1){ + throw new YztException("开始时间不能大于结束时间!"); + } + + lambdaQueryWrapper.between(UserRecharge::getCreateTime, dateLimit.getStartTime(), dateLimit.getEndTime()); + } + lambdaQueryWrapper.orderByDesc(UserRecharge::getId); + List userRecharges = mapper.selectList(lambdaQueryWrapper); + if (CollUtil.isEmpty(userRecharges)) { + return CommonPage.copyPageInfo(userRechargesList, CollUtil.newArrayList()); + } + + List userIds = userRecharges.stream().map(UserRecharge::getUid).collect(Collectors.toList()); + HashMap userHashMap = userService.getMapListInUid(userIds); + List responseList = userRecharges.stream().map(e -> { + User user = userHashMap.get(e.getUid()); + UserRechargeResponse r = new UserRechargeResponse(); + BeanUtils.copyProperties(e, r); + if (null != user) { + r.setAvatar(user.getAvatar()); + r.setNickname(user.getNickname()); + } + return r; + }).collect(Collectors.toList()); + return CommonPage.copyPageInfo(userRechargesList, responseList); + } + + /** + * 充值总金额 + * @return HashMap + */ + @Override + public HashMap getBalanceList() { + HashMap map = new HashMap<>(); + + BigDecimal routine = mapper.getSumByType("routine"); + if(null == routine) routine = BigDecimal.ZERO; + map.put("routine", routine); //小程序充值 + +// BigDecimal weChat = mapper.getSumByType("weixin"); + BigDecimal weChat = mapper.getSumByType("public"); + if(null == weChat) weChat = BigDecimal.ZERO; + map.put("weChat", weChat); //公众号充值 + + BigDecimal total = mapper.getSumByType(""); + if(null == total) total = BigDecimal.ZERO; + map.put("total", total); //总金额 + + BigDecimal refund = mapper.getSumByRefund(); + if(null == refund) refund = BigDecimal.ZERO; + map.put("refund", refund); + + map.put("other", total.subtract(routine).subtract(weChat)); //其他金额 + + return map; + } + + /** + * 根据对象查询订单 + * @return UserRecharge + */ + @Override + public UserRecharge getInfoByEntity(UserRecharge userRecharge) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.setEntity(userRecharge); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 根据日期获取充值订单数量 + * @param date 日期,yyyy-MM-dd格式 + * @return Integer + */ + @Override + public Integer getRechargeOrderNumByDate(String date) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("id"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 根据日期获取充值订单金额 + * @param date 日期,yyyy-MM-dd格式 + * @return BigDecimal + */ + @Override + public BigDecimal getRechargeOrderAmountByDate(String date) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("IFNULL(sum(price), 0) as price"); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return mapper.selectOne(wrapper).getPrice(); + } + + /** + * 获取总人数 + * @return Integer + */ + @Override + public Integer getTotalPeople() { + QueryWrapper wrapper = Wrappers.query(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.groupBy("uid"); + List list = mapper.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return 0; + } + return list.size(); + } + + /** + * 获取总金额 + * @return BigDecimal + */ + @Override + public BigDecimal getTotalPrice() { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("IFNULL(sum(price), 0) as price"); + wrapper.eq("paid", 1); + return mapper.selectOne(wrapper).getPrice(); + } + + /** + * 根据时间获取充值用户数量 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getRechargeUserNumByDate(String date) { + QueryWrapper wrapper = Wrappers.query(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + wrapper.groupBy("uid"); + List list = mapper.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return 0; + } + return list.size(); + } + + /** + * 根据时间获取充值用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + @Override + public Integer getRechargeUserNumByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = Wrappers.query(); + //wrapper.select("id"); + wrapper.select(" ANY_VALUE(id) AS id "); + wrapper.eq("paid", 1); + wrapper.apply("date_format(create_time, '%Y-%m-%d') between {0} and {1}", startDate, endDate); + wrapper.groupBy("uid"); + List list = mapper.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return 0; + } + return list.size(); + } + + /** + * 获取待上传微信发货管理订单 + */ + @Override + public List findAwaitUploadWechatList() { + DateTime date = cn.hutool.core.date.DateUtil.date(); + DateTime offsetMinute = cn.hutool.core.date.DateUtil.offsetMinute(date, -10); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserRecharge::getPaid, 1); + lqw.eq(UserRecharge::getIsWechatShipping, 0); + lqw.eq(UserRecharge::getRechargeType, PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM); + lqw.le(UserRecharge::getPayTime, offsetMinute); + return mapper.selectList(lqw); + } + + /** + * 获取订单 + * @param outTradeNo 商户系统内部的订单号 + */ + @Override + public UserRecharge getByOutTradeNo(String outTradeNo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(UserRecharge::getOutTradeNo, outTradeNo); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..c6a30c7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserServiceImpl.java @@ -0,0 +1,2003 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.yzt.common.constants.*; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.coupon.StoreCoupon; +import com.yzt.common.model.coupon.StoreCouponUser; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.common.model.system.SystemUserLevel; +import com.yzt.common.model.user.*; +import com.yzt.common.page.CommonPage; +import com.yzt.common.request.*; +import com.yzt.common.response.*; +import com.yzt.common.token.FrontTokenComponent; +import com.yzt.common.utils.*; +import com.yzt.common.vo.DateLimitUtilVo; +import com.yzt.service.mapper.UserMapper; +import com.yzt.service.service.*; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户表 服务实现类 + * + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); + + @Resource + private UserMapper userMapper; + + @Autowired + private UserBillService userBillService; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private FrontTokenComponent tokenComponet; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private SystemUserLevelService systemUserLevelService; + + @Lazy + @Autowired + private UserLevelService userLevelService; + + @Lazy + @Autowired + private UserTagService userTagService; + + @Autowired + private UserGroupService userGroupService; + + @Lazy + @Autowired + private StoreOrderService storeOrderService; + + @Lazy + @Autowired + private UserSignService userSignService; + + @Lazy + @Autowired + private StoreCouponUserService storeCouponUserService; + + @Lazy + @Autowired + private StoreCouponService storeCouponService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Lazy + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private UserBrokerageRecordService userBrokerageRecordService; + + @Autowired + private StoreProductRelationService storeProductRelationService; + + @Autowired + private UserExperienceRecordService experienceRecordService; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + @Autowired + private SCRMUtils scrmUtils; + + @Autowired + private TenantService tenantService; + + @Autowired + private SystemAdminService systemAdminService; + @Autowired + private SmsService smsService; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private FrontTokenComponent tokenComponent; + + @Autowired + private StorePinkService storePinkService; + @Autowired + private UserRechargeService userRechargeService; + @Autowired + private UserService userService; + + + /** + * 分页显示用户表 + * + * @param request 搜索条件 + * @param pageParamRequest 分页参数 + */ + @Override + public PageInfo getList(UserSearchRequest request, PageParamRequest pageParamRequest) { + + Integer userId = SecurityUtil.getCurrentUserId(); + Long tenantId = systemAdminService.getDetail(userId).getTenantId(); + + Page pageUser = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + Map map = CollUtil.newHashMap(); + + map.put("tenant_id",tenantId); + + if(Objects.nonNull(request.getUids())){ + map.put("uids", request.getUids()); + } + + if (request.getIsPromoter() != null) { + map.put("isPromoter", request.getIsPromoter() ? 1 : 0); + } + + if (StrUtil.isNotBlank(request.getGroupId())) { + List groupIdList = YztUtil.stringToArray(request.getGroupId()); + map.put("groupIdList", groupIdList); + } + + if (!StringUtils.isBlank(request.getLabelId())) { + String tagIdSql = YztUtil.getFindInSetSql("u.tag_id", request.getLabelId()); + map.put("tagIdSql", tagIdSql); + } + + if (StrUtil.isNotBlank(request.getLevel())) { + List levelList = YztUtil.stringToArray(request.getLevel()); + map.put("levelList", levelList); + } + + if (StringUtils.isNotBlank(request.getUserType())) { + map.put("userType", request.getUserType()); + } + + if (StringUtils.isNotBlank(request.getSex())) { + lambdaQueryWrapper.eq(User::getSex, request.getSex()); + map.put("sex", Integer.valueOf(request.getSex())); + } + + if (StringUtils.isNotBlank(request.getCountry())) { + map.put("country", request.getCountry()); + // 根据省市查询 + if (StrUtil.isNotBlank(request.getCity())) { + request.setProvince(request.getProvince().replace("省", "")); + request.setCity(request.getCity().replace("市", "")); + map.put("addres", request.getProvince() + "," + request.getCity()); + } + } + + if (StrUtil.isNotBlank(request.getPayCount())) { + map.put("payCount", Integer.valueOf(request.getPayCount())); + } + + if (request.getStatus() != null) { + map.put("status", request.getStatus() ? 1 : 0); + } + + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(request.getDateLimit()); + + if (!StringUtils.isBlank(dateLimit.getStartTime())) { + map.put("startTime", dateLimit.getStartTime()); + map.put("endTime", dateLimit.getEndTime()); + map.put("accessType", request.getAccessType()); + } + if (request.getKeywords() != null) { + map.put("keywords", request.getKeywords()); + } + List userList = userMapper.findAdminList(map); + List userResponses = new ArrayList<>(); + for (User user : userList) { + UserResponse userResponse = new UserResponse(); + BeanUtils.copyProperties(user, userResponse); + // 获取分组信息 + if (!StringUtils.isBlank(user.getGroupId())) { + userResponse.setGroupName(userGroupService.getGroupNameInId(user.getGroupId())); + userResponse.setGroupId(user.getGroupId()); + } + + // 获取标签信息 + if (!StringUtils.isBlank(user.getTagId())) { + userResponse.setTagName(userTagService.getGroupNameInId(user.getTagId())); + userResponse.setTagId(user.getTagId()); + } + + //获取推广人信息 + if (null == user.getSpreadUid() || user.getSpreadUid() == 0) { + userResponse.setSpreadNickname("无"); + } else { + userResponse.setSpreadNickname(userMapper.selectById(user.getSpreadUid()).getNickname()); + } + userResponse.setPhone(YztUtil.maskMobile(userResponse.getPhone())); + userResponse.setTenantName(tenantService.getInfo(tenantId).getTenantName()); + userResponse.setTotalIncomes(userBrokerageRecordService.getCurrentUserTotalSpreadPrice(user.getUid())); + userResponse.setTotalPaidAmount(storeOrderService.getTotalPaidAmountByUid(user.getUid())); + userResponse.setTotalSalesAmount(storeOrderService.getTotalPaidAmountByUids(userService.getSpreadIdList(userId))); + userResponses.add(userResponse); + } + return CommonPage.copyPageInfo(pageUser, userResponses); + } + + public PageInfo getPromotedUserList(UserSearchRequest request, PageParamRequest pageParamRequest) { + List spreadIdList = getSpreadIdList(request.getUid()); + if (Objects.isNull(spreadIdList)||spreadIdList.isEmpty()) return new PageInfo<>(); + request.setUids(spreadIdList); + return getList(request,pageParamRequest); + } + + + /** + * 操作积分、余额 + */ + @Override + public Boolean updateIntegralMoney(UserOperateIntegralMoneyRequest request) { + if (ObjectUtil.isNull(request.getMoneyValue()) || ObjectUtil.isNull(request.getIntegralValue())) { + throw new YztException("至少输入一个金额"); + } + if (request.getMoneyValue().compareTo(BigDecimal.ZERO) < 1 && request.getIntegralValue() <= 0) { + throw new YztException("修改值不能小于等于0"); + } + + User user = getById(request.getUid()); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户不存在"); + } + // 减少时要判断小于0的情况,添加时判断是否超过数据限制 + if (request.getMoneyType().equals(2) && request.getMoneyValue().compareTo(BigDecimal.ZERO) != 0) { + if (user.getNowMoney().subtract(request.getMoneyValue()).compareTo(BigDecimal.ZERO) < 0) { + throw new YztException("余额扣减后不能小于0"); + } + } + if (request.getMoneyType().equals(1) && request.getMoneyValue().compareTo(BigDecimal.ZERO) != 0) { + if (user.getNowMoney().add(request.getMoneyValue()).compareTo(new BigDecimal("99999999.99")) > 0) { + throw new YztException("余额添加后后不能大于99999999.99"); + } + } + + if (request.getIntegralType().equals(2) && request.getIntegralValue() != 0) { + // user.getIntegral() 为 BigDecimal,使用 compareTo 进行比较 + if (user.getIntegral().compareTo(java.math.BigDecimal.valueOf(request.getIntegralValue())) < 0) { + throw new YztException("积分扣减后不能小于0"); + } + } + if (request.getIntegralType().equals(1) && request.getIntegralValue() != 0) { + // 检查添加后是否超过上限(使用 BigDecimal 运算) + if (user.getIntegral().add(java.math.BigDecimal.valueOf(request.getIntegralValue())).compareTo(new java.math.BigDecimal("99999999")) > 0) { + throw new YztException("积分添加后不能大于99999999"); + } + } + + Boolean execute = transactionTemplate.execute(e -> { + // 处理余额 + if (request.getMoneyValue().compareTo(BigDecimal.ZERO) > 0) { + // 生成UserBill + UserBill userBill = new UserBill(); + userBill.setUid(user.getUid()); + userBill.setLinkId("0"); + userBill.setTitle("后台操作"); + userBill.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + userBill.setNumber(request.getMoneyValue()); + userBill.setStatus(1); + userBill.setCreateTime(YztDateUtil.nowDateTime()); + + if (request.getMoneyType() == 1) {// 增加 + userBill.setPm(1); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_SYSTEM_ADD); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_ADD); + userBill.setBalance(user.getNowMoney().add(request.getMoneyValue())); + userBill.setMark(StrUtil.format("后台操作增加了{}余额", request.getMoneyValue())); + + userBillService.save(userBill); + operationNowMoney(user.getUid(), request.getMoneyValue(), user.getNowMoney(), "add"); + } else { + userBill.setPm(0); + userBill.setLinkType(Constants.USER_BILL_LINK_TYPE_SYSTEM_SUB); + userBill.setType(Constants.USER_BILL_TYPE_SYSTEM_SUB); + userBill.setBalance(user.getNowMoney().subtract(request.getMoneyValue())); + userBill.setMark(StrUtil.format("后台操作减少了{}余额", request.getMoneyValue())); + + userBillService.save(userBill); + operationNowMoney(user.getUid(), request.getMoneyValue(), user.getNowMoney(), "sub"); + } + } + + // 处理积分 + if (request.getIntegralValue() > 0) { + // 生成记录 + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(user.getUid()); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_SYSTEM); + integralRecord.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_SYSTEM); + integralRecord.setIntegral(java.math.BigDecimal.valueOf(request.getIntegralValue())); + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + if (request.getIntegralType() == 1) {// 增加 + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + integralRecord.setBalance(user.getIntegral().add(java.math.BigDecimal.valueOf(request.getIntegralValue()))); + integralRecord.setMark(StrUtil.format("后台操作增加了{}积分", request.getIntegralValue())); + + operationIntegral(user.getUid(), java.math.BigDecimal.valueOf(request.getIntegralValue()), user.getIntegral(), "add"); + } else { + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_SUB); + integralRecord.setBalance(user.getIntegral().subtract(java.math.BigDecimal.valueOf(request.getIntegralValue()))); + integralRecord.setMark(StrUtil.format("后台操作减少了{}积分", request.getIntegralValue())); + operationIntegral(user.getUid(), java.math.BigDecimal.valueOf(request.getIntegralValue()), user.getIntegral(), "sub"); + } + userIntegralRecordService.save(integralRecord); + } + return Boolean.TRUE; + }); + + if (!execute) { + throw new YztException("修改积分/余额失败"); + } + return execute; + } + + /** + * 更新用户金额 + * + * @param user 用户 + * @param price 金额 + * @param type 增加add、扣减sub + * @return 更新后的用户对象 + */ + @Override + public Boolean updateNowMoney(User user, BigDecimal price, String type) { + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + if (type.equals("add")) { + lambdaUpdateWrapper.set(User::getNowMoney, user.getNowMoney().add(price)); + } else { + lambdaUpdateWrapper.set(User::getNowMoney, user.getNowMoney().subtract(price)); + } + lambdaUpdateWrapper.eq(User::getUid, user.getUid()); + if (type.equals("sub")) { + lambdaUpdateWrapper.apply(StrUtil.format(" now_money - {} >= 0", price)); + } + return update(lambdaUpdateWrapper); + } + + /** + * 会员分组 + * + * @param id String id + * @param groupIdValue Integer 分组Id + */ + @Override + public Boolean group(String id, String groupIdValue) { + if (StrUtil.isBlank(id)) throw new YztException("会员编号不能为空"); + if (StrUtil.isBlank(groupIdValue)) throw new YztException("分组id不能为空"); + + //循环id处理 + List idList = YztUtil.stringToArray(id); + idList = idList.stream().distinct().collect(Collectors.toList()); + List list = getListInUid(idList); + if (CollUtil.isEmpty(list)) throw new YztException("没有找到用户信息"); + if (list.size() < idList.size()) { + throw new YztException("没有找到用户信息"); + } + for (User user : list) { + user.setGroupId(groupIdValue); + user.setUpdateTime(DateUtil.date()); + } + return updateBatchById(list); + } + + /** + * 用户id in list + * + * @param uidList List id + */ + private List getListInUid(List uidList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(User::getUid, uidList); + return userMapper.selectList(lambdaQueryWrapper); + } + + /** + * 忘记密码 + * + * @param request PasswordRequest 密码 + * @return boolean + */ + @Override + public Boolean password(PasswordRequest request) { + //检测验证码 + checkValidateCode(request.getPhone(), request.getValidateCode()); + + //校验密码是否相同 + if(!request.getPassword().equals(request.getRepeatPassword())){ + throw new YztException("两次密码输入不一致!"); + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(User::getAccount, request.getPhone()); + User user = userMapper.selectOne(lambdaQueryWrapper); + + if(user.getPwd().equals(YztUtil.encryptPassword(request.getPassword(), user.getAccount()))){ + throw new YztException("原密码和当前密码相同!"); + } + //密码 + user.setPwd(YztUtil.encryptPassword(request.getPassword(), user.getAccount())); + + return update(user, lambdaQueryWrapper); + } + + /** + * 修改登录密码 + * @param request PasswordRequest 密码 + * @return boolean + */ + public Boolean updateLoginPassword(UserPasswordRequest request) { + User user = getInfo(); + + //检测验证码 + checkValidateCode(user.getPhone(), request.getValidateCode()); + + //校验密码是否相同 + if(!request.getPassword().equals(request.getRepeatPassword())){ + throw new YztException("两次密码输入不一致!"); + } + //密码 + user.setPwd(YztUtil.encryptPassword(request.getPassword(), user.getAccount())); + return updateById(user); + } + + @Override + public Boolean updateTradePassword(UserTradePasswordRequest request) { + User user = getInfo(); + + checkValidateCode(user.getPhone(), request.getValidateCode()); + + user.setTradePassword(YztUtil.encryptPassword(request.getTradePassword(), user.getAccount())); + + return updateById(user); + } + + /** + * 获取个人资料 + * + * @return User + */ + @Override + public User getInfo() { + if (getUserId() == 0) { + return null; + } + return getById(getUserId()); + } + + /** + * 获取个人资料 + * + * @return User + */ + @Override + public User getInfoException() { + User user = getInfo(); + if (user == null) { + throw new YztException("用户信息不存在!"); + } + + if (!user.getStatus()) { + throw new YztException("用户已经被禁用!"); + } + return user; + } + + /** + * 获取当前用户id + * + * @return Integer + */ + @Override + public Integer getUserIdException() { + Integer id = tokenComponet.getUserId(); + if (null == id) { + throw new YztException("登录信息已过期,请重新登录!"); + } + return id; + } + + /** + * 获取当前用户id + * + * @return Integer + */ + @Override + public Integer getUserId() { + Integer id = tokenComponet.getUserId(); + if (null == id) { + return 0; + } + return id; + } + + + /** + * 按开始结束时间查询每日新增用户数量 + * + * @param date String 时间范围 + * @return HashMap + */ + @Override + public Map getAddUserCountGroupDate(String date) { + Map map = new HashMap<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("count(uid) as uid", "left(create_time, 10) as create_time"); + if (StringUtils.isNotBlank(date)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(date); + queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + queryWrapper.groupBy("left(create_time, 10)").orderByAsc("create_time"); + List list = userMapper.selectList(queryWrapper); + if (list.size() < 1) { + return map; + } + + for (User user : list) { + map.put(YztDateUtil.dateToStr(user.getCreateTime(), Constants.DATE_FORMAT_DATE), user.getUid()); + } + return map; + } + + /** + * 换绑手机号校验 + */ + @Override + public Boolean updatePhoneVerify(UserBindingPhoneUpdateRequest request) { + //检测验证码 + checkValidateCode(request.getPhone(), request.getCaptcha()); + + //删除验证码 + redisUtil.delete(getValidateCodeRedisKey(request.getPhone())); + + User user = getInfoException(); + + if (!user.getPhone().equals(request.getPhone())) { + throw new YztException("手机号不是当前用户手机号"); + } + + return Boolean.TRUE; + } + + /** + * 换绑手机号 + */ + @Override + public Boolean updatePhone(UserBindingPhoneUpdateRequest request) { + //检测验证码 + checkValidateCode(request.getPhone(), request.getCaptcha()); + + //删除验证码 + redisUtil.delete(getValidateCodeRedisKey(request.getPhone())); + + //检测当前手机号是否已经是账号 + User user = getByPhone(request.getPhone()); + if (null != user) { + throw new YztException("此手机号码已被注册"); + } + + //查询手机号信息 + User bindUser = getInfoException(); + bindUser.setAccount(request.getPhone()); + bindUser.setPhone(request.getPhone()); + bindUser.setUpdateTime(DateUtil.date()); + return updateById(bindUser); + } + + /** + * 用户中心 + * @return UserCenterResponse + */ + @Override + public UserCenterResponse getUserCenter() { + User currentUser = getInfo(); + if (ObjectUtil.isNull(currentUser)) { + throw new YztException("您的登录已过期,请先登录"); + } + UserCenterResponse userCenterResponse = new UserCenterResponse(); + BeanUtils.copyProperties(currentUser, userCenterResponse); + // 优惠券数量 + userCenterResponse.setCouponCount(storeCouponUserService.getUseCount(currentUser.getUid())); + // 收藏数量 + userCenterResponse.setCollectCount(storeProductRelationService.getCollectCountByUid(currentUser.getUid())); + + userCenterResponse.setVip(false); + if (userCenterResponse.getLevel() > 0) { + SystemUserLevel systemUserLevel = systemUserLevelService.getByLevelId(currentUser.getLevel()); + if (ObjectUtil.isNotNull(systemUserLevel)) { + userCenterResponse.setVip(true); + userCenterResponse.setVipIcon(systemUserLevel.getIcon()); + userCenterResponse.setVipName(systemUserLevel.getName()); + } + } + // 充值开关 + String rechargeSwitch = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_RECHARGE_SWITCH); + if (StrUtil.isNotBlank(rechargeSwitch)) { + userCenterResponse.setRechargeSwitch(Boolean.valueOf(rechargeSwitch)); + } + + // 判断是否展示我的推广,1.分销模式是否开启 + String funcStatus = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_BROKERAGE_FUNC_STATUS); + if (!funcStatus.equals("1")) { + userCenterResponse.setIsPromoter(false); + } + + userCenterResponse.setTenantName(tenantService.getInfo(currentUser.getTenantId()).getTenantName()); + userCenterResponse.setUid(currentUser.getUid()); + userCenterResponse.setOrgName(currentUser.getOrgName()); + + // 保存用户访问记录 + UserVisitRecord visitRecord = new UserVisitRecord(); + visitRecord.setDate(DateUtil.date().toString("yyyy-MM-dd")); + visitRecord.setUid(getUserId()); + visitRecord.setVisitType(4); + userVisitRecordService.save(visitRecord); + + return userCenterResponse; + } + + /** + * 根据用户id获取用户列表 map模式 + * + * @return HashMap + */ + @Override + public HashMap getMapListInUid(List uidList) { + List userList = getListInUid(uidList); + return getMapByList(userList); + } + + /** + * 根据用户id获取用户列表 map模式 + * + * @return HashMap + */ + private HashMap getMapByList(List list) { + HashMap map = new HashMap<>(); + if (null == list || list.size() < 1) { + return map; + } + + for (User user : list) { + map.put(user.getUid(), user); + } + + return map; + } + + /** + * 重置连续签到天数 + * + * @param userId Integer 用户id + */ + @Override + public void repeatSignNum(Integer userId) { + User user = new User(); + user.setUid(userId); + user.setSignNum(0); + user.setUpdateTime(DateUtil.date()); + updateById(user); + } + + /** + * 会员标签 + * + * @param id String id + * @param tagIdValue Integer 标签Id + */ + @Override + public Boolean tag(String id, String tagIdValue) { + if (StrUtil.isBlank(id)) throw new YztException("会员编号不能为空"); + if (StrUtil.isBlank(tagIdValue)) throw new YztException("标签id不能为空"); + + //循环id处理 + List idList = YztUtil.stringToArray(id); + idList = idList.stream().distinct().collect(Collectors.toList()); + List list = getListInUid(idList); + if (CollUtil.isEmpty(list)) throw new YztException("没有找到用户信息"); + if (list.size() < 1) { + throw new YztException("没有找到用户信息"); + } + for (User user : list) { + user.setTagId(tagIdValue); + user.setUpdateTime(DateUtil.date()); + } + return updateBatchById(list); + } + + /** + * 根据用户id获取自己本身的推广用户 + * + * @param userIdList List 用户id集合 + * @return List + */ + @Override + public List getSpreadPeopleIdList(List userIdList) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(User::getUid); //查询用户id + lambdaQueryWrapper.in(User::getSpreadUid, userIdList); //xx的下线集合 + List list = userMapper.selectList(lambdaQueryWrapper); + + if (null == list || list.size() < 1) { + return new ArrayList<>(); + } + return list.stream().map(User::getUid).distinct().collect(Collectors.toList()); + } + + /** + * 根据用户id获取自己本身的下一级推广用户 + * + * @param uid List 用户id集合 + * @return List + */ + @Override + public List getSpreadIdList(Integer uid) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(User::getUid); //查询用户id + lambdaQueryWrapper.eq(User::getSpreadUid, uid); //xx的下线集合 + List list = userMapper.selectList(lambdaQueryWrapper); + + if (null == list || list.size() < 1) { + return new ArrayList<>(); + } + return list.stream().map(User::getUid).distinct().collect(Collectors.toList()); + } + + /** + * 根据用户id获取自己本身的推广用户 + */ + @Override + public List getSpreadPeopleList( + List userIdList, String keywords, String sortKey, String isAsc, PageParamRequest pageParamRequest) { + + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + Map map = new HashMap<>(); + map.put("userIdList", userIdList.stream().distinct().collect(Collectors.toList())); + if (StringUtils.isNotBlank(keywords)) { + map.put("keywords", "%" + keywords + "%"); + } + map.put("sortKey", "create_time"); + if (StringUtils.isNotBlank(sortKey)) { + map.put("sortKey", sortKey); + } + map.put("sortValue", Constants.SORT_DESC); + if (isAsc.toLowerCase().equals(Constants.SORT_ASC)) { + map.put("sortValue", Constants.SORT_ASC); + } + + List spreadPeopleList = userMapper.getSpreadPeopleList(map); + + // 2. 获取所有等级(全量) + List allLevels = systemUserLevelService.getList(); + + // 3. 构建全量映射:levelId → levelName + Map levelNameMap = allLevels.stream() + .collect(Collectors.toMap( + SystemUserLevel::getId, // 对应 @TableId("id") + SystemUserLevel::getName, + (v1, v2) -> v1 // 防止重复 key + )); + + // 4. 遍历赋值 + for (UserSpreadPeopleItemResponse item : spreadPeopleList) { + Integer levelId = item.getLevel(); + if (levelId != null) { + item.setLevelName(levelNameMap.get(levelId)); + } + item.setTotalIncomes(userBrokerageRecordService.getCurrentUserTotalSpreadPrice(item.getUid())); + item.setTodayIncomes(userBrokerageRecordService.getTodayIncomes(item.getUid())); + } + return spreadPeopleList; + } + + /** + * 检测手机验证码 + */ + private void checkValidateCode(String phone, String value) { + Object validateCode = redisUtil.get(getValidateCodeRedisKey(phone)); + if (validateCode == null) { + throw new YztException("验证码已过期"); + } + + if (!validateCode.toString().equals(value)) { + throw new YztException("验证码错误"); + } + } + + /** + * 检测手机验证码key + * + * @param phone String 手机号 + * @return String + */ + @Override + public String getValidateCodeRedisKey(String phone) { + return SmsConstants.SMS_VALIDATE_PHONE + phone; + } + + /** + * 手机号注册用户 + * + * @param phone 手机号 + * @param spreadUid 推广人编号 + * @return User + */ + @Override + public User registerPhone(String phone, Integer spreadUid) { + User user = new User(); + user.setAccount(phone); + user.setPwd(CommonUtil.createPwd(phone)); + user.setPhone(phone); + user.setUserType(Constants.USER_LOGIN_TYPE_H5); + user.setNickname(CommonUtil.createNickName(phone)); + user.setAvatar(systemConfigService.getValueByKey(Constants.USER_DEFAULT_AVATAR_CONFIG_KEY)); + Date nowDate = YztDateUtil.nowDateTime(); + user.setCreateTime(nowDate); + user.setLastLoginTime(nowDate); + + // 推广人 + user.setSpreadUid(0); + Boolean check = checkBingSpread(user, spreadUid, "new"); + if (check) { + user.setSpreadUid(spreadUid); + user.setSpreadTime(nowDate); + } + + // 查询是否有新人注册赠送优惠券 + List couponUserList = CollUtil.newArrayList(); + List couponList = storeCouponService.findRegisterList(); + if (CollUtil.isNotEmpty(couponList)) { + couponList.forEach(storeCoupon -> { + //是否有固定的使用时间 + if (!storeCoupon.getIsFixedTime()) { + String endTime = YztDateUtil.addDay(YztDateUtil.nowDate(Constants.DATE_FORMAT), storeCoupon.getDay(), Constants.DATE_FORMAT); + storeCoupon.setUseEndTime(YztDateUtil.strToDate(endTime, Constants.DATE_FORMAT)); + storeCoupon.setUseStartTime(YztDateUtil.nowDateTimeReturnDate(Constants.DATE_FORMAT)); + } + + StoreCouponUser storeCouponUser = new StoreCouponUser(); + storeCouponUser.setCouponId(storeCoupon.getId()); + storeCouponUser.setName(storeCoupon.getName()); + storeCouponUser.setMoney(storeCoupon.getMoney()); + storeCouponUser.setMinPrice(storeCoupon.getMinPrice()); + storeCouponUser.setStartTime(storeCoupon.getUseStartTime()); + storeCouponUser.setEndTime(storeCoupon.getUseEndTime()); + storeCouponUser.setUseType(storeCoupon.getUseType()); + storeCouponUser.setType(CouponConstants.STORE_COUPON_USER_TYPE_REGISTER); + if (storeCoupon.getUseType() > 1) { + storeCouponUser.setPrimaryKey(storeCoupon.getPrimaryKey()); + } + couponUserList.add(storeCouponUser); + }); + } + + Boolean execute = transactionTemplate.execute(e -> { + save(user); + // 推广人处理 + if (check) { + updateSpreadCountByUid(spreadUid, "add"); + } + // 赠送客户优惠券 + if (CollUtil.isNotEmpty(couponUserList)) { + couponUserList.forEach(couponUser -> couponUser.setUid(user.getUid())); + storeCouponUserService.saveBatch(couponUserList); + couponList.forEach(coupon -> storeCouponService.deduction(coupon.getId(), 1, coupon.getIsLimited())); + } + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("创建用户失败!"); + } + return user; + } + + /** + * 更新推广员推广数 + * + * @param uid uid + * @param type add or sub + */ + public Boolean updateSpreadCountByUid(Integer uid, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql("spread_count = spread_count + 1"); + } else { + updateWrapper.setSql("spread_count = spread_count - 1"); + } + updateWrapper.eq("uid", uid); + return update(updateWrapper); + } + + /** + * 添加/扣减佣金 + * + * @param uid 用户id + * @param price 金额 + * @param brokeragePrice 历史金额 + * @param type 类型:add—添加,sub—扣减 + * @return Boolean + */ + @Override + public Boolean operationBrokerage(Integer uid, BigDecimal price, BigDecimal brokeragePrice, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("brokerage_price = brokerage_price + {}", price)); + } else { + updateWrapper.setSql(StrUtil.format("brokerage_price = brokerage_price - {}", price)); + updateWrapper.last(StrUtil.format(" and (brokerage_price - {} >= 0)", price)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("brokerage_price", brokeragePrice); + return update(updateWrapper); + } + + /** + * 添加/扣减余额 + * + * @param uid 用户id + * @param price 金额 + * @param nowMoney 历史金额 + * @param type 类型:add—添加,sub—扣减 + */ + @Override + public Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal nowMoney, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("now_money = now_money + {}", price)); + } else { + updateWrapper.setSql(StrUtil.format("now_money = now_money - {}", price)); + updateWrapper.last(StrUtil.format(" and (now_money - {} >= 0)", price)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("now_money", nowMoney); + return update(updateWrapper); + } + + /** + * 添加/扣减积分 + * + * @param uid 用户id + * @param integral 积分 + * @param nowIntegral 历史积分 + * @param type 类型:add—添加,sub—扣减 + * @return Boolean + */ + @Override + public Boolean operationIntegral(Integer uid, java.math.BigDecimal integral, java.math.BigDecimal nowIntegral, String type) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + if (type.equals("add")) { + updateWrapper.setSql(StrUtil.format("integral = integral + {}", integral)); + } else { + updateWrapper.setSql(StrUtil.format("integral = integral - {}", integral)); + updateWrapper.last(StrUtil.format(" and (integral - {} >= 0)", integral)); + } + updateWrapper.eq("uid", uid); + updateWrapper.eq("integral", nowIntegral); + return update(updateWrapper); + } + + /** + * PC后台分销员列表 + * + * @param keywords 搜索参数 + * @param dateLimit 时间参数 + * @param pageRequest 分页参数 + * @return PageInfo + */ + @Override + public PageInfo getAdminSpreadPeopleList(String keywords, String dateLimit, PageParamRequest pageRequest) { + Page pageUser = PageHelper.startPage(pageRequest.getPage(), pageRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + // id,头像,昵称,姓名,电话,推广用户数,推广订单数,推广订单额,佣金总金额,已提现金额,提现次数,未提现金额,上级推广人 + lqw.select(User::getUid, User::getNickname, User::getRealName, User::getPhone, User::getAvatar, + User::getSpreadCount, User::getBrokeragePrice, User::getSpreadUid, User::getPromoterTime); + lqw.eq(User::getIsPromoter, true); + if (StrUtil.isNotBlank(keywords)) { + lqw.and(i -> i.eq(User::getUid, keywords) //用户账号 + .or().like(User::getNickname, keywords) //昵称 + .or().like(User::getPhone, keywords)); //手机号码 + } + if (StrUtil.isNotBlank(dateLimit)) { + DateLimitUtilVo dateLimitUtilVo = YztDateUtil.getDateLimit(dateLimit); + lqw.between(User::getPromoterTime, dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime()); + } + lqw.orderByDesc(User::getUid); + List userList = userMapper.selectList(lqw); + return CommonPage.copyPageInfo(pageUser, userList); + } + + /** + * 检测能否绑定关系 + * + * @param user 当前用户 + * @param spreadUid 推广员Uid + * @param type 用户类型:new-新用户,old—老用户 + * @return Boolean + * 1.判断分销功能是否启用 + * 2.判断分销模式 + * 3.根据不同的分销模式校验 + * 4.指定分销,只有分销员才可以分销,需要spreadUid是推广员才可以绑定 + * 5.人人分销,可以直接绑定 + * *推广关系绑定,下级不能绑定自己的上级为下级,A->B->A(❌) + */ + public Boolean checkBingSpread(User user, Integer spreadUid, String type) { + if (ObjectUtil.isNull(spreadUid)) { + return false; + } + if (spreadUid <= 0 || user.getSpreadUid() > 0) { + return false; + } + if (ObjectUtil.isNotNull(user.getUid()) && user.getUid().equals(spreadUid)) { + return false; + } + // 判断分销功能是否启用 + String isOpen = systemConfigService.getValueByKey(Constants.CONFIG_KEY_STORE_BROKERAGE_IS_OPEN); + if (StrUtil.isBlank(isOpen) || isOpen.equals("0")) { + return false; + } + if (type.equals("old")) { + // 判断分销关系绑定类型(所有、新用户) + String bindType = systemConfigService.getValueByKey(Constants.CONFIG_KEY_DISTRIBUTION_TYPE); + if (StrUtil.isBlank(bindType) || bindType.equals("1")) { + return false; + } + if (user.getSpreadUid().equals(spreadUid)) { + return false; + } + } + // 查询推广员 + User spreadUser = getById(spreadUid); + if (ObjectUtil.isNull(spreadUser) || !spreadUser.getStatus()) { + return false; + } + // 指定分销不是推广员不绑定 + if (!spreadUser.getIsPromoter()) { + return false; + } + // 下级不能绑定自己的上级为自己的下级 + if (ObjectUtil.isNotNull(user.getUid()) && spreadUser.getSpreadUid().equals(user.getUid())) { + return false; + } + return true; + } + + /** + * 获取用户好友关系,spread_uid往下两级的用户信息 + * + * @return List + */ + private List getUserRelation(Integer userId) { + List userList = new ArrayList<>(); + User currUser = userMapper.selectById(userId); + if (currUser.getSpreadUid() > 0) { + User spUser1 = userMapper.selectById(currUser.getSpreadUid()); + if (null != spUser1) { + userList.add(spUser1); + if (spUser1.getSpreadUid() > 0) { + User spUser2 = userMapper.selectById(spUser1.getSpreadUid()); + if (null != spUser2) { + userList.add(spUser2); + } + } + } + } + return userList; + } + + /** + * 根据条件获取会员对应信息列表 + * + * @param userId 用户id + * @param type 0=消费记录,1=积分明细,2=签到记录,3=持有优惠券,4=余额变动,5=好友关系 + * @param pageParamRequest 分页参数 + * @return Object + */ + @Override + public Object getInfoByCondition(Integer userId, Integer type, PageParamRequest pageParamRequest) { + switch (type) { + case 0: + return storeOrderService.findPaidListByUid(userId, pageParamRequest); + case 1: + AdminIntegralSearchRequest fmsq = new AdminIntegralSearchRequest(); + fmsq.setUid(userId); + return userIntegralRecordService.findAdminList(fmsq, pageParamRequest); + case 2: + UserSign userSign = new UserSign(); + userSign.setUid(userId); + return userSignService.getListByCondition(userSign, pageParamRequest); + case 3: + StoreCouponUserSearchRequest scur = new StoreCouponUserSearchRequest(); + scur.setUid(userId); + return storeCouponUserService.findListByUid(userId, pageParamRequest); + case 4: + FundsMonitorSearchRequest fmsqq = new FundsMonitorSearchRequest(); + fmsqq.setUid(userId); + fmsqq.setCategory(Constants.USER_BILL_CATEGORY_MONEY); + return userBillService.getList(fmsqq, pageParamRequest); + case 5: + return getUserRelation(userId); + case 6: + List users = getSpreadListBySpreadId(userId); + List userSpreadPeopleItemResponseList = new ArrayList<>(); + for (User user : users){ + UserSpreadPeopleItemResponse userSpreadPeopleItemResponse = new UserSpreadPeopleItemResponse(); + BeanUtils.copyProperties(user,userSpreadPeopleItemResponse); + userSpreadPeopleItemResponse.setTotalIncomes(storeOrderService.getTotalPaidAmountByUid(user.getUid())); + userSpreadPeopleItemResponse.setTotalSalesAmount(storeOrderService.getTotalPaidAmountByUids(userService.getSpreadIdList(user.getUid()))); + userSpreadPeopleItemResponseList.add(userSpreadPeopleItemResponse); + } + return userSpreadPeopleItemResponseList; + } + + return new ArrayList<>(); + } + + + + /** + * 会员详情顶部数据 + * + * @param userId Integer 用户id + * @return Object + */ + @Override + public TopDetail getTopDetail(Integer userId) { + TopDetail topDetail = new TopDetail(); + User currentUser = userMapper.selectById(userId); + topDetail.setUser(currentUser); + topDetail.setBalance(currentUser.getNowMoney()); + topDetail.setIntegralCount(currentUser.getIntegral()); + topDetail.setMothConsumeCount(storeOrderService.getSumPayPriceByUidAndDate(userId, Constants.SEARCH_DATE_MONTH)); + topDetail.setAllConsumeCount(storeOrderService.getSumPayPriceByUid(userId)); + topDetail.setMothOrderCount(storeOrderService.getOrderCountByUidAndDate(userId, Constants.SEARCH_DATE_MONTH)); + topDetail.setAllOrderCount(storeOrderService.getOrderCountByUid(userId)); + return topDetail; + } + + /** + * 通过微信信息注册用户 + * + * @param thirdUserRequest RegisterThirdUser 三方用户登录注册信息 + * @return User + */ + @Override + public User registerByThird(RegisterThirdUserRequest thirdUserRequest) { + User user = new User(); + user.setAccount(DigestUtils.md5Hex(YztUtil.getUuid() + YztDateUtil.getNowTime())); + user.setUserType(thirdUserRequest.getType()); + user.setNickname(thirdUserRequest.getNickName()); + String avatar = ""; + switch (thirdUserRequest.getType()) { + case Constants.USER_LOGIN_TYPE_PUBLIC: + avatar = StrUtil.isBlank(thirdUserRequest.getHeadimgurl()) ? "" : thirdUserRequest.getHeadimgurl(); + break; + case Constants.USER_LOGIN_TYPE_PROGRAM: + case Constants.USER_LOGIN_TYPE_H5: + case Constants.USER_LOGIN_TYPE_IOS_WX: + case Constants.USER_LOGIN_TYPE_ANDROID_WX: + avatar = StrUtil.isBlank(thirdUserRequest.getAvatar()) ? "" : thirdUserRequest.getAvatar(); + break; + } + user.setAvatar(avatar); + user.setSpreadTime(YztDateUtil.nowDateTime()); + // 因微信原因,无法再获取用户的隐私信息 + // 预设用户性别为0-未知,地址为空字符串 +// user.setSex(Integer.parseInt(thirdUserRequest.getSex())); +// user.setAddres(thirdUserRequest.getCountry() + "," + thirdUserRequest.getProvince() + "," + thirdUserRequest.getCity()); + user.setSex(0); + user.setAddres(""); + return user; + } + + /** + * 根据推广级别和其他参数当前用户下的推广列表 + * + * @param request 推广列表参数 + * @return 当前用户的推广人列表 + */ + @Override + public PageInfo getUserListBySpreadLevel(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + if (request.getType().equals(1)) {// 一级推广人 + return getFirstSpreadUserListPage(request, pageParamRequest); + } + if (request.getType().equals(2)) {// 二级推广人 + return getSecondSpreadUserListPage(request, pageParamRequest); + } + return getAllSpreadUserListPage(request, pageParamRequest); + } + + // 分页获取一级推广员 + private PageInfo getFirstSpreadUserListPage(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); + queryWrapper.eq(User::getSpreadUid, request.getUid()); + if (StrUtil.isNotBlank(request.getNickName())) { + queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) + .or().eq(User::getPhone, request.getNickName())); + } + List userList = userMapper.selectList(queryWrapper); + return CommonPage.copyPageInfo(userPage, userList); + } + + // 分页获取二级推广员 + private PageInfo getSecondSpreadUserListPage(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + // 先获取一级推广员 + List firstUserList = getSpreadListBySpreadIdAndType(request.getUid(), 1); + if (CollUtil.isEmpty(firstUserList)) { + return new PageInfo<>(CollUtil.newArrayList()); + } + List userIds = firstUserList.stream().map(User::getUid).distinct().collect(Collectors.toList()); + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); + queryWrapper.in(User::getSpreadUid, userIds); + if (StrUtil.isNotBlank(request.getNickName())) { + queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) + .or().eq(User::getPhone, request.getNickName())); + } + List userList = userMapper.selectList(queryWrapper); + return CommonPage.copyPageInfo(userPage, userList); + } + + // 分页获取所有推广员 + private PageInfo getAllSpreadUserListPage(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + // 先所有一级推广员 + List firstUserList = getSpreadListBySpreadIdAndType(request.getUid(), 0); + if (CollUtil.isEmpty(firstUserList)) { + return new PageInfo<>(CollUtil.newArrayList()); + } + List userIds = firstUserList.stream().map(User::getUid).distinct().collect(Collectors.toList()); + Page userPage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(User::getUid, User::getAvatar, User::getNickname, User::getIsPromoter, User::getSpreadCount, User::getPayCount); + queryWrapper.in(User::getUid, userIds); + if (StrUtil.isNotBlank(request.getNickName())) { + queryWrapper.and(e -> e.like(User::getNickname, request.getNickName()).or().eq(User::getUid, request.getNickName()) + .or().eq(User::getPhone, request.getNickName())); + } + List userList = userMapper.selectList(queryWrapper); + return CommonPage.copyPageInfo(userPage, userList); + } + + /** + * 根据推广级别和其他参数获取推广列表 + * + * @param request 推广层级和推广时间参数 + * @return 推广订单列表 + */ + @Override + public PageInfo getOrderListBySpreadLevel(RetailShopStairUserRequest request, PageParamRequest pageParamRequest) { + // 获取推广人列表 + if (ObjectUtil.isNull(request.getType())) { + request.setType(0); + } + PageInfo recordPageInfo = userBrokerageRecordService.findAdminSpreadListByUid(request, pageParamRequest); + List responseList = recordPageInfo.getList().stream().map(e -> { + SpreadOrderResponse response = new SpreadOrderResponse(); + StoreOrder storeOrder = storeOrderService.getByOderId(e.getLinkId()); + response.setId(storeOrder.getId()); + response.setOrderId(storeOrder.getOrderId()); + response.setRealName(storeOrder.getRealName()); + response.setUserPhone(storeOrder.getUserPhone()); + response.setPrice(e.getPrice()); + response.setUpdateTime(e.getUpdateTime()); + return response; + }).collect(Collectors.toList()); + + return CommonPage.copyPageInfo(recordPageInfo, responseList); + } + + /** + * 获取推广人列表 + * + * @param spreadUid 父Uid + * @param type 类型 0 = 全部 1=一级推广人 2=二级推广人 + */ + private List getSpreadListBySpreadIdAndType(Integer spreadUid, Integer type) { + // 获取一级推广人 + List userList = getSpreadListBySpreadId(spreadUid); + if (CollUtil.isEmpty(userList)) return userList; + if (type.equals(1)) return userList; + // 获取二级推广人 + List userSecondList = CollUtil.newArrayList(); + userList.forEach(user -> { + List childUserList = getSpreadListBySpreadId(user.getUid()); + if (CollUtil.isNotEmpty(childUserList)) { + userSecondList.addAll(childUserList); + } + }); + if (type.equals(2)) { + return userSecondList; + } + userList.addAll(userSecondList); + return userList; + } + + /** + * 获取推广人列表 + * + * @param spreadUid 父Uid + */ + private List getSpreadListBySpreadId(Integer spreadUid) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getSpreadUid, spreadUid); + return userMapper.selectList(queryWrapper); + } + + /** + * 根据用户id清除用户当前推广人 + * + * @param userId 当前推广人id + * @return 清除推广结果 + */ + @Override + public boolean clearSpread(Integer userId) { + User teamUser = getById(userId); + User user = new User(); + user.setUid(userId); + user.setPath("/0/"); + user.setSpreadUid(0); + user.setSpreadTime(null); + Boolean execute = transactionTemplate.execute(e -> { + user.setUpdateTime(DateUtil.date()); + userMapper.updateById(user); + if (teamUser.getSpreadUid() > 0) { + updateSpreadCountByUid(teamUser.getSpreadUid(), "sub"); + } + return Boolean.TRUE; + }); + return execute; + } + + /** + * 推广人排行 + * + * @param type String 类型 + * @param pageParamRequest PageParamRequest 分页 + * @return List + */ + @Override + public List getTopSpreadPeopleListByDate(String type, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("count(spread_count) as spread_count, spread_uid") + .gt("spread_uid", 0) + .eq("status", true); + if (StrUtil.isNotBlank(type)) { + DateLimitUtilVo dateLimit = YztDateUtil.getDateLimit(type); + queryWrapper.between("spread_time", dateLimit.getStartTime(), dateLimit.getEndTime()); + } + queryWrapper.groupBy("spread_uid").orderByDesc("spread_count"); + List spreadVoList = userMapper.selectList(queryWrapper); + if (spreadVoList.size() < 1) { + return null; + } + + List spreadIdList = spreadVoList.stream().map(User::getSpreadUid).collect(Collectors.toList()); + if (spreadIdList.size() < 1) { + return null; + } + + ArrayList userList = new ArrayList<>(); + //查询用户 + HashMap userVoList = getMapListInUid(spreadIdList); + + //解决排序问题 + for (User spreadVo : spreadVoList) { + User user = new User(); + User userVo = userVoList.get(spreadVo.getSpreadUid()); + user.setUid(spreadVo.getSpreadUid()); + user.setAvatar(userVo.getAvatar()); + user.setSpreadCount(spreadVo.getSpreadCount()); + if (StringUtils.isBlank(userVo.getNickname())) { + user.setNickname(userVo.getPhone().substring(0, 2) + "****" + userVo.getPhone().substring(7)); + } else { + user.setNickname(userVo.getNickname()); + } + userList.add(user); + } + + return userList; + } + + /** + * 推广人排行 + * + * @param minPayCount int 最小消费次数 + * @param maxPayCount int 最大消费次数 + * @return Integer + */ + @Override + public Integer getCountByPayCount(int minPayCount, int maxPayCount) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.between(User::getPayCount, minPayCount, maxPayCount); + return userMapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 绑定推广关系(登录状态) + * @param spreadUid 推广人id + */ + @Override + public void bindSpread(Integer spreadUid) { + //新用户会在注册的时候单独绑定,此处只处理登录用户 + if (ObjectUtil.isNull(spreadUid) || spreadUid == 0) { + return; + } + User user = getInfo(); + if (ObjectUtil.isNull(user)) { + throw new YztException("当前用户未登录,请先登录"); + } + + bindSpread(user, spreadUid); + } + + private Boolean bindSpread(User user, Integer spreadUid) { + + Boolean checkBingSpread = checkBingSpread(user, spreadUid, "old"); + if (!checkBingSpread) return false; + + user.setSpreadUid(spreadUid); + user.setSpreadTime(YztDateUtil.nowDateTime()); + + Boolean execute = transactionTemplate.execute(e -> { + user.setUpdateTime(DateUtil.date()); + updateById(user); + updateSpreadCountByUid(spreadUid, "add"); + return Boolean.TRUE; + }); + if (!execute) { + logger.error(StrUtil.format("绑定推广人时出错,userUid = {}, spreadUid = {}", user.getUid(), spreadUid)); + } + return execute; + + } + + /** + * 更新推广人 + * + * @param request 请求参数 + * @return Boolean + */ + @Override + public Boolean editSpread(UserUpdateSpreadRequest request) { + Integer userId = request.getUserId(); + Integer spreadUid = request.getSpreadUid(); + if (userId.equals(spreadUid)) { + throw new YztException("上级推广人不能为自己"); + } + User user = getById(userId); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户不存在"); + } + if (user.getSpreadUid().equals(spreadUid)) { + throw new YztException("当前推广人已经是所选人"); + } + Integer oldSprUid = user.getSpreadUid(); + + User spreadUser = getById(spreadUid); + if (ObjectUtil.isNull(spreadUser)) { + throw new YztException("上级用户不存在"); + } + if (spreadUser.getSpreadUid().equals(userId)) { + throw new YztException("当前用户已是推广人的上级"); + } + + User tempUser = new User(); + tempUser.setUid(userId); + tempUser.setSpreadUid(spreadUid); + tempUser.setSpreadTime(YztDateUtil.nowDateTime()); + Boolean execute = transactionTemplate.execute(e -> { + tempUser.setUpdateTime(DateUtil.date()); + updateById(tempUser); + updateSpreadCountByUid(spreadUid, "add"); + if (oldSprUid > 0) { + updateSpreadCountByUid(oldSprUid, "sub"); + } + return Boolean.TRUE; + }); + return execute; + } + + /** + * 更新用户积分 + * + * @param user 用户 + * @param integral 积分 + * @param type 增加add、扣减sub + * @return 更新后的用户对象 + */ + @Override + public Boolean updateIntegral(User user, java.math.BigDecimal integral, String type) { + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + if (type.equals("add")) { + lambdaUpdateWrapper.set(User::getIntegral, user.getIntegral().add(integral)); + } else { + lambdaUpdateWrapper.set(User::getIntegral, user.getIntegral().subtract(integral)); + } + lambdaUpdateWrapper.eq(User::getUid, user.getUid()); + if (type.equals("sub")) { + lambdaUpdateWrapper.apply(StrUtil.format(" integral - {} >= 0", integral)); + } + return update(lambdaUpdateWrapper); + } + + /** + * 清除User Group id + * + * @param groupId 待清除的GroupId + */ + @Override + public void clearGroupByGroupId(String groupId) { + LambdaUpdateWrapper upw = Wrappers.lambdaUpdate(); + upw.set(User::getGroupId, "").eq(User::getGroupId, groupId); + update(upw); + } + + /** + * 更新用户 + * + * @param userRequest 用户参数 + * @return Boolean + */ + @Override + public Boolean updateUser(UserUpdateRequest userRequest) { + User tempUser = getById(userRequest.getUid()); + User user = new User(); + BeanUtils.copyProperties(userRequest, user); + if(userRequest.getPassword().isBlank()){ + user.setPwd(tempUser.getPwd()); + } + if (userRequest.getTradePassword().isBlank()){ + user.setTradePassword(tempUser.getTradePassword()); + } + if (!tempUser.getIsPromoter() && user.getIsPromoter()) { + user.setPromoterTime(DateUtil.date()); + } + user.setUpdateTime(DateUtil.date()); + return updateById(user); + } + + @Override + public Boolean createUser(UserCreateRequest userRequest) { + if (null != userService.getByPhone(userRequest.getPhone())) { + throw new YztException("此手机号码已被注册"); + } + User user = new User(); + BeanUtils.copyProperties(userRequest, user); + if ( Objects.nonNull(user.getIsPromoter())) { + user.setPromoterTime(DateUtil.date()); + } + user.setTradePassword(YztUtil.encryptPassword(userRequest.getTradePassword(),userRequest.getPhone())); + user.setPwd(YztUtil.encryptPassword(userRequest.getPassword(),userRequest.getPhone())); + user.setUpdateTime(DateUtil.date()); + Boolean check = userService.checkBingSpread(user, userRequest.getSpreadUid(), "new"); + if (check) { + user.setSpreadUid(userRequest.getSpreadUid()); + user.setSpreadTime(DateUtil.date()); + } + Boolean execute = transactionTemplate.execute(e -> { + save(user); + // 推广人处理 + if (check) { + updateSpreadCountByUid(userRequest.getSpreadUid(), "add"); + } + return Boolean.TRUE; + }); + if (!execute) { + throw new YztException("创建用户失败!"); + } + return execute; + } + + /** + * 根据手机号查询用户 + * @param phone 用户手机号 + * @return 用户信息 + */ + @Override + public User getByPhone(String phone) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(User::getPhone, phone); + return userMapper.selectOne(lqw); + } + + @Override + public UserCenterResponse getUserCenterResponseByPhone(String phone) { + User user = getByPhone(phone); + UserCenterResponse userCenterResponse = new UserCenterResponse(); + BeanUtils.copyProperties(user,userCenterResponse); + User spreadUser = getById(user.getSpreadUid()); + userCenterResponse.setSpreadName(spreadUser.getNickname()); + userCenterResponse.setSpreadLevel(spreadUser.getLevel()); + + Map levelMap = systemUserLevelService.buildGradeToNameMap(); + userCenterResponse.setSpreadLevelName(levelMap.get(spreadUser.getLevel())); + userCenterResponse.setLevelName(levelMap.get(user.getLevel())); + return userCenterResponse; + } + + /** + * 后台修改用户手机号 + * @param id 用户uid + * @param phone 手机号 + * @return Boolean + */ + @Override + public Boolean updateUserPhone(Integer id, String phone) { + boolean matchPhone = ReUtil.isMatch(RegularConstants.PHONE_TWO, phone); + if (!matchPhone) { + throw new YztException("手机号格式错误,请输入正确的手机号"); + } + User user = getById(id); + if (ObjectUtil.isNull(user)) { + throw new YztException("对应用户不存在"); + } + if (phone.equals(user.getPhone())) { + throw new YztException("手机号与之前一致"); + } + + //检测当前手机号是否已经是账号 + User tempUser = getByPhone(phone); + if (ObjectUtil.isNotNull(tempUser)) { + throw new YztException("此手机号码已被注册"); + } + + User newUser = new User(); + newUser.setUid(id); + newUser.setPhone(phone); + newUser.setAccount(phone); + newUser.setUpdateTime(DateUtil.date()); + return userMapper.updateById(newUser) > 0; + } + + /** + * 根据昵称匹配用户,返回id集合 + * @param nikeName 需要匹配得昵称 + * @return List + */ + @Override + public List findIdListLikeName(String nikeName) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(User::getUid); + lqw.like(User::getNickname, nikeName); + List userList = userMapper.selectList(lqw); + if (CollUtil.isEmpty(userList)) { + return new ArrayList<>(); + } + return userList.stream().map(User::getUid).collect(Collectors.toList()); + } + + /** + * 清除对应的用户等级 + * @param levelId 等级id + */ + @Override + public Boolean removeLevelByLevelId(Integer levelId) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(User::getLevel, 0); + luw.eq(User::getLevel, levelId); + return update(luw); + } + + /** + * 更新用户会员等级 + * @param request request + * @return Boolean + */ + @Override + public Boolean updateUserLevel(UpdateUserLevelRequest request) { + User user = getById(request.getUid()); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户不存在"); + } + if (user.getLevel().equals(request.getLevelId())) { + throw new YztException("用户等级与修改前相同"); + } + + SystemUserLevel systemUserLevel = systemUserLevelService.getByLevelId(request.getLevelId()); + if (ObjectUtil.isNull(systemUserLevel)) { + throw new YztException("系统会员等级不存在,请先配置"); + } + SystemUserLevel userLevel = new SystemUserLevel(); + if (ObjectUtil.isNull(user.getLevel()) || user.getLevel().equals(0)) { + userLevel.setGrade(0); + } else { + userLevel = systemUserLevelService.getByLevelId(user.getLevel()); + } + if (ObjectUtil.isNull(userLevel)) { + throw new YztException("用户会员等级不存在,请检查用户数据"); + } + if (userLevel.getGrade() > systemUserLevel.getGrade()) { + if (ObjectUtil.isNull(request.getIsSub())) { + throw new YztException("降低用户等级时,请选择是否扣除用户经验值"); + } + } + + // 升级 + if (userLevel.getGrade() < systemUserLevel.getGrade()) { + // 创建用户会员等级记录 + UserLevel newLevel = new UserLevel(); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(systemUserLevel.getId()); + newLevel.setGrade(systemUserLevel.getGrade()); + newLevel.setStatus(true); + newLevel.setMark(StrUtil.format("尊敬的用户 {},在{}管理员调整会员等级成为{}", user.getNickname(), YztDateUtil.nowDateTimeStr(), systemUserLevel.getName())); + newLevel.setDiscount(systemUserLevel.getDiscount()); + newLevel.setCreateTime(YztDateUtil.nowDateTime()); + return transactionTemplate.execute(e -> { + updateLevel(user.getUid(), request.getLevelId()); + userLevelService.save(newLevel); + return Boolean.TRUE; + }); + } + // 降级 + if (!request.getIsSub()) {// 不扣经验 + // 创建用户会员等级记录 + UserLevel newLevel = new UserLevel(); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(systemUserLevel.getId()); + newLevel.setGrade(systemUserLevel.getGrade()); + newLevel.setStatus(true); + newLevel.setMark(StrUtil.format("尊敬的用户 {},在{}管理员调整会员等级成为{},不扣除经验", user.getNickname(), YztDateUtil.nowDateTimeStr(), systemUserLevel.getName())); + newLevel.setDiscount(systemUserLevel.getDiscount()); + newLevel.setCreateTime(YztDateUtil.nowDateTime()); + return transactionTemplate.execute(e -> { + updateLevel(user.getUid(), request.getLevelId()); + userLevelService.save(newLevel); + return Boolean.TRUE; + }); + } + // 扣除经验 + Integer deductionExp = user.getExperience() - systemUserLevel.getExperience(); + user.setExperience(systemUserLevel.getExperience()); + user.setLevel(systemUserLevel.getId()); + // 创建用户经验记录 + UserExperienceRecord experienceRecord = new UserExperienceRecord(); + experienceRecord.setUid(user.getUid()); + experienceRecord.setLinkType(ExperienceRecordConstants.EXPERIENCE_RECORD_LINK_TYPE_SYSTEM); + experienceRecord.setType(ExperienceRecordConstants.EXPERIENCE_RECORD_TYPE_SUB); + experienceRecord.setTitle(ExperienceRecordConstants.EXPERIENCE_RECORD_TITLE_ADMIN); + experienceRecord.setExperience(deductionExp); + experienceRecord.setBalance(user.getExperience()); + experienceRecord.setMark(StrUtil.format("管理员降级扣减了{}经验", deductionExp)); + experienceRecord.setStatus(ExperienceRecordConstants.EXPERIENCE_RECORD_STATUS_CREATE); + + // 创建用户会员等级记录 + UserLevel newLevel = new UserLevel(); + newLevel.setUid(user.getUid()); + newLevel.setLevelId(systemUserLevel.getId()); + newLevel.setGrade(systemUserLevel.getGrade()); + newLevel.setStatus(true); + newLevel.setMark(StrUtil.format("尊敬的用户 {},在{}管理员调整会员等级成为{},扣除经验{}", user.getNickname(), YztDateUtil.nowDateTimeStr(), systemUserLevel.getName(), deductionExp)); + newLevel.setDiscount(systemUserLevel.getDiscount()); + newLevel.setCreateTime(YztDateUtil.nowDateTime()); + return transactionTemplate.execute(e -> { + user.setUpdateTime(DateUtil.date()); + updateById(user); + userLevelService.save(newLevel); + experienceRecordService.save(experienceRecord); + return Boolean.TRUE; + }); + } + + /** + * 获取用户总人数 + */ + @Override + public Integer getTotalNum() { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(User::getUid); + return userMapper.selectCount(lqw).intValue(); + } + + /** + * 根据日期段获取注册用户数量 + * @param startDate 日期 + * @param endDate 日期 + * @return UserOverviewResponse + */ + @Override + public Integer getRegisterNumByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("uid"); + wrapper.apply("date_format(create_time, '%Y-%m-%d') between {0} and {1}", startDate, endDate); + return userMapper.selectCount(wrapper).intValue(); + } + + /** + * 获取用户性别数据 + * @return List + */ + @Override + public List getSexData() { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("sex", "count(uid) as pay_count"); + wrapper.groupBy("sex"); + return userMapper.selectList(wrapper); + } + + /** + * 获取用户渠道数据 + * @return List + */ + @Override + public List getChannelData() { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("user_type", "count(uid) as pay_count"); + wrapper.groupBy("user_type"); + return userMapper.selectList(wrapper); + } + + /** + * 获取所有用户的id跟地址 + * @return List + */ + @Override + public List findIdAndAddresList() { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("uid", "addres"); + return userMapper.selectList(wrapper); + } + + /** + * 修改个人资料 + * @param request 修改信息 + */ + @Override + public Boolean editUser(UserEditRequest request) { + User user = getInfo(); + user.setAvatar(systemAttachmentService.clearPrefix(request.getAvatar())); + user.setNickname(request.getNickname()); + user.setOrgName(request.getOrgName()); + user.setBirthday(request.getBirthday()); + user.setUpdateTime(DateUtil.date()); + user.setSex(request.getSex()); + return updateById(user); + } + + /** + * 修改个人资料的上级推广员 + * @param request 修改信息 + */ + public Boolean updateSpreadUid(UpdateSpreadUserRequest request) { + User user = getInfo(); + if(user.getLevel() > 1){ + throw new YztException("等级过高不可更改!"); + } + User spreadUser = getByPhone(request.getPhone()); + if (spreadUser == null){ + throw new YztException("上级经销不存在,请正确输入手机号!!"); + } + if(spreadUser.getLevel() <= user.getLevel()){ + throw new YztException("修改失败,当前上级经销等级过低!"); + } + if(!spreadUser.getCanChange()){ + throw new YztException("不可修改"); + } + user.setSpreadUid(spreadUser.getUid()); + user.setUpdateTime(DateUtil.date()); + user.setCanChange(false); + return updateById(user); + } + + /** + * 获取用户拼团进度 + * @param request 用户uid + */ + @Override + public List getUserPink(PinkQueryRequest request) { + return storePinkService.getListByUid(request.getUid(),request.getQueueType()); + } + + /** + * 获取用户详情 + * @param id 用户uid + */ + @Override + public User getInfoByUid(Integer id) { + User user = getById(id); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户不存在"); + } + return user; + } + + /** + * 获取上级信息 + */ + public User getReferInfo() { + + User user = getById(getInfo().getSpreadUid()); + if (ObjectUtil.isNull(user)) { + throw new YztException("用户不存在"); + } + return user; + } + + + /** + * 批量清除用户推广人 + * @param spreadUid 推广人id + */ + private Boolean batchRemoveSpreadUid(Integer spreadUid) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.set(User::getSpreadUid, 0); + wrapper.eq(User::getSpreadUid, spreadUid); + return update(wrapper); + } + + /** + * 根据日期获取注册用户数量 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getRegisterNumByDate(String date) { + QueryWrapper wrapper = Wrappers.query(); + wrapper.select("uid"); + wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", date); + return userMapper.selectCount(wrapper).intValue(); + } + + /** + * 更新用户等级 + * @param uid 用户id + * @param levelId 会员等级id + * @return Boolean + */ + private Boolean updateLevel(Integer uid, Integer levelId) { + LambdaUpdateWrapper luw = Wrappers.lambdaUpdate(); + luw.set(User::getLevel, levelId); + luw.eq(User::getUid, uid); + return update(luw); + } + + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserSignServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserSignServiceImpl.java new file mode 100644 index 0000000..f4308ea --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserSignServiceImpl.java @@ -0,0 +1,405 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.ExperienceRecordConstants; +import com.yzt.common.constants.IntegralRecordConstants; +import com.yzt.common.constants.SysGroupDataConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserExperienceRecord; +import com.yzt.common.model.user.UserIntegralRecord; +import com.yzt.common.model.user.UserSign; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.response.UserSignInfoResponse; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.vo.SystemGroupDataSignConfigVo; +import com.yzt.common.vo.UserSignMonthVo; +import com.yzt.common.vo.UserSignVo; +import com.yzt.service.mapper.UserSignMapper; +import com.yzt.service.service.*; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * UserSignServiceImpl 接口实现 + * + */ +@Service +public class UserSignServiceImpl extends ServiceImpl implements UserSignService { + + @Resource + private UserSignMapper mapper; + + @Lazy + @Autowired + private UserService userService; + + @Autowired + private SystemGroupDataService systemGroupDataService; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserIntegralRecordService userIntegralRecordService; + + @Autowired + private UserLevelService userLevelService; + + @Autowired + private UserExperienceRecordService userExperienceRecordService; + + /** + * 用户积分列表 + * + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserSign::getType, 1); + lambdaQueryWrapper.eq(UserSign::getUid, userService.getUserIdException()); + lambdaQueryWrapper.orderByDesc(UserSign::getId); + List userSignList = mapper.selectList(lambdaQueryWrapper); + + ArrayList userSignVoList = new ArrayList<>(); + if (userSignList.size() < 1) { + return userSignVoList; + } + for (UserSign userSign : userSignList) { + userSignVoList.add(new UserSignVo(userSign.getTitle(), userSign.getNumber(), userSign.getCreateDay())); + } + return userSignVoList; + } + + /** + * 签到 + */ + @Override + public SystemGroupDataSignConfigVo sign() { + User user = userService.getInfoException(); + + // 获取最后一次签到记录 + UserSign lastUserSign = getLastDayByUid(user.getUid()); + if (ObjectUtil.isNull(lastUserSign)) { + // 没有签到过,重置签到次数 + user.setSignNum(0); + } else { + // 判断是否重复签到 + String lastDate = YztDateUtil.dateToStr(lastUserSign.getCreateDay(), Constants.DATE_FORMAT_DATE); + String nowDate = YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE); + //对比今天数据 + if (YztDateUtil.compareDate(lastDate, nowDate, Constants.DATE_FORMAT_DATE) == 0) { + throw new YztException("今日已签到。不可重复签到"); + } + String nextDate = YztDateUtil.addDay(lastUserSign.getCreateDay(), 1, Constants.DATE_FORMAT_DATE); + int compareDate = YztDateUtil.compareDate(nextDate, nowDate, Constants.DATE_FORMAT_DATE); + if (compareDate != 0) { + //不相等,所以不是连续签到,重置签到次数 + user.setSignNum(0); + } + } + + //获取签到数据 + List config = getSignConfig(); + if (CollUtil.isEmpty(config)) { + throw new YztException("签到配置不存在,请在管理端配置签到数据"); + } + + //如果已经签到一个周期,那么再次签到的时候直接从第一天重新开始 + if (user.getSignNum().equals(config.size())) { + user.setSignNum(0); + } + + user.setSignNum(user.getSignNum() + 1); + SystemGroupDataSignConfigVo configVo = null; + for (SystemGroupDataSignConfigVo systemSignConfigVo : config) { + if (user.getSignNum().equals(systemSignConfigVo.getDay())) { + configVo = systemSignConfigVo; + break ; + } + } + if (ObjectUtil.isNull(configVo)) { + throw new YztException("请先配置签到天数!"); + } + + //保存签到数据 + UserSign userSign = new UserSign(); + userSign.setUid(user.getUid()); + userSign.setTitle(Constants.SIGN_TYPE_INTEGRAL_TITLE); + userSign.setNumber(configVo.getIntegral()); + userSign.setType(Constants.SIGN_TYPE_INTEGRAL); + // user.getIntegral 为 BigDecimal,UserSign.balance 为 Integer,转换为整数表示(取整) + userSign.setBalance(user.getIntegral().add(java.math.BigDecimal.valueOf(configVo.getIntegral())).intValue()); + userSign.setCreateDay(YztDateUtil.strToDate(YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE), Constants.DATE_FORMAT_DATE)); + + // 生成用户积分记录 + UserIntegralRecord integralRecord = new UserIntegralRecord(); + integralRecord.setUid(user.getUid()); + integralRecord.setLinkType(IntegralRecordConstants.INTEGRAL_RECORD_LINK_TYPE_SIGN); + integralRecord.setType(IntegralRecordConstants.INTEGRAL_RECORD_TYPE_ADD); + integralRecord.setTitle(IntegralRecordConstants.BROKERAGE_RECORD_TITLE_SIGN); + integralRecord.setIntegral(java.math.BigDecimal.valueOf(configVo.getIntegral())); + integralRecord.setBalance(user.getIntegral().add(java.math.BigDecimal.valueOf(configVo.getIntegral()))); + integralRecord.setMark(StrUtil.format("签到积分奖励增加了{}积分", configVo.getIntegral())); + integralRecord.setStatus(IntegralRecordConstants.INTEGRAL_RECORD_STATUS_COMPLETE); + + //更新用户经验信息 + UserExperienceRecord experienceRecord = new UserExperienceRecord(); + experienceRecord.setUid(user.getUid()); + experienceRecord.setLinkType(ExperienceRecordConstants.EXPERIENCE_RECORD_LINK_TYPE_SIGN); + experienceRecord.setType(ExperienceRecordConstants.EXPERIENCE_RECORD_TYPE_ADD); + experienceRecord.setTitle(ExperienceRecordConstants.EXPERIENCE_RECORD_TITLE_SIGN); + experienceRecord.setExperience(configVo.getExperience()); + experienceRecord.setBalance(user.getExperience() + configVo.getExperience()); + experienceRecord.setMark(StrUtil.format("签到经验奖励增加了{}经验", configVo.getExperience())); + experienceRecord.setStatus(ExperienceRecordConstants.EXPERIENCE_RECORD_STATUS_CREATE); + + // 更新用户积分(BigDecimal) + user.setIntegral(user.getIntegral().add(java.math.BigDecimal.valueOf(configVo.getIntegral()))); + // 更新用户经验 + user.setExperience(user.getExperience() + configVo.getExperience()); + + Boolean execute = transactionTemplate.execute(e -> { + //保存签到数据 + save(userSign); + // 更新用户积分记录 + userIntegralRecordService.save(integralRecord); + //更新用户经验信息 + userExperienceRecordService.save(experienceRecord); + //更新用户 签到天数、积分、经验 + user.setUpdateTime(DateUtil.date()); + userService.updateById(user); + // 用户升级 + userLevelService.upLevel(user); + return Boolean.TRUE; + }); + + if (!execute) { + throw new YztException("修改用户签到信息失败!"); + } + + return configVo; + } + + + /** + * 今日记录详情 + */ + @Override + public HashMap get() { + HashMap map = new HashMap<>(); + //当前积分 + User info = userService.getInfo(); + map.put("integral", info.getIntegral()); + //总计签到天数 + map.put("count", signCount(info.getUid())); + //连续签到数据 + + //今日是否已经签到 + map.put("today", false); + return map; + } + + /** + * 签到配置 + * + * @return List + */ + @Override + public List getSignConfig() { + //获取配置数据 + return systemGroupDataService.getListByGid(SysGroupDataConstants.GROUP_DATA_ID_SIGN, SystemGroupDataSignConfigVo.class); + } + + /** + * 列表年月 + * + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getListGroupMonth(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserSign::getType, 1); + lambdaQueryWrapper.eq(UserSign::getUid, userService.getUserIdException()); + lambdaQueryWrapper.orderByDesc(UserSign::getCreateDay); + List userSignList = mapper.selectList(lambdaQueryWrapper); + + ArrayList signMonthVoArrayList = new ArrayList<>(); + if (userSignList.size() < 1) { + return signMonthVoArrayList; + } + + for (UserSign userSign : userSignList) { + String date = YztDateUtil.dateToStr(userSign.getCreateDay(), Constants.DATE_FORMAT_MONTH); + UserSignVo userSignVo = new UserSignVo(userSign.getTitle(), userSign.getNumber(), userSign.getCreateDay()); + boolean findResult = false; + if (signMonthVoArrayList.size() > 0) { + //有数据之后则 判断是否已存在,存在则更新 + for (UserSignMonthVo userSignMonthVo : signMonthVoArrayList) { + if (userSignMonthVo.getMonth().equals(date)) { + userSignMonthVo.getList().add(userSignVo); + findResult = true; + break; + } + } + } + + //不存在则创建 + if (!findResult) { + //如果没有找到则需要单独添加 + ArrayList userSignVoArrayList = new ArrayList<>(); + userSignVoArrayList.add(userSignVo); + signMonthVoArrayList.add(new UserSignMonthVo(date, userSignVoArrayList)); + } + } + return signMonthVoArrayList; + } + + /** + * 获取用户签到信息 + * @return UserSignInfoResponse + */ + @Override + public UserSignInfoResponse getUserSignInfo() { + User user = userService.getInfoException(); + UserSignInfoResponse userSignInfoResponse = new UserSignInfoResponse(); + BeanUtils.copyProperties(user, userSignInfoResponse); + + // 签到总次数 + userSignInfoResponse.setSumSignDay(getCount(user.getUid())); + // 今天是否签到 + Boolean isCheckNowDaySign = checkDaySign(user.getUid()); + userSignInfoResponse.setIsDaySign(isCheckNowDaySign); + // 昨天是否签到 + Boolean isYesterdaySign = checkYesterdaySign(user.getUid()); + userSignInfoResponse.setIsYesterdaySign(isYesterdaySign); + if (!isYesterdaySign) { + // 今天是否签到 + if (!isCheckNowDaySign) { + userSignInfoResponse.setSignNum(0); + } + } + + // 连续签到天数:当前用户已经签到完一个周期,那么重置 + if (userSignInfoResponse.getSignNum() > 0 && userSignInfoResponse.getSignNum().equals(getSignConfig().size())) { + userSignInfoResponse.setSignNum(0); + userService.repeatSignNum(user.getUid()); + } + + userSignInfoResponse.setIntegral(user.getIntegral()); + return userSignInfoResponse; + } + + /** + * 检测今天是否签到 + * + * @param userId Integer 用户id + * @return UserSignInfoResponse + */ + private Boolean checkDaySign(Integer userId) { + List userSignList = getInfoByDay(userId, YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE)); + return userSignList.size() != 0; + } + + /** + * 检测昨天天是否签到 + * + * @param userId Integer 用户id + * @return UserSignInfoResponse + */ + private Boolean checkYesterdaySign(Integer userId) { + String day = YztDateUtil.nowDate(Constants.DATE_FORMAT_DATE); + String yesterday = YztDateUtil.addDay(day, -1, Constants.DATE_FORMAT_DATE); + List userSignList = getInfoByDay(userId, yesterday); + return userSignList.size() != 0; + } + + /** + * 根据日期查询数据 + * + * @param userId Integer 用户id + * @param date Date 日期 + * @return UserSignInfoResponse + */ + private List getInfoByDay(Integer userId, String date) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserSign::getUid, userId).eq(UserSign::getType, 1).eq(UserSign::getCreateDay, date); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 累计签到次数 + * + * @param userId Integer 用户id + * @return UserSignInfoResponse + */ + private Integer getCount(Integer userId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserSign::getUid, userId).eq(UserSign::getType, 1); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 获取签到的最后一条记录 + * @param uid 用户id + * @return UserSign + */ + private UserSign getLastDayByUid(Integer uid) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.select(UserSign::getCreateDay); + lqw.eq(UserSign::getUid, uid); + lqw.orderByDesc(UserSign::getCreateDay); + lqw.last(" limit 1"); + return mapper.selectOne(lqw); + } + + /** + * 累计签到天数 + * + * @param userId Integer 用户id + * @return Integer + */ + private Integer signCount(Integer userId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserSign::getUid, userId); + return mapper.selectCount(lambdaQueryWrapper).intValue(); + } + + /** + * 条件获取列表 + * + * @param sign sign + * @param pageParamRequest 分页参数 + * @return List + */ + @Override + public List getListByCondition(UserSign sign, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.setEntity(sign); + lqw.orderByDesc(UserSign::getCreateTime); + return mapper.selectList(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserStatisticsServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserStatisticsServiceImpl.java new file mode 100644 index 0000000..5b64822 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserStatisticsServiceImpl.java @@ -0,0 +1,754 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.User; +import com.yzt.common.response.*; +import com.yzt.service.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +/** + * UserStatisticsService 接口实现 + * + */ +@Service +public class UserStatisticsServiceImpl implements UserStatisticsService { + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private UserService userService; + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private UserBrokerageRecordService brokerageRecordService; + + @Autowired + private UserVisitRecordService userVisitRecordService; + + + /** + * 用户概览数据 + * @param dateLimit 时间参数 + * @return UserOverviewResponse + */ + @Override + public UserOverviewResponse getOverview(String dateLimit) { + if (StrUtil.isBlank(dateLimit)) { + throw new YztException("日期参数不能为空"); + } + // 判断时间类型 + if (Constants.SEARCH_DATE_DAY.equals(dateLimit)) { + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd")); + // 获取昨天的数据 + DateTime yesterday = DateUtil.yesterday(); + String yesterdayStr = yesterday.toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getSimpleDataByDate(yesterdayStr); + // 计算环比,返回对象 + return getCommonResponse(nowDayData, yesterdayData); + } + if (Constants.SEARCH_DATE_YESTERDAY.equals(dateLimit)) { + // 获取昨天的数据 + DateTime yesterday = DateUtil.yesterday(); + String yesterdayStr = yesterday.toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr); + // 获取更前一天的数据 + String beforeDay = DateUtil.offsetDay(yesterday, -1).toString("yyyy-MM-dd"); + UserOverviewResponse beforeDayDta = getSimpleDataByDate(beforeDay); + // 计算环比,返回对象 + return getCommonResponse(yesterdayData, beforeDayDta); + } + // 时间段数据查询(包含7天、30天、周、月、年) + if (Constants.SEARCH_DATE_LATELY_7.equals(dateLimit)) {// 7天 + // 分别获取今天、前6天的数据,数据相加 + DateTime nowDate = DateUtil.date(); + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取往前推七天的日期跟昨天的日期 + String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -6).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate = getDataByPeriod(beforeSevenDateStr, yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + + // 获取前14天-前8天这个区间的数据 + String beforeFourteenDateStr = DateUtil.offsetDay(nowDate, -13).toString("yyyy-MM-dd"); + String beforeEightDateStr = DateUtil.offsetDay(nowDate, -7).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeFourteenDateStr, beforeEightDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + if (Constants.SEARCH_DATE_LATELY_30.equals(dateLimit)) {// 30天 + DateTime nowDate = DateUtil.date(); + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取往前推30天的日期跟昨天的日期 + String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -29).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate = getDataByPeriod(beforeSevenDateStr, yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + + // 获取前14天-前8天这个区间的数据 + String beforeFourteenDateStr = DateUtil.offsetDay(nowDate, -59).toString("yyyy-MM-dd"); + String beforeEightDateStr = DateUtil.offsetDay(nowDate, -30).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeFourteenDateStr, beforeEightDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + if (Constants.SEARCH_DATE_WEEK.equals(dateLimit)) {// 周 + // 判断今天是否是本周第一天 + int dayOfWeek = DateUtil.thisDayOfWeek(); + DateTime nowDate = DateUtil.date(); + UserOverviewResponse intervalDate = new UserOverviewResponse(); + if (dayOfWeek == 2) {// 周一 + // 获取今天的数据(所有数据现查) + intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd")); + } else if (dayOfWeek == 3) {// 周二 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取昨天的数据 + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } else { + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取周一到现在的数据 + String weekStartDateStr = DateUtil.beginOfWeek(nowDate).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + intervalDate = getDataByPeriod(weekStartDateStr, yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } + + // 获取上一周的数据 + DateTime offsetWeek = DateUtil.offsetWeek(nowDate, -1); + String beforeWeekStartDateStr = DateUtil.beginOfWeek(offsetWeek).toString("yyyy-MM-dd"); + String beforeWeekEndDateStr = DateUtil.endOfWeek(offsetWeek).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeWeekStartDateStr, beforeWeekEndDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + if (Constants.SEARCH_DATE_MONTH.equals(dateLimit)) {// 月 + // 判断今天是否是本月第一天 + int dayOfMonth = DateUtil.thisDayOfMonth(); + DateTime nowDate = DateUtil.date(); + UserOverviewResponse intervalDate = new UserOverviewResponse(); + if (dayOfMonth == 1) {// 一号 + // 获取今天的数据(所有数据现查) + intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd")); + } else if (dayOfMonth == 2) {// 二号 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取昨天的数据 + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } else { + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取月初到现在的数据 + String monthStartDateStr = DateUtil.beginOfMonth(nowDate).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + intervalDate = getDataByPeriod(monthStartDateStr, yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } + + // 获取上一月的数据 + DateTime offsetMonth = DateUtil.offsetMonth(nowDate, -1); + String beforeMonthStartDateStr = DateUtil.beginOfMonth(offsetMonth).toString("yyyy-MM-dd"); + String beforeMonthEndDateStr = DateUtil.endOfMonth(offsetMonth).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeMonthStartDateStr, beforeMonthEndDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + if (Constants.SEARCH_DATE_YEAR.equals(dateLimit)) {// 年 + // 判断今天是否是本年第一天 + DateTime nowDate = DateUtil.date(); + UserOverviewResponse intervalDate = new UserOverviewResponse(); + // 获取当年的开始日期 + String beginOfYear = DateUtil.beginOfYear(nowDate).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + if (beginOfYear.equals(nowDate.toString("yyyy-MM-dd"))) {// 第一天 + // 获取今天的数据(所有数据现查) + intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd")); + } else if (beginOfYear.equals(yesterdayStr)) {// 第二天 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取昨天的数据 + UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } else { + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + // 获取年初到现在的数据 + intervalDate = getDataByPeriod(beginOfYear, yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } + + // 获取上一年的数据 + DateTime offsetYear = DateUtil.offsetDay(DateUtil.beginOfYear(nowDate), -1); + String beforeYearStartDateStr = DateUtil.beginOfYear(offsetYear).toString("yyyy-MM-dd"); + String beforeYearEndDateStr = DateUtil.endOfYear(offsetYear).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeYearStartDateStr, beforeYearEndDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + // 自定义时间,切割时间 + String[] split = dateLimit.split(","); + if (split.length < 2) { + throw new YztException("请选择正确的时间范围"); + } + DateTime startDate = DateUtil.parseDate(split[0]); + DateTime endDate = DateUtil.parseDate(split[1]); + // 是否是同一天 + if (DateUtil.isSameDay(startDate, endDate)) { + String dateStr = startDate.toString("yyyy-MM-dd"); + // 判断时间是否是今天 + if (DateUtil.isSameDay(startDate, DateUtil.date())) { + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd")); + // 获取昨天的数据 + DateTime yesterday = DateUtil.yesterday(); + String yesterdayStr = yesterday.toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getSimpleDataByDate(yesterdayStr); + // 计算环比,返回对象 + return getCommonResponse(nowDayData, yesterdayData); + } + // 不是今天 + UserOverviewResponse dayData = getDataByDate(dateStr); + String beforeDateStr = DateUtil.offsetDay(startDate, -1).toString("yyyy-MM-dd"); + UserOverviewResponse beforeDayData = getSimpleDataByDate(beforeDateStr); + // 计算环比,返回对象 + return getCommonResponse(dayData, beforeDayData); + } + // 判断开始时间是否大于结束时间 + if (startDate.compareTo(endDate) >= 0) { + throw new YztException("请选择正确的时间范围"); + } + // 获取两个日期间隔了多少天 + long between = DateUtil.between(startDate, endDate, DateUnit.DAY); + UserOverviewResponse intervalDate = new UserOverviewResponse(); + // 判断结束时间是否是今天 + if (DateUtil.isSameDay(startDate, DateUtil.date())) { + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd")); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + intervalDate = getDataByPeriod(startDate.toString("yyyy-MM-dd"), yesterdayStr); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews()); + intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum()); + intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum()); + intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum()); + intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum()); + intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount())); + intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum())); + } else { + intervalDate = getDataByPeriod(startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd")); + } + // 获取前一个区间的数据 + String beforeDateStr = DateUtil.offsetDay(startDate, -((int) between + 1)).toString("yyyy-MM-dd"); + String beforeEndDateStr = DateUtil.offsetDay(startDate, -1).toString("yyyy-MM-dd"); + UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeDateStr, beforeEndDateStr); + // 计算环比,返回对象 + return getCommonResponse(intervalDate, intervalDate2); + } + + + /** + * 获取用户渠道数据 + * @return List + */ + @Override + public List getChannelData() { + List userList = userService.getChannelData(); + return userList.stream().map(e -> { + UserChannelDataResponse response = new UserChannelDataResponse(); + response.setChannel(e.getUserType()); + response.setNum(e.getPayCount()); + return response; + }).collect(Collectors.toList()); + } + + + /** + * 用户概览数据列表(导出使用) + * @param dateLimit 时间参数 + * @return UserOverviewResponse + */ + @Override + public List getOverviewList(String dateLimit) { + if (StrUtil.isBlank(dateLimit)) { + throw new YztException("日期参数不能为空"); + } + List responsesList = CollUtil.newArrayList(); + // 判断时间类型 + if (Constants.SEARCH_DATE_DAY.equals(dateLimit)) { + // 获取今天的数据(所有数据现查) + UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd")); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(nowDayData, response); + responsesList.add(response); + return responsesList; + } + if (Constants.SEARCH_DATE_YESTERDAY.equals(dateLimit)) { + // 获取昨天的数据 + DateTime yesterday = DateUtil.yesterday(); + String yesterdayStr = yesterday.toString("yyyy-MM-dd"); + UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(yesterdayData, response); + responsesList.add(response); + return responsesList; + } + // 时间段数据查询(包含7天、30天、周、月、年) + if (Constants.SEARCH_DATE_LATELY_7.equals(dateLimit)) {// 7天 + // 分别获取今天、前6天的数据,数据相加 + DateTime nowDate = DateUtil.date(); + String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -6).toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(beforeSevenDateStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + if (Constants.SEARCH_DATE_LATELY_30.equals(dateLimit)) {// 30天 + DateTime nowDate = DateUtil.date(); + String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -29).toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(beforeSevenDateStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + if (Constants.SEARCH_DATE_WEEK.equals(dateLimit)) {// 周 + // 判断今天是否是本周第一天 + int dayOfWeek = DateUtil.thisDayOfWeek(); + DateTime nowDate = DateUtil.date(); + if (dayOfWeek == 2) {// 周一 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(nowDayData, response); + responsesList.add(response); + return responsesList; + } else if (dayOfWeek == 3) {// 周二 + // 获取昨天的数据 + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } else { + // 获取周一到现在的数据 + String weekStartDateStr = DateUtil.beginOfWeek(nowDate).toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(weekStartDateStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + } + if (Constants.SEARCH_DATE_MONTH.equals(dateLimit)) {// 月 + // 判断今天是否是本月第一天 + int dayOfMonth = DateUtil.thisDayOfMonth(); + DateTime nowDate = DateUtil.date(); + if (dayOfMonth == 1) {// 一号 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(nowDayData, response); + responsesList.add(response); + return responsesList; + } else if (dayOfMonth == 2) {// 二号 + // 获取昨天的数据 + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } else { + // 获取月初到现在的数据 + String monthStartDateStr = DateUtil.beginOfMonth(nowDate).toString("yyyy-MM-dd"); + List rangeDateList = getRangeDateList(monthStartDateStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + } + if (Constants.SEARCH_DATE_YEAR.equals(dateLimit)) {// 年 + // 判断今天是否是本年第一天 + DateTime nowDate = DateUtil.date(); + // 获取当年的开始日期 + String beginOfYear = DateUtil.beginOfYear(nowDate).toString("yyyy-MM-dd"); + String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd"); + if (beginOfYear.equals(nowDate.toString("yyyy-MM-dd"))) {// 第一天 + UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd")); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(nowDayData, response); + responsesList.add(response); + return responsesList; + } else if (beginOfYear.equals(yesterdayStr)) {// 第二天 + List rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } else { + List rangeDateList = getRangeDateList(beginOfYear, nowDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + } + // 自定义时间,切割时间 + String[] split = dateLimit.split(","); + if (split.length < 2) { + throw new YztException("请选择正确的时间范围"); + } + DateTime startDate = DateUtil.parseDate(split[0]); + DateTime endDate = DateUtil.parseDate(split[1]); + // 是否是同一天 + if (DateUtil.isSameDay(startDate, endDate)) { + String dateStr = startDate.toString("yyyy-MM-dd"); + // 判断时间是否是今天 + if (DateUtil.isSameDay(startDate, DateUtil.date())) { + UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd")); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(nowDayData, response); + responsesList.add(response); + return responsesList; + } + // 不是今天 + UserOverviewResponse dayData = getDataByDate(dateStr); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dayData, response); + responsesList.add(response); + return responsesList; + } + // 判断开始时间是否大于结束时间 + if (startDate.compareTo(endDate) >= 0) { + throw new YztException("请选择正确的时间范围"); + } + // 获取两个日期间隔了多少天 + List rangeDateList = getRangeDateList(startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd")); + rangeDateList.forEach(e -> { + UserOverviewResponse dataByDate = getDataByDate(e); + UserOverviewDateResponse response = new UserOverviewDateResponse(); + BeanUtil.copyProperties(dataByDate, response); + responsesList.add(response); + }); + return responsesList; + } + + /** + * 根据日期获取数据 + * @param date 日期 + * @return UserOverviewResponse + */ + private UserOverviewResponse getDataByDate(String date) { + // 注册用户数 + Integer registerNum = userService.getRegisterNumByDate(date); + // 浏览量 + Integer pageviews = userVisitRecordService.getPageviewsByDate(date); + // 活跃用户数 + Integer activeUserNum = userVisitRecordService.getActiveUserNumByDate(date); + // 下单用户数 + Integer orderUserNum = storeOrderService.getOrderUserNumByDate(date); + // 充值用户数 + Integer rechargeUserNum = userRechargeService.getRechargeUserNumByDate(date); + // 成交用户数(下单且支付) + Integer orderPayUserNum = storeOrderService.getOrderPayUserNumByDate(date); + // 成交金额 + BigDecimal payOrderAmount = storeOrderService.getPayOrderAmountByDate(date); + // 客单价 + BigDecimal customerPrice = commonCustomerPrice(payOrderAmount, orderPayUserNum); + + UserOverviewResponse response = new UserOverviewResponse(); + response.setRegisterNum(registerNum); + response.setPageviews(pageviews); + response.setActiveUserNum(activeUserNum); + response.setOrderUserNum(orderUserNum); + response.setRechargeUserNum(rechargeUserNum); + response.setOrderPayUserNum(orderPayUserNum); + response.setPayOrderAmount(payOrderAmount); + response.setCustomerPrice(customerPrice); + return response; + } + + /** + * 根据日期获取数据(简版) + * @param date 日期 + * @return UserOverviewResponse + */ + private UserOverviewResponse getSimpleDataByDate(String date) { + // 注册用户数 + Integer registerNum = userService.getRegisterNumByDate(date); + // 活跃用户数 + Integer activeUserNum = userVisitRecordService.getActiveUserNumByDate(date); + // 充值用户数 + Integer rechargeUserNum = userRechargeService.getRechargeUserNumByDate(date); + + UserOverviewResponse response = new UserOverviewResponse(); + response.setRegisterNum(registerNum); + response.setActiveUserNum(activeUserNum); + response.setRechargeUserNum(rechargeUserNum); + return response; + } + + /** + * 根据日期段获取数据 + * @param startDate 日期 + * @param endDate 日期 + * @return UserOverviewResponse + */ + private UserOverviewResponse getDataByPeriod(String startDate, String endDate) { + // 注册用户数 + Integer registerNum = userService.getRegisterNumByPeriod(startDate, endDate); + // 浏览量 + Integer pageviews = userVisitRecordService.getPageviewsByPeriod(startDate, endDate); + // 活跃用户数 + Integer activeUserNum = userVisitRecordService.getActiveUserNumByPeriod(startDate, endDate); + // 下单用户数 + Integer orderUserNum = storeOrderService.getOrderUserNumByPeriod(startDate, endDate); + // 充值用户数 + Integer rechargeUserNum = userRechargeService.getRechargeUserNumByPeriod(startDate, endDate); + // 成交用户数(下单且支付) + Integer orderPayUserNum = storeOrderService.getOrderPayUserNumByPeriod(startDate, endDate); + // 成交金额 + BigDecimal payOrderAmount = storeOrderService.getPayOrderAmountByPeriod(startDate, endDate); + // 客单价 + BigDecimal customerPrice = commonCustomerPrice(payOrderAmount, orderPayUserNum); + + UserOverviewResponse response = new UserOverviewResponse(); + response.setRegisterNum(registerNum); + response.setPageviews(pageviews); + response.setActiveUserNum(activeUserNum); + response.setOrderUserNum(orderUserNum); + response.setRechargeUserNum(rechargeUserNum); + response.setOrderPayUserNum(orderPayUserNum); + response.setPayOrderAmount(payOrderAmount); + response.setCustomerPrice(customerPrice); + return response; + } + + /** + * 根据日期段获取数据(简版) + * @param startDate 日期 + * @param endDate 日期 + * @return UserOverviewResponse + */ + private UserOverviewResponse getSimpleDataByPeriod(String startDate, String endDate) { + // 注册用户数 + Integer registerNum = userService.getRegisterNumByPeriod(startDate, endDate); + // 活跃用户数 + Integer activeUserNum = userVisitRecordService.getActiveUserNumByPeriod(startDate, endDate); + // 充值用户数 + Integer rechargeUserNum = userRechargeService.getRechargeUserNumByPeriod(startDate, endDate); + + UserOverviewResponse response = new UserOverviewResponse(); + response.setRegisterNum(registerNum); + response.setActiveUserNum(activeUserNum); + response.setRechargeUserNum(rechargeUserNum); + return response; + } + + /** + * 客单价计算 + * @param amount 支付总金额 + * @param peopleNum 成交用户数(去重) + * @return BigDecimal + */ + private BigDecimal commonCustomerPrice(BigDecimal amount, Integer peopleNum) { + if (peopleNum.equals(0)) { + return BigDecimal.ZERO; + } + if (BigDecimal.ZERO.compareTo(amount) == 0) { + return BigDecimal.ZERO; + } + return amount.divide(BigDecimal.valueOf(peopleNum), 2, BigDecimal.ROUND_HALF_UP); + } + + /** + * 计算环比并返回对象 + * @param response 主对象 + * @param tempResponse 临时对象 + * @return UserOverviewResponse + */ + private UserOverviewResponse getCommonResponse(UserOverviewResponse response, UserOverviewResponse tempResponse) { + response.setRegisterNumRatio(calculateRatio(response.getRegisterNum(), tempResponse.getRegisterNum())); + response.setActiveUserNumRatio(calculateRatio(response.getActiveUserNum(), tempResponse.getActiveUserNum())); + response.setRechargeUserNumRatio(calculateRatio(response.getRechargeUserNum(), tempResponse.getRechargeUserNum())); + return response; + } + + /** + * 计算环比 + * @param data 数值 + * @param beforeData 上一期数值 + * @return 环比率 + * (本期数 - 上期数)/上期数量*100% + */ + private String calculateRatio(Integer data, Integer beforeData) { + if (data - beforeData == 0) { + return "0%"; + } + if (beforeData.equals(0)) { + return "100%"; + } + BigDecimal bigDecimal = new BigDecimal(data); + BigDecimal beforeBigDecimal = new BigDecimal(beforeData); + BigDecimal ratio = bigDecimal.subtract(beforeBigDecimal).divide(beforeBigDecimal, 2, BigDecimal.ROUND_HALF_UP); + int intValue = ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue(); + return intValue + "%"; + } + + /** + * 获取区域列表(省份) + * @return List + */ + private List getAreaList() { + List list = CollUtil.newArrayList(); + list.add("北京"); + list.add("天津"); + list.add("河北"); + list.add("山西"); + list.add("内蒙古"); + list.add("辽宁"); + list.add("吉林"); + list.add("黑龙江"); + list.add("上海"); + list.add("江苏"); + list.add("浙江"); + list.add("安徽"); + list.add("福建"); + list.add("江西"); + list.add("山东"); + list.add("河南"); + list.add("湖北"); + list.add("湖南"); + list.add("广东"); + list.add("广西"); + list.add("海南"); + list.add("重庆"); + list.add("四川"); + list.add("贵州"); + list.add("云南"); + list.add("西藏"); + list.add("陕西"); + list.add("甘肃"); + list.add("青海"); + list.add("宁夏"); + list.add("新疆"); + list.add("香港"); + list.add("澳门"); + list.add("台湾"); + return list; + } + + /** + * 获取时间区间列表 + */ + private List getRangeDateList(String startDate, String endDate) { + List dateList = CollUtil.newArrayList(); + if (startDate.equals(endDate)) { + dateList.add(startDate); + return dateList; + } + List dateTimeList = DateUtil.rangeToList(DateUtil.parse(startDate), DateUtil.parse(endDate), DateField.DAY_OF_YEAR); + dateTimeList.forEach(e -> { + dateList.add(e.toString("yyyy-MM-dd")); + }); + return dateList; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTagServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTagServiceImpl.java new file mode 100644 index 0000000..590c956 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTagServiceImpl.java @@ -0,0 +1,125 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.user.UserTag; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.UserTagRequest; +import com.yzt.common.utils.YztUtil; +import com.yzt.service.mapper.UserTagMapper; +import com.yzt.service.service.UserService; +import com.yzt.service.service.UserTagService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +/** + * UserTagServiceImpl 接口实现 + * + */ +@Service +public class UserTagServiceImpl extends ServiceImpl implements UserTagService { + + @Resource + private UserTagMapper mapper; + + @Autowired + private UserService userService; + + /** + * 列表 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + return mapper.selectList(null); + } + + /** + * 根据id in 返回name字符串 + * @param tagIdValue String 标签id + * @return List + */ + @Override + public String getGroupNameInId(String tagIdValue) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(UserTag::getId, YztUtil.stringToArray(tagIdValue)).orderByDesc(UserTag::getId); + List userTags = mapper.selectList(lambdaQueryWrapper); + if (null == userTags){ + return "无"; + } + + return userTags.stream().map(UserTag::getName).distinct().collect(Collectors.joining(",")); + } + + /** + * 新增用户标签 + * @param userTagRequest 标签参数 + */ + @Override + public Boolean create(UserTagRequest userTagRequest) { + if (isExistName(userTagRequest.getName(), null)) { + throw new YztException("标签名称已存在"); + } + UserTag userTag = new UserTag(); + BeanUtils.copyProperties(userTagRequest, userTag); + return save(userTag); + } + + /** + * 是否存在用户标签 + * @param tagName 标签名称 + * @param id 标签ID + */ + private Boolean isExistName(String tagName, Integer id) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.select(UserTag::getId); + lqw.eq(UserTag::getName, tagName); + if (ObjectUtil.isNotNull(id)) { + lqw.ne(UserTag::getId, id); + } + lqw.last(" limit 1"); + UserTag userTag = mapper.selectOne(lqw); + return ObjectUtil.isNotNull(userTag); + } + + /** + * 删除用户标签 + * @param id 标签id + */ + @Override + public Boolean delete(Integer id) { + boolean remove = removeById(id); + if (remove) { + userService.clearGroupByGroupId(id.toString()); + } + return remove; + } + + /** + * 修改用户标签 + * @param id 标签id + * @param userTagRequest 标签参数 + */ + @Override + public Boolean updateTag(Integer id, UserTagRequest userTagRequest) { + if (isExistName(userTagRequest.getName(), id)) { + throw new YztException("标签名称已存在"); + } + UserTag userTag = new UserTag(); + BeanUtils.copyProperties(userTagRequest, userTag); + userTag.setId(id); + return updateById(userTag); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTokenServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTokenServiceImpl.java new file mode 100644 index 0000000..7e72bdf --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserTokenServiceImpl.java @@ -0,0 +1,57 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.user.UserToken; +import com.yzt.service.mapper.UserTokenMapper; +import com.yzt.service.service.UserTokenService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * UserTokenServiceImpl 接口实现 + * + */ +@Service +public class UserTokenServiceImpl extends ServiceImpl implements UserTokenService { + + @Resource + private UserTokenMapper mapper; + + /** + * 检测token是否存在 + * @param token String openId + * @param type int 类型 + * @return UserToken + */ + @Override + public UserToken getByOpenidAndType(String token, int type) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserToken::getType, type).eq(UserToken::getToken, token); + return mapper.selectOne(lambdaQueryWrapper); + } + + /** + * 绑定token关系 + * @param token String token + * @param type int 类型 + */ + @Override + public void bind(String token, int type, Integer userId) { + UserToken userToken = new UserToken(); + userToken.setToken(token); + userToken.setType(type); + userToken.setUid(userId); + save(userToken); + } + + @Override + public UserToken getTokenByUserId(Integer userId, int type) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserToken::getUid, userId).eq(UserToken::getType, type); + return mapper.selectOne(lambdaQueryWrapper); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/UserVisitRecordServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserVisitRecordServiceImpl.java new file mode 100644 index 0000000..2b5ebf9 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/UserVisitRecordServiceImpl.java @@ -0,0 +1,70 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.record.UserVisitRecord; +import com.yzt.service.mapper.UserVisitRecordMapper; +import com.yzt.service.service.UserVisitRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * UserVisitRecordServiceImpl 接口实现 + * + */ +@Service +public class UserVisitRecordServiceImpl extends ServiceImpl implements UserVisitRecordService { + + @Resource + private UserVisitRecordMapper mapper; + + /** + * 通过日期获取浏览量 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getPageviewsByDate(String date) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("id"); + wrapper.eq("date", date); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 通过时间段获取浏览量 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + @Override + public Integer getPageviewsByPeriod(String startDate, String endDate) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("id"); + wrapper.between("date", startDate, endDate); + return mapper.selectCount(wrapper).intValue(); + } + + /** + * 通过日期获取活跃用户数 + * @param date 日期 + * @return Integer + */ + @Override + public Integer getActiveUserNumByDate(String date) { + return mapper.getActiveUserNumByDate(date); + } + + /** + * 通过时间段获取活跃用户数 + * @param startDate 日期 + * @param endDate 日期 + * @return Integer + */ + @Override + public Integer getActiveUserNumByPeriod(String startDate, String endDate) { + return mapper.getActiveUserNumByPeriod(startDate, endDate); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WeChatPayServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WeChatPayServiceImpl.java new file mode 100644 index 0000000..8563db7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WeChatPayServiceImpl.java @@ -0,0 +1,400 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.constants.TaskConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.combination.StoreCombination; +import com.yzt.common.model.combination.StorePink; +import com.yzt.common.model.finance.UserRecharge; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.model.user.User; +import com.yzt.common.model.user.UserToken; +import com.yzt.common.model.wechat.WechatPayInfo; +import com.yzt.common.utils.*; +import com.yzt.common.vo.*; +import com.yzt.service.service.*; +import lombok.Data; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.support.TransactionTemplate; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + + +/** + * 微信支付 + * + */ +@Data +@Service +public class WeChatPayServiceImpl implements WeChatPayService { + private static final Logger logger = LoggerFactory.getLogger(WeChatPayServiceImpl.class); + + @Autowired + private RestTemplateUtil restTemplateUtil; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private SystemConfigService systemConfigService; + + private String signKey; + + private CreateOrderRequestVo createOrderRequestVo; + + private CreateOrderResponseVo createOrderResponseVo = null; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private TransactionTemplate transactionTemplate; + + @Autowired + private UserService userService; + + @Autowired + private UserRechargeService userRechargeService; + + @Autowired + private RechargePayService rechargePayService; + + @Autowired + private StoreCombinationService storeCombinationService; + + @Autowired + private StorePinkService storePinkService; + + @Autowired + private com.yzt.service.service.StoreProductAttrService storeProductAttrService; + +// @Autowired +// private PayComponentOrderService componentOrderService; + + @Autowired + private WechatNewService wechatNewService; + + @Autowired + private WechatPayInfoService wechatPayInfoService; + + /** + * 查询支付结果 + * @param orderNo 订单编号 + * @return + */ + @Override + public Boolean queryPayResult(String orderNo) { + if (StrUtil.isBlank(orderNo)) { + throw new YztException("订单编号不能为空"); + } + // 切割字符串,判断是支付订单还是充值订单 + String pre = StrUtil.subPre(orderNo, 5); + if (pre.equals("order")) {// 支付订单 + StoreOrder storeOrder = storeOrderService.getByOderId(orderNo); + if (ObjectUtil.isNull(storeOrder)) { + throw new YztException("订单不存在"); + } + if (storeOrder.getIsDel()) { + throw new YztException("订单已被删除"); + } + if (!storeOrder.getPayType().equals(PayConstants.PAY_TYPE_WE_CHAT)) { + throw new YztException("不是微信支付类型订单,请重新选择支付方式"); + } + + if (storeOrder.getPaid()) { + return Boolean.TRUE; + } + + WechatPayInfo wechatPayInfo = wechatPayInfoService.getByNo(storeOrder.getOutTradeNo()); + if (ObjectUtil.isNull(wechatPayInfo)) { + throw new YztException("未找到对应微信订单"); + } + + User user = userService.getById(storeOrder.getUid()); + if (ObjectUtil.isNull(user)) throw new YztException("用户不存在"); + + + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (storeOrder.getIsChannel() == 0) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (storeOrder.getIsChannel() == 1) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + if (storeOrder.getIsChannel() == 2) {// H5 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + + // 生成查询订单对象 + Map payVo = getWxChantQueryPayVo(wechatPayInfo.getOutTradeNo(), appId, mchId, signKey); + // 查询订单信息 + MyRecord record = wechatNewService.payOrderQuery(payVo); + + wechatPayInfo.setIsSubscribe(record.getStr("is_subscribe")); + wechatPayInfo.setTradeState(record.getStr("trade_state")); + wechatPayInfo.setBankType(record.getStr("bank_type")); + wechatPayInfo.setCashFee(record.getInt("cash_fee")); + wechatPayInfo.setCouponFee(record.getInt("coupon_fee")); + wechatPayInfo.setTransactionId(record.getStr("transaction_id")); + wechatPayInfo.setTimeEnd(record.getStr("time_end")); + wechatPayInfo.setTradeStateDesc(record.getStr("trade_state_desc")); + + Boolean updatePaid = transactionTemplate.execute(e -> { + storeOrderService.updatePaid(orderNo); + wechatPayInfoService.updateById(wechatPayInfo); + // ==================== 扣除积分逻辑已禁用 ==================== + /* 原扣除积分逻辑已注释 + if (storeOrder.getUseIntegral() > 0) { + userService.updateIntegral(user, java.math.BigDecimal.valueOf(storeOrder.getUseIntegral()), "sub"); + } + */ + // ==================== 扣除积分逻辑已禁用 ==================== +// if (storeOrder.getType().equals(1)) { +// PayComponentOrder componentOrder = componentOrderService.getByOrderNo(orderNo); +// componentOrder.setTransactionId(record.getStr("transaction_id")); +// componentOrder.setTimeEnd(record.getStr("time_end")); +// componentOrderService.updateById(componentOrder); +// } + // 拼团逻辑已移除:StorePink 记录的创建统一由 handlePostPay->processQueueLogic 处理 + return Boolean.TRUE; + }); + if (!updatePaid) { + throw new YztException("支付成功更新订单失败"); + } + // 添加支付成功task + redisUtil.lPush(TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER, orderNo); + return Boolean.TRUE; + } + // 充值订单 + UserRecharge userRecharge = new UserRecharge(); + userRecharge.setOrderId(orderNo); + userRecharge = userRechargeService.getInfoByEntity(userRecharge); + if (ObjectUtil.isNull(userRecharge)) { + throw new YztException("没有找到订单信息"); + } + if (userRecharge.getPaid()) { + return Boolean.TRUE; + } + // 查询订单 + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (userRecharge.getRechargeType().equals("public")) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (userRecharge.getRechargeType().equals("routine")) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + // 生成查询订单对象 + Map payVo = getWxChantQueryPayVo(userRecharge.getOutTradeNo(), appId, mchId, signKey); + // 查询订单信息 + MyRecord record = wechatNewService.payOrderQuery(payVo); + // 支付成功处理 + Boolean rechargePayAfter = rechargePayService.paySuccess(userRecharge); + if (!rechargePayAfter) { + throw new YztException("wechat pay error : 数据保存失败==》" + orderNo); + } + return rechargePayAfter; + } + + /** + * 微信充值预下单接口 + * @param userRecharge 充值订单 + * @param clientIp ip + * @return + */ + @Override + public Map unifiedRecharge(UserRecharge userRecharge, String clientIp) { + if (ObjectUtil.isNull(userRecharge)) { + throw new YztException("订单不存在"); + } + // 获取用户openId + // 根据订单支付类型来判断获取公众号openId还是小程序openId + UserToken userToken = new UserToken(); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC)) {// 公众号 + userToken = userTokenService.getTokenByUserId(userRecharge.getUid(), 1); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)) {// 小程序 + userToken = userTokenService.getTokenByUserId(userRecharge.getUid(), 2); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5 + userToken.setToken(""); + } + + if (ObjectUtil.isNull(userToken)) { + throw new YztException("该用户没有openId"); + } + + // 获取appid、mch_id + // 微信签名key + String appId = ""; + String mchId = ""; + String signKey = ""; + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PUBLIC)) {// 公众号 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_PROGRAM)) {// 小程序 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_ROUTINE_APP_KEY); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5,使用公众号的 + appId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_ID); + mchId = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_MCH_ID); + signKey = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_PAY_WE_CHAT_APP_KEY); + } + + // 获取微信预下单对象 + CreateOrderRequestVo unifiedorderVo = getUnifiedorderVo(userRecharge, userToken.getToken(), clientIp, appId, mchId, signKey); + // 预下单 + CreateOrderResponseVo responseVo = unifiedOrder(unifiedorderVo); + + // 组装前端预下单参数 + Map map = new HashMap<>(); + map.put("appId", unifiedorderVo.getAppid()); + map.put("nonceStr", unifiedorderVo.getNonce_str()); + map.put("package", "prepay_id=".concat(responseVo.getPrepayId())); + map.put("signType", unifiedorderVo.getSign_type()); + Long currentTimestamp = WxPayUtil.getCurrentTimestamp(); + map.put("timeStamp", Long.toString(currentTimestamp)); + String paySign = WxPayUtil.getSign(map, signKey); + map.put("outTradeNo", unifiedorderVo.getOut_trade_no()); + map.put("paySign", paySign); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) { + map.put("mweb_url", responseVo.getMWebUrl()); + } + + return map; + } + + /** + * 生成微信查询订单对象 + * @return + */ + private Map getWxChantQueryPayVo(String orderNo, String appId, String mchId, String signKey) { + Map map = CollUtil.newHashMap(); + map.put("appid", appId); + map.put("mch_id", mchId); + map.put("out_trade_no", orderNo); + map.put("nonce_str", WxPayUtil.getNonceStr()); + map.put("sign_type", PayConstants.WX_PAY_SIGN_TYPE_MD5); + map.put("sign", WxPayUtil.getSign(map, signKey)); + return map; + } + + /** + * 获取微信预下单对象 + * @return + */ + private CreateOrderRequestVo getUnifiedorderVo(UserRecharge userRecharge, String openid, String ip, String appId, String mchId, String signKey) { + + // 获取域名 + String domain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_URL); + String apiDomain = systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_API_URL); + + AttachVo attachVo = new AttachVo(Constants.SERVICE_PAY_TYPE_RECHARGE, userRecharge.getUid()); + CreateOrderRequestVo vo = new CreateOrderRequestVo(); + + vo.setAppid(appId); + vo.setMch_id(mchId); + vo.setNonce_str(WxPayUtil.getNonceStr()); + vo.setSign_type(PayConstants.WX_PAY_SIGN_TYPE_MD5); + vo.setBody(PayConstants.PAY_BODY); + vo.setAttach(JSONObject.toJSONString(attachVo)); + vo.setOut_trade_no(userRecharge.getOrderId()); + // 订单中使用的是BigDecimal,这里要转为Integer类型 + vo.setTotal_fee(userRecharge.getPrice().multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue()); + vo.setSpbill_create_ip(ip); + vo.setNotify_url(apiDomain + PayConstants.WX_PAY_NOTIFY_API_URI); + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_JS); + vo.setOpenid(openid); + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_H5)) {// H5 + vo.setTrade_type(PayConstants.WX_PAY_TRADE_TYPE_H5); + vo.setOpenid(null); + } + if (userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_IOS) || userRecharge.getRechargeType().equals(PayConstants.PAY_CHANNEL_WE_CHAT_APP_ANDROID)) { + vo.setTrade_type("APP"); + vo.setOpenid(null); + } + CreateOrderH5SceneInfoVo createOrderH5SceneInfoVo = new CreateOrderH5SceneInfoVo( + new CreateOrderH5SceneInfoDetailVo( + domain, + systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME) + ) + ); + vo.setScene_info(JSONObject.toJSONString(createOrderH5SceneInfoVo)); + String sign = WxPayUtil.getSign(vo, signKey); + vo.setSign(sign); + return vo; + } + + /** + * 作用:统一下单
+ * 场景:公共号支付、扫码支付、APP支付 + * + * @param vo 向wxpay post的请求数据 + * @return API返回数据 + */ + private CreateOrderResponseVo unifiedOrder(CreateOrderRequestVo vo) { + try { + String url = PayConstants.WX_PAY_API_URL + PayConstants.WX_PAY_API_URI; + String request = XmlUtil.objectToXml(vo); + String xml = restTemplateUtil.postXml(url, request); + HashMap map = XmlUtil.xmlToMap(xml); + if (null == map) { + throw new YztException("微信下单失败!"); + } + CreateOrderResponseVo responseVo = YztUtil.mapToObj(map, CreateOrderResponseVo.class); + if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) { + throw new YztException("微信下单失败1!" + responseVo.getReturnMsg()); + } + + if (responseVo.getResultCode().toUpperCase().equals("FAIL")) { + throw new YztException("微信下单失败2!" + responseVo.getErrCodeDes()); + } + + responseVo.setExtra(vo.getScene_info()); + return responseVo; + } catch (Exception e) { + e.printStackTrace(); + throw new YztException(e.getMessage()); + } + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatCallbackServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatCallbackServiceImpl.java new file mode 100644 index 0000000..fd47c7a --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatCallbackServiceImpl.java @@ -0,0 +1,54 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.wechat.WechatCallback; +import com.yzt.service.mapper.WechatCallbackMapper; +import com.yzt.service.service.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 微信小程序回调Service + * + */ +@Service +public class WechatCallbackServiceImpl extends ServiceImpl implements WechatCallbackService { + + private static final Logger logger = LoggerFactory.getLogger(WechatCallbackServiceImpl.class); + + @Resource + private WechatCallbackMapper mapper; + + + /** + * 微信回调 + * @param request request + * @return String + */ + @Override + public String callback(String request) { + System.out.println("微信小程序回调:" + request); + JSONObject jsonObject = JSONObject.parseObject(request); + System.out.println("微信小程序回调jsonObject:" + jsonObject); + WechatCallback wechatCallback = new WechatCallback(); + wechatCallback.setToUserName(jsonObject.getString("ToUserName")); + wechatCallback.setFromUserName(jsonObject.getString("FromUserName")); + wechatCallback.setCreateTime(jsonObject.getLong("CreateTime")); + wechatCallback.setMsgType(jsonObject.getString("MsgType")); + wechatCallback.setEvent(jsonObject.getString("Event")); + wechatCallback.setAddTime(DateUtil.date()); + wechatCallback.setContent(request); + save(wechatCallback); + switch (wechatCallback.getEvent()) { + } + return "success"; + } + + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatExceptionsServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatExceptionsServiceImpl.java new file mode 100644 index 0000000..8c365cd --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatExceptionsServiceImpl.java @@ -0,0 +1,38 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.wechat.WechatExceptions; +import com.yzt.service.mapper.WechatExceptionsMapper; +import com.yzt.service.service.WechatExceptionsService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * 微信异常服务实现类 + * fw_ + */ +@Service +public class WechatExceptionsServiceImpl extends ServiceImpl implements WechatExceptionsService { + + @Resource + private WechatExceptionsMapper mapper; + + + /** + * 自动删除日志 + * 只保留十天的日志 + */ + @Override + public void autoDeleteLog() { + String beforeDate = DateUtil.offsetDay(new Date(), -9).toString("yyyy-MM-dd"); + UpdateWrapper wrapper = Wrappers.update(); + wrapper.lt("create_time", beforeDate); + mapper.delete(wrapper); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMediaServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMediaServiceImpl.java new file mode 100644 index 0000000..75b3c04 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMediaServiceImpl.java @@ -0,0 +1,104 @@ +package com.yzt.service.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.exception.YztException; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.UploadWeChatMediaUtil; +import com.yzt.service.service.WechatMediaService; +import com.yzt.service.service.WechatNewService; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Data +@Service +public class WechatMediaServiceImpl implements WechatMediaService { + + @Autowired + private WechatNewService wechatNewService; + + private static final long maxSizeImage = 1024 * 1024 * 10; + + private static final String suffixNameImage = "bmp,png,jpeg,jpg,gif"; + + private static final long maxSizeVoice = 1024 * 1024 * 2; + + private static final String suffixNameVoice = "mp3,wma,wav,amr"; + + + + /** + * 上传素材到微信素材库 + * @param file MultipartFile 上传文件 + * @param type String 类型 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) + * @return String + */ + public Map upload(MultipartFile file, String type) { + try{ + String[] split = Objects.requireNonNull(file.getOriginalFilename()).split("\\."); + String suffixName = split[split.length-1]; + isValidPic(file.getSize(), suffixName, type); + + // 需要注意:这个是微信2016年的企业号上传素材接口,企业号在微信的最后维护时间在2016-07-19 + String url = wechatNewService.qyapiAddMaterialUrl(type); + JSONObject response = UploadWeChatMediaUtil.uploadFile(url, file.getResource().getInputStream(), file.getOriginalFilename()); + if (null == response || !response.containsKey("media_id")) { + assert response != null; + throw new YztException("素材上传失败" + response.getString("errmsg")); + } + + Map map = new HashMap<>(); + map.put("mediaId", response.getString("media_id")); + map.put("url", response.getString("url")); + map.put("name", file.getOriginalFilename().replace(suffixName, "")); + + return map; + }catch (Exception e) { + throw new YztException(e.getMessage()); + } + + + } + + + /** + * 是否符合微信规范 + * @param size long 文件大小 + * @param suffixName String 后缀名 + */ + private void isValidPic(long size, String suffixName, String type) { + JSONObject config = getConfig(); + if (!config.containsKey(type)) { + throw new YztException("不支持此类型"); + } + + long supportSize = config.getJSONObject(type).getLong("size"); + if (supportSize < size) { + throw new YztException("文件大小不能超过" + supportSize); + } + String supportNameSuffix = config.getJSONObject(type).getString("suffix"); + List suffixNameList = YztUtil.stringToArrayStr(supportNameSuffix); + if (!suffixNameList.contains(suffixName)) { + throw new YztException("文件格式必须是" + supportSize); + } + } + + /** + * 参数配置 + * + */ + private JSONObject getConfig() { + String data = "{" + + "image:{size:\""+maxSizeImage+"\", suffix: \""+suffixNameImage+"\"}, " + + "voice:{size:\""+maxSizeVoice+"\", suffix: \""+suffixNameVoice+"\"}" + + "}"; + return JSONObject.parseObject(data); + } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMerchantConfigServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMerchantConfigServiceImpl.java new file mode 100644 index 0000000..1fd94ca --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatMerchantConfigServiceImpl.java @@ -0,0 +1,86 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.wechat.WechatMerchantConfig; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.vo.WechatMerchantConfigVo; +import com.yzt.service.mapper.WechatMerchantConfigMapper; +import com.yzt.service.service.WechatMerchantConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; + +import java.util.Objects; + +/** + * @Author: pengsz + * @Date: 2025/12/03 + * @Description: + */ +@Service +@RequiredArgsConstructor +public class WechatMerchantConfigServiceImpl extends ServiceImpl + implements WechatMerchantConfigService { + + @Autowired + private TransactionTemplate transactionTemplate; + public Boolean saveOrUpdateByTenant(WechatMerchantConfigVo vo, Long currentTenantId, Integer operatorId) { +// String encryptedKey = YztUtil.encryptPassword(vo.getApiKey()); + WechatMerchantConfig config = new WechatMerchantConfig(); + config.setTenantId(currentTenantId); + config.setMchId(vo.getMchId()); + config.setAppid(vo.getAppid()); + config.setApiKeyEncrypted(vo.getApiKey()); + config.setCertFilePath(vo.getCertFilePath()); + config.setPrivateKeyFilePath(vo.getPrivateKeyFilePath()); + config.setSerialNo(vo.getSerialNo()); + config.setStatus(vo.getStatus()); + config.setRemark(vo.getRemark()); + config.setCreateBy(operatorId); + config.setCreateTime(YztDateUtil.nowDateTime()); + config.setUpdateBy(operatorId); + config.setUpdateTime(YztDateUtil.nowDateTime()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(WechatMerchantConfig::getTenantId, currentTenantId); + + + return transactionTemplate.execute(e -> { + if (this.count(query) > 0|| Objects.nonNull(this.getOne(query))) { + this.update(config, query); + } else { + return this.save(config); + } + return Boolean.TRUE; + }); + } + + @Override + public WechatMerchantConfigVo getByTenant(Long tenantId) { + WechatMerchantConfig config = this.getOne( + new LambdaQueryWrapper() + .eq(WechatMerchantConfig::getTenantId, tenantId) + ); + + if (config == null) { + return null; + } + + WechatMerchantConfigVo vo = new WechatMerchantConfigVo(); + vo.setMchId(config.getMchId()); + vo.setAppid(config.getAppid()); + // ⚠️ 不设置 apiKey(自动为 null,实现脱敏) + vo.setCertFilePath(config.getCertFilePath()); + vo.setPrivateKeyFilePath(config.getPrivateKeyFilePath()); + vo.setSerialNo(config.getSerialNo()); + vo.setStatus(config.getStatus()); + vo.setRemark(config.getRemark()); + + return vo; + } + +} \ No newline at end of file diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatNewServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatNewServiceImpl.java new file mode 100644 index 0000000..7372dbf --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatNewServiceImpl.java @@ -0,0 +1,936 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.config.YztConfig; +import com.yzt.common.constants.PayConstants; +import com.yzt.common.constants.WeChatConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.wechat.WechatExceptions; +import com.yzt.common.model.wechat.WechatPayInfo; +import com.yzt.common.response.WeChatJsSdkConfigResponse; +import com.yzt.common.token.WeChatOauthToken; +import com.yzt.common.utils.YztUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.utils.XmlUtil; +import com.yzt.common.vo.*; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.WechatExceptionsService; +import com.yzt.service.service.WechatNewService; +import com.yzt.service.service.WechatPayInfoService; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 微信公用服务实现类 + * fw_ + */ +@Service +public class WechatNewServiceImpl implements WechatNewService { + private static final Logger logger = LoggerFactory.getLogger(WechatNewServiceImpl.class); + + @Autowired + private YztConfig yztConfig; + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private RestTemplateUtil restTemplateUtil; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private WechatExceptionsService wechatExceptionsService; + + @Autowired + private WechatPayInfoService wechatPayInfoService; + + /** + * 获取公众号accessToken + */ + @Override + public String getPublicAccessToken() { + boolean exists = redisUtil.exists(WeChatConstants.REDIS_WECAHT_PUBLIC_ACCESS_TOKEN_KEY); + if (exists) { + Object accessToken = redisUtil.get(WeChatConstants.REDIS_WECAHT_PUBLIC_ACCESS_TOKEN_KEY); + return accessToken.toString(); + } + String appId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_PUBLIC_APPID); + if (StrUtil.isBlank(appId)) { + throw new YztException("微信公众号appId未设置"); + } + String secret = systemConfigService.getValueByKey(WeChatConstants.WECHAT_PUBLIC_APPSECRET); + if (StrUtil.isBlank(secret)) { + throw new YztException("微信公众号secret未设置"); + } + WeChatAccessTokenVo accessTokenVo = getAccessToken(appId, secret, "public"); + // 缓存accessToken + redisUtil.set(WeChatConstants.REDIS_WECAHT_PUBLIC_ACCESS_TOKEN_KEY, accessTokenVo.getAccessToken(), + accessTokenVo.getExpiresIn().longValue() - 1800L, TimeUnit.SECONDS); + return accessTokenVo.getAccessToken(); + } + + + /** + * 获取小程序accessToken + * @return accessToken + */ + @Override + public String getMiniAccessToken() { + boolean exists = redisUtil.exists(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY); + if (exists) { + Object accessToken = redisUtil.get(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY); + return accessToken.toString(); + } + String appId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_MINI_APPID); + if (StrUtil.isBlank(appId)) { + throw new YztException("微信小程序appId未设置"); + } + String secret = systemConfigService.getValueByKey(WeChatConstants.WECHAT_MINI_APPSECRET); + if (StrUtil.isBlank(secret)) { + throw new YztException("微信小程序secret未设置"); + } + WeChatAccessTokenVo accessTokenVo = getAccessToken(appId, secret, "mini"); + // 缓存accessToken + redisUtil.set(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY, accessTokenVo.getAccessToken(), + accessTokenVo.getExpiresIn().longValue() - 1800L, TimeUnit.SECONDS); + return accessTokenVo.getAccessToken(); + } + + /** + * 获取开放平台access_token + * 通过 code 获取 + * 公众号使用 + * @return 开放平台accessToken对象 + */ + @Override + public WeChatOauthToken getOauth2AccessToken(String code) { + String appId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_PUBLIC_APPID); + if (StrUtil.isBlank(appId)) { + throw new YztException("微信公众号appId未设置"); + } + String secret = systemConfigService.getValueByKey(WeChatConstants.WECHAT_PUBLIC_APPSECRET); + if (StrUtil.isBlank(secret)) { + throw new YztException("微信公众号secret未设置"); + } + String url = StrUtil.format(WeChatConstants.WECHAT_OAUTH2_ACCESS_TOKEN_URL, appId, secret, code); + JSONObject data = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(data, "微信获取开放平台access_token异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return JSONObject.parseObject(data.toJSONString(), WeChatOauthToken.class); + } + + /** + * 获取开放平台用户信息 + * @param accessToken 调用凭证 + * @param openid 普通用户的标识,对当前开发者帐号唯一 + * 公众号使用 + * @return 开放平台用户信息对象 + */ + @Override + public WeChatAuthorizeLoginUserInfoVo getSnsUserInfo(String accessToken, String openid) { + String url = StrUtil.format(WeChatConstants.WECHAT_SNS_USERINFO_URL, accessToken, openid, "zh_CN"); + JSONObject data = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(data, "微信获取开放平台用户信息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return JSONObject.parseObject(data.toJSONString(), WeChatAuthorizeLoginUserInfoVo.class); + } + + /** + * 小程序登录凭证校验 + * @return 小程序登录校验对象 + */ + @Override + public WeChatMiniAuthorizeVo miniAuthCode(String code) { + String appId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_MINI_APPID); + if (StrUtil.isBlank(appId)) { + throw new YztException("微信小程序appId未设置"); + } + String secret = systemConfigService.getValueByKey(WeChatConstants.WECHAT_MINI_APPSECRET); + if (StrUtil.isBlank(secret)) { + throw new YztException("微信小程序secret未设置"); + } + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_SNS_AUTH_CODE2SESSION_URL, appId, secret, code); + JSONObject data = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(data, "微信小程序登录凭证校验异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return JSONObject.parseObject(data.toJSONString(), WeChatMiniAuthorizeVo.class); + } + + /** + * 获取微信公众号js配置参数 + * @return WeChatJsSdkConfigResponse + */ + @Override + public WeChatJsSdkConfigResponse getJsSdkConfig(String url) { + try { + url = URLDecoder.decode(url, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new YztException("url无法解析!"); + } + + String appId = systemConfigService.getValueByKey(WeChatConstants.WECHAT_PUBLIC_APPID); + if (StrUtil.isBlank(appId)) { + throw new YztException("微信公众号appId未设置"); + } + String ticket = getJsApiTicket(); + String nonceStr = YztUtil.getUuid(); + Long timestamp = DateUtil.currentSeconds(); + String signature = getJsSDKSignature(nonceStr, ticket, timestamp , url); + + WeChatJsSdkConfigResponse response = new WeChatJsSdkConfigResponse(); + response.setUrl(url); + response.setAppId(appId); + response.setNonceStr(nonceStr); + response.setTimestamp(timestamp); + response.setSignature(signature); + response.setJsApiList(YztUtil.stringToArrayStr(WeChatConstants.PUBLIC_API_JS_API_SDK_LIST)); + response.setDebug(yztConfig.isWechatJsApiDebug()); + return response; + } + + /** + * 生成小程序码 + * @param page 必须是已经发布的小程序存在的页面 + * @param scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符 + * @return 小程序码 + */ + @Override + public String createQrCode(String page, String scene) { + String miniAccessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_QRCODE_UNLIMITED_URL, miniAccessToken); + HashMap map = new HashMap<>(); + map.put("scene", scene); + map.put("page", page); + map.put("width", 200); + byte[] bytes = restTemplateUtil.postJsonDataAndReturnBuffer(url, new JSONObject(map)); + String response = new String(bytes); + if (StringUtils.contains(response,"errcode")) { + logger.error("微信生成小程序码异常"+response); + JSONObject data = JSONObject.parseObject(response); + // 保存到微信异常表 + wxExceptionDispose(data, "微信小程序生成小程序码异常"); + if (data.getString("errcode").equals("40001")) { + redisUtil.delete(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY); + miniAccessToken = getMiniAccessToken(); + url = StrUtil.format(WeChatConstants.WECHAT_MINI_QRCODE_UNLIMITED_URL, miniAccessToken); + bytes = restTemplateUtil.postJsonDataAndReturnBuffer(url, new JSONObject(map)); + response = new String(bytes); + if (StringUtils.contains(response,"errcode")) { + logger.error("微信生成小程序码重试异常"+response); + JSONObject data2 = JSONObject.parseObject(response); + // 保存到微信异常表 + wxExceptionDispose(data2, "微信小程序重试生成小程序码异常"); + } else { + try { + return YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("微信小程序码转换Base64异常"); + } + } + } + throw new YztException("微信生成二维码异常"); + } + try { + return YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("微信小程序码转换Base64异常"); + } + } + + /** + * 生成小程序码 + * + * @param jsonObject 微信端参数 + * @return 小程序码 + */ + @Override + public String createQrCode(JSONObject jsonObject) { + String miniAccessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_QRCODE_UNLIMITED_URL, miniAccessToken); + logger.info("微信小程序码生成参数:{}", jsonObject); + byte[] bytes = restTemplateUtil.postJsonDataAndReturnBuffer(url, jsonObject); + String response = new String(bytes); + if (StringUtils.contains(response, "errcode")) { + logger.error("微信生成小程序码异常" + response); + JSONObject data = JSONObject.parseObject(response); + // 保存到微信异常表 + wxExceptionDispose(data, "微信小程序生成小程序码异常"); + if (data.getString("errcode").equals("40001")) { + redisUtil.secondDelete(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY); + miniAccessToken = getMiniAccessToken(); + url = StrUtil.format(WeChatConstants.WECHAT_MINI_QRCODE_UNLIMITED_URL, miniAccessToken); + bytes = restTemplateUtil.postJsonDataAndReturnBuffer(url, jsonObject); + response = new String(bytes); + if (StringUtils.contains(response, "errcode")) { + logger.error("微信生成小程序码重试异常" + response); + JSONObject data2 = JSONObject.parseObject(response); + // 保存到微信异常表 + wxExceptionDispose(data2, "微信小程序重试生成小程序码异常"); + } else { + try { + return YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("微信小程序码转换Base64异常"); + } + } + } + throw new YztException("微信生成二维码异常"); + } + try { + return YztUtil.getBase64Image(Base64.encodeBase64String(bytes)); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("微信小程序码转换Base64异常"); + } + } + + /** + * 微信预下单接口(统一下单) + * @param unifiedorderVo 预下单请求对象 + * @return 微信预下单返回对象 + */ + @Override + public CreateOrderResponseVo payUnifiedorder(CreateOrderRequestVo unifiedorderVo) { + try { + String url = PayConstants.WX_PAY_API_URL + PayConstants.WX_PAY_API_URI; + String request = XmlUtil.objectToXml(unifiedorderVo); + String xml = restTemplateUtil.postXml(url, request); + HashMap map = XmlUtil.xmlToMap(xml); + if (null == map) { + throw new YztException("微信下单失败!"); + } + // 保存微信预下单 + WechatPayInfo wechatPayInfo = createWechatPayInfo(unifiedorderVo); + + CreateOrderResponseVo responseVo = YztUtil.mapToObj(map, CreateOrderResponseVo.class); + if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) { + // 保存到微信异常表 + wxPayExceptionDispose(map, "微信支付预下单异常"); + wechatPayInfo.setErrCode(map.get("return_code").toString()); + wechatPayInfoService.save(wechatPayInfo); + throw new YztException("微信下单失败1!" + responseVo.getReturnMsg()); + } + + if (responseVo.getResultCode().toUpperCase().equals("FAIL")) { + wxPayExceptionDispose(map, "微信支付预下单业务异常"); + wechatPayInfo.setErrCode(map.get("err_code").toString()); + wechatPayInfoService.save(wechatPayInfo); + throw new YztException("微信下单失败2!" + responseVo.getErrCodeDes()); + } + wechatPayInfo.setErrCode("200"); + wechatPayInfo.setPrepayId(responseVo.getPrepayId()); + wechatPayInfoService.save(wechatPayInfo); + responseVo.setExtra(unifiedorderVo.getScene_info()); + return responseVo; + } catch (Exception e) { + e.printStackTrace(); + throw new YztException(e.getMessage()); + } + } + + /** + * 生成微信订单表对象 + * @param vo 预下单数据 + * @return WechatPayInfo + */ + private WechatPayInfo createWechatPayInfo(CreateOrderRequestVo vo) { + WechatPayInfo payInfo = new WechatPayInfo(); + payInfo.setAppId(vo.getAppid()); + payInfo.setMchId(vo.getMch_id()); + payInfo.setDeviceInfo(vo.getDevice_info()); + payInfo.setOpenId(vo.getOpenid()); + payInfo.setNonceStr(vo.getNonce_str()); + payInfo.setSign(vo.getSign()); + payInfo.setSignType(vo.getSign_type()); + payInfo.setBody(vo.getBody()); + payInfo.setDetail(vo.getDetail()); + payInfo.setAttach(vo.getAttach()); + payInfo.setOutTradeNo(vo.getOut_trade_no()); + payInfo.setFeeType(vo.getFee_type()); + payInfo.setTotalFee(vo.getTotal_fee()); + payInfo.setSpbillCreateIp(vo.getSpbill_create_ip()); + payInfo.setTimeStart(vo.getTime_start()); + payInfo.setTimeExpire(vo.getTime_expire()); + payInfo.setNotifyUrl(vo.getNotify_url()); + payInfo.setTradeType(vo.getTrade_type()); + payInfo.setProductId(vo.getProduct_id()); + payInfo.setSceneInfo(vo.getScene_info()); + return payInfo; + } + + /** + * 微信支付查询订单 + * @return 支付订单查询结果 + */ + @Override + public MyRecord payOrderQuery(Map payVo) { + String url = PayConstants.WX_PAY_API_URL + PayConstants.WX_PAY_ORDER_QUERY_API_URI; + try { + String request = XmlUtil.mapToXml(payVo); + String xml = restTemplateUtil.postXml(url, request); + HashMap map = XmlUtil.xmlToMap(xml); + MyRecord record = new MyRecord(); + if (null == map) { + throw new YztException("微信订单查询失败!"); + } + record.setColums(map); + if (record.getStr("return_code").toUpperCase().equals("FAIL")) { + wxPayQueryExceptionDispose(record, "微信支付查询订单通信异常"); + throw new YztException("微信订单查询失败1!" + record.getStr("return_msg")); + } + + if (record.getStr("result_code").toUpperCase().equals("FAIL")) { + wxPayQueryExceptionDispose(record, "微信支付查询订单结果异常"); + throw new YztException("微信订单查询失败2!" + record.getStr("err_code") + record.getStr("err_code_des")); + } + if (!record.getStr("trade_state").toUpperCase().equals("SUCCESS")) { + wxPayQueryExceptionDispose(record, "微信支付查询订单状态异常"); + throw new YztException("微信订单支付失败3!" + record.getStr("trade_state")); + } + + return record; + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("查询微信订单mapToXml异常===》" + e.getMessage()); + } + } + + /** + * 微信公众号发送模板消息 + * @param templateMessage 模板消息对象 + * @return 是否发送成功 + */ + @Override + public Boolean sendPublicTemplateMessage(TemplateMessageVo templateMessage) { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_SEND_TEMPLATE_URL, accessToken); + JSONObject jsonData = JSONObject.parseObject(JSONObject.toJSONString(templateMessage)); + String result = restTemplateUtil.postJsonData(url, jsonData); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "微信公众号发送模板消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return Boolean.TRUE; + } + + /** + * 微信小程序发送订阅消息 + * @param templateMessage 消息对象 + * @return 是否发送成功 + */ + @Override + public Boolean sendMiniSubscribeMessage(TemplateMessageVo templateMessage) { + String accessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_SEND_SUBSCRIBE_URL, accessToken); + JSONObject messAge = JSONObject.parseObject(JSONObject.toJSONString(templateMessage)); + String result = restTemplateUtil.postJsonData(url, messAge); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.getString("errcode").equals("40001")) { + wxExceptionDispose(data, "微信小程序发送订阅消息异常"); + redisUtil.delete(WeChatConstants.REDIS_WECAHT_MINI_ACCESS_TOKEN_KEY); + accessToken = getMiniAccessToken(); + url = StrUtil.format(WeChatConstants.WECHAT_MINI_SEND_SUBSCRIBE_URL, accessToken); + result = restTemplateUtil.postJsonData(url, messAge); + JSONObject data2 = JSONObject.parseObject(result); + if (data2.containsKey("errcode") && !data2.getString("errcode").equals("0")) { + if (data2.containsKey("errmsg")) { + wxExceptionDispose(data2, "微信小程序发送订阅消息重试异常"); + throw new YztException("微信接口调用失败:" + data2.getString("errcode") + data2.getString("errmsg")); + } + } else { + return Boolean.TRUE; + } + } + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "微信小程序发送订阅消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return Boolean.TRUE; + } + + /** + * 获取微信公众号自定义菜单配置 + * (使用本自定义菜单查询接口可以获取默认菜单和全部个性化菜单信息) + * @return 公众号自定义菜单 + */ + @Override + public JSONObject getPublicCustomMenu() { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_MENU_GET_URL, accessToken); + JSONObject result = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(result)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (result.containsKey("errcode") && result.getString("errcode").equals("0")) { + return result; + } + if (result.containsKey("errmsg")) { + wxExceptionDispose(result, "微信公众号获取自定义菜单配置异常"); + throw new YztException("微信接口调用失败:" + result.getString("errcode") + result.getString("errmsg")); + } + return result; + } + + /** + * 创建微信自定义菜单 + * @param data 菜单json字符串 + * @return 创建结果 + */ + @Override + public Boolean createPublicCustomMenu(String data) { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_MENU_CREATE_URL, accessToken); + String result = restTemplateUtil.postJsonData(url, JSONObject.parseObject(data)); + logger.info("微信消息发送结果:" + result); + JSONObject jsonObject = JSONObject.parseObject(result); + if (ObjectUtil.isNull(jsonObject)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (jsonObject.containsKey("errcode") && jsonObject.getString("errcode").equals("0")) { + return Boolean.TRUE; + } + if (jsonObject.containsKey("errmsg")) { + wxExceptionDispose(jsonObject, "微信公众号创建自定义菜单异常"); + throw new YztException("微信接口调用失败:" + jsonObject.getString("errcode") + jsonObject.getString("errmsg")); + } + return Boolean.TRUE; + } + + /** + * 删除微信自定义菜单 + * @return 删除结果 + */ + @Override + public Boolean deletePublicCustomMenu() { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_MENU_DELETE_URL, accessToken); + JSONObject result = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(result)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (result.containsKey("errcode") && result.getString("errcode").equals("0")) { + return Boolean.TRUE; + } + if (result.containsKey("errmsg")) { + wxExceptionDispose(result, "微信公众号删除自定义菜单异常"); + throw new YztException("微信接口调用失败:" + result.getString("errcode") + result.getString("errmsg")); + } + return Boolean.TRUE; + } + + /** + * 企业号上传其他类型永久素材 + * 获取url + * @param type 素材类型:图片(image)、语音(voice)、视频(video),普通文件(file) + */ + @Override + public String qyapiAddMaterialUrl(String type) { + String accessToken = getPublicAccessToken(); + return StrUtil.format(WeChatConstants.WECHAT_PUBLIC_QYAPI_ADD_MATERIAL_URL, type, accessToken); + } + + /** + * 微信申请退款 + * @param wxRefundVo 微信申请退款对象 + * @param path 商户p12证书绝对路径 + * @return 申请退款结果对象 + */ + @Override + public WxRefundResponseVo payRefund(WxRefundVo wxRefundVo, String path) { + String xmlStr = XmlUtil.objectToXml(wxRefundVo); + String url = WeChatConstants.PAY_API_URL + WeChatConstants.PAY_REFUND_API_URI_WECHAT; + HashMap map = CollUtil.newHashMap(); + String xml = ""; + try { + xml = restTemplateUtil.postWXRefundXml(url, xmlStr, wxRefundVo.getMch_id(), path); + map = XmlUtil.xmlToMap(xml); + } catch (Exception e) { + e.printStackTrace(); + throw new YztException("xmlToMap错误,xml = " + xml); + } + if (null == map) { + throw new YztException("微信无信息返回,微信申请退款失败!"); + } + + WxRefundResponseVo responseVo = YztUtil.mapToObj(map, WxRefundResponseVo.class); + if (responseVo.getReturnCode().toUpperCase().equals("FAIL")) { + wxPayExceptionDispose(map, "微信申请退款异常1"); + throw new YztException("微信申请退款失败1!" + responseVo.getReturnMsg()); + } + + if (responseVo.getResultCode().toUpperCase().equals("FAIL")) { + wxPayExceptionDispose(map, "微信申请退款业务异常"); + throw new YztException("微信申请退款失败2!" + responseVo.getErrCodeDes()); + } + System.out.println("================微信申请退款结束========================="); + return responseVo; + } + + /** + * 获取我的公众号模板消息列表 + * @return List + */ + @Override + public List getPublicMyTemplateList() { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_GET_ALL_PRIVATE_TEMPLATE_URL, accessToken); + JSONObject jsonObject = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(jsonObject)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) { + if (jsonObject.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(jsonObject, StrUtil.format("获取我的公众号模板消息列表异常")); + throw new YztException("微信接口调用失败:" + jsonObject.getString("errcode") + jsonObject.getString("errmsg")); + } + } + JSONArray templateList = jsonObject.getJSONArray("template_list"); + List voList = templateList.toJavaList(PublicMyTemplateVo.class); + return voList; + } + + /** + * 删除微信公众号模板消息 + * @param templateId 模板编号 + * @return Boolean + */ + @Override + public Boolean delPublicMyTemplate(String templateId) { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_DEL_PRIVATE_TEMPLATE_URL, accessToken); + HashMap map = new HashMap<>(); + map.put("template_id", templateId); + JSONObject jsonData = JSONObject.parseObject(JSONObject.toJSONString(map)); + String result = restTemplateUtil.postJsonData(url, jsonData); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "删除微信公众号模板消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return Boolean.TRUE; + } + + /** + * 添加公众号模板消息 + * @param templateIdShort 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式 + * @return 公众号模板编号(自己的) + */ + @Override + public String apiAddPublicTemplate(String templateIdShort) { + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_API_ADD_TEMPLATE_URL, accessToken); + HashMap map = new HashMap<>(); + map.put("template_id_short", templateIdShort); + JSONObject jsonData = JSONObject.parseObject(JSONObject.toJSONString(map)); + String result = restTemplateUtil.postJsonData(url, jsonData); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "添加公众号模板消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return data.getString("template_id"); + } + + /** + * 获取当前帐号下的个人模板列表 + * @return List + */ + @Override + public List getRoutineMyTemplateList() { + String accessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_GET_ALL_PRIVATE_TEMPLATE_URL, accessToken); + JSONObject jsonObject = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(jsonObject)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) { + if (jsonObject.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(jsonObject, StrUtil.format("获取小程序当前帐号下的个人模板列表异常")); + throw new YztException("微信接口调用失败:" + jsonObject.getString("errcode") + jsonObject.getString("errmsg")); + } + } + JSONArray templateList = jsonObject.getJSONArray("data"); + List voList = templateList.toJavaList(RoutineMyTemplateVo.class); + return voList; + } + + /** + * 删除微信小程序订阅消息 + * @return Boolean + */ + @Override + public Boolean delRoutineMyTemplate(String priTmplId) { + String accessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_DEL_PRIVATE_TEMPLATE_URL, accessToken); + HashMap map = new HashMap<>(); + map.put("priTmplId", priTmplId); + JSONObject jsonData = JSONObject.parseObject(JSONObject.toJSONString(map)); + String result = restTemplateUtil.postJsonData(url, jsonData); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "删除微信小程序订阅消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return Boolean.TRUE; + } + + /** + * 获取小程序平台上的标准模板 + * @param tempKey 模板编号 + * @return List + */ + @Override + public List getRoutineTemplateByWechat(String tempKey) { + String accessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_GET_TEMPLATE_URL, accessToken, tempKey); + JSONObject jsonObject = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(jsonObject)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (jsonObject.containsKey("errcode") && !jsonObject.getString("errcode").equals("0")) { + if (jsonObject.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(jsonObject, "获取小程序平台上的标准模板异常"); + throw new YztException("微信接口调用失败:" + jsonObject.getString("errcode") + jsonObject.getString("errmsg")); + } + } + JSONArray templateList = jsonObject.getJSONArray("data"); + List voList = templateList.toJavaList(RoutineTemplateKeyVo.class); + return voList; + } + + /** + * 添加小程序订阅消息 + * @param tempKey 模板编号 + * @param kidList 小程序订阅消息模板kid数组 + * @return 小程序订阅消息模板编号(自己的) + */ + @Override + public String apiAddRoutineTemplate(String tempKey, List kidList) { + String accessToken = getMiniAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_MINI_API_ADD_TEMPLATE_URL, accessToken); + HashMap map = new HashMap<>(); + map.put("tid", tempKey); + map.put("kidList", kidList); + map.put("sceneDesc", "接口添加"); + JSONObject jsonData = JSONObject.parseObject(JSONObject.toJSONString(map)); + String result = restTemplateUtil.postJsonData(url, jsonData); + JSONObject data = JSONObject.parseObject(result); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + wxExceptionDispose(data, "添加小程序订阅消息异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return data.getString("priTmplId"); + } + + + /** + * 获取JS-SDK的签名 + * @param nonceStr 随机字符串 + * @param ticket ticket + * @param timestamp 时间戳 + * @param url url + * @return 签名 + */ + private String getJsSDKSignature(String nonceStr, String ticket, Long timestamp, String url) { + //注意这里参数名必须全部小写,且必须有序 + String paramString = StrUtil.format("jsapi_ticket={}&noncestr={}×tamp={}&url={}", ticket, nonceStr, timestamp, url); + return SecureUtil.sha1(paramString); + } + + /** + * 获取JS-SDK的ticket + * 用于计算签名 + * @return ticket + */ + private String getJsApiTicket() { + boolean exists = redisUtil.exists(WeChatConstants.REDIS_PUBLIC_JS_API_TICKET); + if (exists) { + Object ticket = redisUtil.get(WeChatConstants.REDIS_PUBLIC_JS_API_TICKET); + return ticket.toString(); + } + String accessToken = getPublicAccessToken(); + String url = StrUtil.format(WeChatConstants.WECHAT_PUBLIC_JS_TICKET_URL, accessToken); + JSONObject data = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(data, "微信获取JS-SDK的ticket异常"); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + String ticket = data.getString("ticket"); + redisUtil.set(WeChatConstants.REDIS_PUBLIC_JS_API_TICKET, ticket, WeChatConstants.REDIS_PUBLIC_JS_API_TICKET_EXPRESS, TimeUnit.SECONDS); + return ticket; + } + + /** + * 获取微信accessToken + * @param appId appId + * @param secret secret + * @param type mini-小程序,public-公众号,app-app + * @return WeChatAccessTokenVo + */ + private WeChatAccessTokenVo getAccessToken(String appId, String secret, String type) { + String url = StrUtil.format(WeChatConstants.WECHAT_ACCESS_TOKEN_URL, appId, secret); + JSONObject data = restTemplateUtil.getData(url); + if (ObjectUtil.isNull(data)) { + throw new YztException("微信平台接口异常,没任何数据返回!"); + } + if (data.containsKey("errcode") && !data.getString("errcode").equals("0")) { + if (data.containsKey("errmsg")) { + // 保存到微信异常表 + wxExceptionDispose(data, StrUtil.format("微信获取accessToken异常,{}端", type)); + throw new YztException("微信接口调用失败:" + data.getString("errcode") + data.getString("errmsg")); + } + } + return JSONObject.parseObject(data.toJSONString(), WeChatAccessTokenVo.class); + } + + /** + * 微信异常处理 + * @param jsonObject 微信返回数据 + * @param remark 备注 + */ + private void wxExceptionDispose(JSONObject jsonObject, String remark) { + WechatExceptions wechatExceptions = new WechatExceptions(); + wechatExceptions.setErrcode(jsonObject.getString("errcode")); + wechatExceptions.setErrmsg(StrUtil.isNotBlank(jsonObject.getString("errmsg")) ? jsonObject.getString("errmsg") : ""); + wechatExceptions.setData(jsonObject.toJSONString()); + wechatExceptions.setRemark(remark); + wechatExceptions.setCreateTime(DateUtil.date()); + wechatExceptions.setUpdateTime(DateUtil.date()); + wechatExceptionsService.save(wechatExceptions); + } + + /** + * 微信支付异常处理 + * @param map 微信返回数据 + * @param remark 备注 + */ + private void wxPayExceptionDispose(HashMap map, String remark) { + WechatExceptions wechatExceptions = new WechatExceptions(); + String returnCode = (String) map.get("return_code"); + if (returnCode.toUpperCase().equals("FAIL")) { + wechatExceptions.setErrcode("-100"); + wechatExceptions.setErrmsg(map.get("return_msg").toString()); + } else { + wechatExceptions.setErrcode(map.get("err_code").toString()); + wechatExceptions.setErrmsg(map.get("err_code_des").toString()); + } + wechatExceptions.setData(JSONObject.toJSONString(map)); + wechatExceptions.setRemark(remark); + wechatExceptions.setCreateTime(DateUtil.date()); + wechatExceptions.setUpdateTime(DateUtil.date()); + wechatExceptionsService.save(wechatExceptions); + } + + /** + * 微信支付查询异常处理 + * @param record 微信返回数据 + * @param remark 备注 + */ + private void wxPayQueryExceptionDispose(MyRecord record, String remark) { + WechatExceptions wechatExceptions = new WechatExceptions(); + if (record.getStr("return_code").toUpperCase().equals("FAIL")) { + wechatExceptions.setErrcode("-200"); + wechatExceptions.setErrmsg(record.getStr("return_msg")); + } else if (record.getStr("result_code").toUpperCase().equals("FAIL")) { + wechatExceptions.setErrcode(record.getStr("err_code")); + wechatExceptions.setErrmsg(record.getStr("err_code_des")); + } else if (!record.getStr("trade_state").toUpperCase().equals("SUCCESS")) { + wechatExceptions.setErrcode("-201"); + wechatExceptions.setErrmsg(record.getStr("trade_state")); + } + wechatExceptions.setData(JSONObject.toJSONString(record.getColumns())); + wechatExceptions.setRemark(remark); + wechatExceptions.setCreateTime(DateUtil.date()); + wechatExceptions.setUpdateTime(DateUtil.date()); + wechatExceptionsService.save(wechatExceptions); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPayInfoServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPayInfoServiceImpl.java new file mode 100644 index 0000000..fa5f3b2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPayInfoServiceImpl.java @@ -0,0 +1,35 @@ +package com.yzt.service.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yzt.common.model.wechat.WechatPayInfo; +import com.yzt.service.mapper.WechatPayInfoMapper; +import com.yzt.service.service.WechatPayInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * WechatPayInfoServiceImpl 接口实现 + * fw_ + */ +@Service +public class WechatPayInfoServiceImpl extends ServiceImpl implements WechatPayInfoService { + + @Resource + private WechatPayInfoMapper mapper; + + /** + * 获取详情(商户订单号) + * @param outTradeNo 商户订单号 + * @return WechatPayInfo + */ + @Override + public WechatPayInfo getByNo(String outTradeNo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(WechatPayInfo::getOutTradeNo, outTradeNo); + return mapper.selectOne(lqw); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatProgramMyTempServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatProgramMyTempServiceImpl.java new file mode 100644 index 0000000..41e13d7 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatProgramMyTempServiceImpl.java @@ -0,0 +1,123 @@ +package com.yzt.service.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.constants.Constants; +import com.yzt.common.model.user.UserToken; +import com.yzt.common.model.wechat.WechatProgramMyTemp; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.WechatProgramMyTempSearchRequest; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.vo.ProgramTempKeywordsVo; +import com.yzt.common.vo.ProgramTemplateMessageVo; +import com.yzt.common.vo.SendProgramTemplateMessageItemVo; +import com.yzt.service.mapper.WechatProgramMyTempMapper; +import com.yzt.service.service.UserTokenService; +import com.yzt.service.service.WechatProgramMyTempService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +/** + * WechatProgramMyTempServiceImpl 接口实现 + * + */ +@Service +public class WechatProgramMyTempServiceImpl extends ServiceImpl implements WechatProgramMyTempService { + + @Resource + private WechatProgramMyTempMapper mapper; + + @Autowired + private UserTokenService userTokenService; + + @Autowired + private RedisUtil redisUtil; + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + + //带 WechatProgramMyTemp 类的多条件查询 + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + //模板标题模糊查询,其余精确查询 + if (StringUtils.isNotBlank(request.getTitle())) { + lambdaQueryWrapper.like(WechatProgramMyTemp::getTitle, request.getTitle()); + } + + if (StringUtils.isNotBlank(request.getTempId())) { + lambdaQueryWrapper.eq(WechatProgramMyTemp::getTempId, request.getTempId()); + } + + if (null != request.getStatus()) { + lambdaQueryWrapper.eq(WechatProgramMyTemp::getStatus, request.getStatus()); + } + + if (StringUtils.isNotBlank(request.getType())) { + lambdaQueryWrapper.eq(WechatProgramMyTemp::getType, request.getType()); + } + if (null != request.getId()) { + lambdaQueryWrapper.eq(WechatProgramMyTemp::getId, request.getId()); + } + + lambdaQueryWrapper.orderByDesc(WechatProgramMyTemp::getUpdateTime); + return mapper.selectList(lambdaQueryWrapper); + } + + @Override + public void push(int myTempId, HashMap map, Integer userId) { + // 查询对应id并且状态启用的模版 + WechatProgramMyTempSearchRequest pram = new WechatProgramMyTempSearchRequest(); +// pram.setTempId(tempKey+""); + pram.setId(myTempId); + pram.setStatus(true); + List existMyTemps = getList(pram, new PageParamRequest()); + if (null == existMyTemps) { + return; + } + WechatProgramMyTemp wechatProgramMyTemp = null; + if (existMyTemps.size() >= 1) wechatProgramMyTemp = existMyTemps.get(0); + if (wechatProgramMyTemp == null || StringUtils.isBlank(wechatProgramMyTemp.getKid())) { + return; + } + + //拿到三方登录绑定的token + UserToken UserToken = userTokenService.getTokenByUserId(userId, Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM); + + if (null == UserToken || StringUtils.isBlank(UserToken.getToken())) { + return; + } + + ProgramTemplateMessageVo programTemplateMessageVo = new ProgramTemplateMessageVo(); + programTemplateMessageVo.setTemplate_id(wechatProgramMyTemp.getTempId()); + + //组装关键字数据 + HashMap hashMap = new HashMap<>(); + List programTempKeywordsVoList = JSONArray.parseArray(wechatProgramMyTemp.getExtra(), ProgramTempKeywordsVo.class); + for (ProgramTempKeywordsVo programTempKeywordsVo : programTempKeywordsVoList) { + if (StringUtils.isBlank(map.get(programTempKeywordsVo.getKey()))) { + continue; + } + hashMap.put(programTempKeywordsVo.getSendKey(), new SendProgramTemplateMessageItemVo(map.get(programTempKeywordsVo.getKey()))); + } + + programTemplateMessageVo.setData(hashMap); + programTemplateMessageVo.setTouser(UserToken.getToken()); + redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PROGRAM, JSONObject.toJSONString(programTemplateMessageVo)); + } +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPublicServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPublicServiceImpl.java new file mode 100644 index 0000000..ccb6cfb --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatPublicServiceImpl.java @@ -0,0 +1,74 @@ +package com.yzt.service.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.WeChatConstants; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.service.WechatNewService; +import com.yzt.service.service.WechatPublicService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 微信公众号Service实现类 + * + */ +@Service +public class WechatPublicServiceImpl implements WechatPublicService { + + @Autowired + private RedisUtil redisUtil; + + @Autowired + private WechatNewService wechatNewService; + + /** + * 获取公众号自定义菜单 + * @return Object + */ + @Override + public Object getCustomizeMenus() { + Object list = redisUtil.get(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + if (list == null || list.equals("")) { + //如果没有, 去读取 + JSONObject tagsList = wechatNewService.getPublicCustomMenu(); + redisUtil.set(WeChatConstants.REDIS_PUBLIC_MENU_KEY, tagsList); + list = tagsList; + } + return list; + } + + /** + * 保存自定义菜单 + * @param data 菜单json + * @return Boolean + */ + @Override + public Boolean createMenus(String data) { + Boolean create = wechatNewService.createPublicCustomMenu(data); + if (!create) { + return create; + } + // 清除历史缓存 + if (redisUtil.exists(WeChatConstants.REDIS_PUBLIC_MENU_KEY)) { + redisUtil.delete(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + } + return create; + } + + /** + * 删除自定义菜单 + * @return Boolean + */ + @Override + public Boolean deleteMenus() { + Boolean delete = wechatNewService.deletePublicCustomMenu(); + if (!delete) { + return delete; + } + // 清除历史缓存 + if (redisUtil.exists(WeChatConstants.REDIS_PUBLIC_MENU_KEY)) { + redisUtil.delete(WeChatConstants.REDIS_PUBLIC_MENU_KEY); + } + return delete; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatReplyServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatReplyServiceImpl.java new file mode 100644 index 0000000..829417e --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatReplyServiceImpl.java @@ -0,0 +1,158 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.wechat.WechatReply; +import com.yzt.common.request.PageParamRequest; +import com.yzt.common.request.WechatReplyRequest; +import com.yzt.common.request.WechatReplySearchRequest; +import com.yzt.service.mapper.WechatReplyMapper; +import com.yzt.service.service.SystemAttachmentService; +import com.yzt.service.service.WechatReplyService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * WechatReplyServiceImpl 接口实现 + * + */ +@Service +public class WechatReplyServiceImpl extends ServiceImpl implements WechatReplyService { + + @Resource + private WechatReplyMapper mapper; + + @Autowired + private SystemAttachmentService systemAttachmentService; + + + /** + * 列表 + * @param request 请求参数 + * @param pageParamRequest 分页类参数 + * @return List + */ + @Override + public List getList(WechatReplySearchRequest request, PageParamRequest pageParamRequest) { + PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit()); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + //类型 + if (StringUtils.isNotBlank(request.getType())) { + lambdaQueryWrapper.eq(WechatReply::getType, request.getType()); + } + //关键字 + if (StringUtils.isNotBlank(request.getKeywords())) { + lambdaQueryWrapper.eq(WechatReply::getKeywords, request.getKeywords()); + } + lambdaQueryWrapper.orderByDesc(WechatReply::getId); + return mapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增微信关键字回复表 + * @param wechatReply 新增参数 + */ + @Override + public Boolean create(WechatReply wechatReply) { + //检测重复 + WechatReply voByKeywords = getVoByKeywords(wechatReply.getKeywords()); + if (voByKeywords != null) { + throw new YztException(wechatReply.getKeywords() + "关键字已经存在"); + } + wechatReply.setData(systemAttachmentService.clearPrefix(wechatReply.getData())); + return save(wechatReply); + } + + /** + * 修改微信关键字回复表 + * @param wechatReply 修改参数 + */ + private Boolean updateVo(WechatReply wechatReply) { + //检测重复 + WechatReply voByKeywords = getVoByKeywords(wechatReply.getKeywords()); + + if (voByKeywords != null && !wechatReply.getId().equals(voByKeywords.getId())) { + throw new YztException(wechatReply.getKeywords() + "关键字已经存在"); + } + + wechatReply.setData(systemAttachmentService.clearPrefix(wechatReply.getData())); + wechatReply.setUpdateTime(DateUtil.date()); + return updateById(wechatReply); + } + + + /** + * 根据关键字查询数据 + * @param keywords 新增参数 + * @return WechatReply + */ + @Override + public WechatReply getVoByKeywords(String keywords) { + //检测重复 + LambdaQueryWrapper objectLambdaQueryWrapper = new LambdaQueryWrapper<>(); + objectLambdaQueryWrapper.eq(WechatReply::getKeywords, keywords); + return mapper.selectOne(objectLambdaQueryWrapper); + } + + /** + * 根据关键字查询数据 + * @param id Integer id + * @return WechatReply + */ + private WechatReply getInfoException(Integer id, boolean isTrue) { + //检测重复 + WechatReply info = getInfo(id); + if (null == info) { + throw new YztException("没有找到相关数据"); + } + + if (!info.getStatus() && isTrue) { + throw new YztException("没有找到相关数据"); + } + + return info; + } + + /** + * 根据关键字查询数据 + * @param id Integer id + * @return WechatReply + */ + @Override + public WechatReply getInfo(Integer id) { + return getById(id); + } + + /** + * 修改微信关键字回复表 + * @param wechatReplyRequest 修改参数 + */ + @Override + public Boolean updateReply(WechatReplyRequest wechatReplyRequest) { + WechatReply wechatReply = getInfoException(wechatReplyRequest.getId(), false); + BeanUtils.copyProperties(wechatReplyRequest, wechatReply); + return updateVo(wechatReply); + } + + /** + * 修改状态 + * @param id integer id + * @param status boolean 状态 + */ + @Override + public Boolean updateStatus(Integer id, Boolean status) { + WechatReply wechatReply = getInfoException(id, false); + wechatReply.setStatus(status); + return updateVo(wechatReply); + } + +} + diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatUserServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatUserServiceImpl.java new file mode 100644 index 0000000..c5c9012 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/WechatUserServiceImpl.java @@ -0,0 +1,84 @@ +package com.yzt.service.service.impl; + +import com.yzt.service.service.ArticleService; +import com.yzt.service.service.UserTokenService; +import com.yzt.service.service.WechatUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 微信用户表 服务实现类 + * + */ +@Service +public class WechatUserServiceImpl implements WechatUserService { + @Autowired + private ArticleService articleService; + +// @Lazy +// @Autowired +// private WeChatService weChatService; + + @Autowired + private UserTokenService userTokenService; + + +// /** +// * 消息推送 +// * @param userId 用户id +// * @param newsId 图文消息id +// * +// * @since 2020-04-11 +// * @return Boolean +// */ +// @Override +// public void push(String userId, Integer newsId) { +// //检查文章是否存在 +// Article article = articleService.getById(newsId); +// if(article == null){ +// throw new YztException("你选择的文章不存在!"); +// } +// +//// { +//// "touser":"od9iXwsAl3c0e3POY39awOq0nnJ4", +//// "msgtype":"news", +//// "news":{ +//// "articles": [ +//// { +//// "title":"Happy Day", +//// "description":"Is Really A Happy Day", +//// "url":"http://front.java.yzt.net:20002/articleManager", +//// "picurl":"https://wuht-1300909283.cos.ap-chengdu.myqcloud.com/image/wechat/2020/06/16/003b595d6cc544dd981d3468d5caafa38p24bq7sa7.jpg" +//// } +//// ] +//// } +//// } +// List userIdList = YztUtil.stringToArray(userId); +// List userList = userTokenService.getList(userIdList); +// if(null == userList){ +// throw new YztException("没有用户关注微信号"); +// } +// +// HashMap map = new HashMap<>(); +// map.put("msgtype", "news"); +// +// HashMap articleInfo = new HashMap<>(); +// ArrayList articleList = new ArrayList<>(); +// +// HashMap articleInfoItem = new HashMap<>(); +// +// for (UserToken userToken : userList) { +// map.put("touser", userToken.getToken()); +// +// articleInfoItem.put("title", article.getTitle()); +// articleInfoItem.put("description", article.getSynopsis()); +// articleInfoItem.put("url", article.getUrl()); //前端地址或者三方地址 +// articleInfoItem.put("picurl", article.getImageInput()); +// articleList.add(articleInfoItem); +// articleInfo.put("articles", articleList); +// map.put("news", articleInfo); +// weChatService.pushKfMessage(map); +// } +// } + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/service/impl/YlyPrintServiceImpl.java b/fightwine-service/src/main/java/com/yzt/service/service/impl/YlyPrintServiceImpl.java new file mode 100644 index 0000000..7bfa9c2 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/service/impl/YlyPrintServiceImpl.java @@ -0,0 +1,100 @@ +package com.yzt.service.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.Constants; +import com.yzt.common.exception.YztException; +import com.yzt.common.model.order.StoreOrder; +import com.yzt.common.request.YlyPrintRequest; +import com.yzt.common.request.YlyPrintRequestGoods; +import com.yzt.common.vo.StoreOrderInfoOldVo; +import com.yzt.service.service.StoreOrderInfoService; +import com.yzt.service.service.StoreOrderService; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.service.YlyPrintService; +import com.yzt.service.util.YlyUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 易联云打印订单 service + * + */ +@Service +public class YlyPrintServiceImpl implements YlyPrintService { + private static final Logger logger = LoggerFactory.getLogger(YlyPrintServiceImpl.class); + @Autowired + private StoreOrderService storeOrderService; + + @Autowired + private StoreOrderInfoService storeOrderInfoService; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private YlyUtil ylyUtil; + /** + * 易联云打印商品信息 + * + * @param orderId 订单id + * @param isAuto 是否自动打印 + */ + @Override + public void YlyPrint(String orderId,boolean isAuto) { + if(ylyUtil.checkYlyPrintStatus()){ + throw new YztException("易联云 未开启打印"); + } + // 判断是否开启自动打印 + if(isAuto && ylyUtil.checkYlyPrintAfterPaySuccess()){ + return; + } + StoreOrder exitOrder = storeOrderService.getByOderId(orderId); + if(ObjectUtil.isNull(exitOrder)){ + throw new YztException("易联云 打印时未找到 订单信息"); + } + if(!exitOrder.getPaid()){ + throw new YztException("易联云 打印时出错, 订单未支付"); + } + List exitOrderInfo = storeOrderInfoService.getOrderListByOrderId(exitOrder.getId()); + List goods = new ArrayList<>(); + for (StoreOrderInfoOldVo storeOrderInfo : exitOrderInfo) { + goods.add(new YlyPrintRequestGoods(storeOrderInfo.getInfo().getProductName() + ,storeOrderInfo.getInfo().getPrice().toString(), + storeOrderInfo.getInfo().getPayNum()+"", + exitOrder.getPayPrice().toString())); + } + + YlyPrintRequest ylyPrintRequest = new YlyPrintRequest(); + ylyPrintRequest.setBusinessName(systemConfigService.getValueByKeyException(Constants.CONFIG_KEY_SITE_NAME)); + ylyPrintRequest.setOrderNo(exitOrder.getOrderId()); + ylyPrintRequest.setDate(DateUtil.format(exitOrder.getPayTime(), Constants.DATE_FORMAT)); + ylyPrintRequest.setName(exitOrder.getRealName()); + ylyPrintRequest.setPhone(exitOrder.getUserPhone()); + ylyPrintRequest.setAddress(exitOrder.getUserAddress()); + ylyPrintRequest.setNote(exitOrder.getMark()); + + ylyPrintRequest.setGoods(goods); + ylyPrintRequest.setAmount(exitOrder.getProTotalPrice().toString()); + ylyPrintRequest.setDiscount(exitOrder.getDeductionPrice().toString()); + ylyPrintRequest.setPostal(exitOrder.getPayPostage().toString()); + ylyPrintRequest.setDeduction(exitOrder.getCouponPrice().toString()); + ylyPrintRequest.setPayMoney(exitOrder.getPayPrice().toString()); + + try { + ylyUtil.ylyPrint(ylyPrintRequest); + logger.info("易联云打印小票成功" + JSONObject.toJSONString(ylyPrintRequest)); + } catch (Exception e) { + e.printStackTrace(); + logger.error("易联云打印小票失败 " + e.getMessage()); + } + } + + +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/OnePassUtil.java b/fightwine-service/src/main/java/com/yzt/service/util/OnePassUtil.java new file mode 100644 index 0000000..4f9bd74 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/OnePassUtil.java @@ -0,0 +1,199 @@ +package com.yzt.service.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.yzt.common.constants.OnePassConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.utils.YztDateUtil; +import com.yzt.common.utils.RedisUtil; +import com.yzt.common.utils.RestTemplateUtil; +import com.yzt.common.vo.OnePassLoginVo; +import com.yzt.service.service.SystemConfigService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * 一号通工具类 + * + */ +@Component +public class OnePassUtil { + + private static final Logger logger = LoggerFactory.getLogger(OnePassUtil.class); + @Autowired + private SystemConfigService systemConfigService; + @Autowired + private RestTemplateUtil restTemplateUtil; + @Autowired + private RedisUtil redisUtil; + + /** + * 获取一号通登录对象 + * + * @return + */ + public OnePassLoginVo getLoginVo() { + String accessKey = systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_ACCESS_KEY);// 获取配置账号 + if (StrUtil.isBlank(accessKey)) { + throw new YztException("请配置一号通 应用对应的 accessKey"); + } + String secretKey = systemConfigService.getValueByKey(OnePassConstants.ONE_PASS_SECRET_KEY); //获取配置密码 + if (StrUtil.isBlank(secretKey)) { + throw new YztException("请配置一号通 应用对应的 secretKey"); + } +// String secret = SecureUtil.md5(account + SecureUtil.md5(token)); + OnePassLoginVo loginVo = new OnePassLoginVo(); + loginVo.setAccessKey(accessKey); + loginVo.setSecretKey(secretKey); + return loginVo; + } + + /** + * 获取一号通token + */ + public String getToken(OnePassLoginVo loginVo) { + boolean exists = redisUtil.exists(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + if (exists) { + Object token = redisUtil.get(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + return token.toString(); + } + // 缓存中不存在token,重新获取,存入缓存 + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add(OnePassConstants.ONE_PASS_ACCESS_KEY, loginVo.getAccessKey()); + map.add(OnePassConstants.ONE_PASS_SECRET_KEY, loginVo.getSecretKey()); + JSONObject jsonObject = postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.USER_LOGIN_URI, map, null); + String accessToken = ""; + Integer expiresIn = 0; + accessToken = OnePassConstants.ONE_PASS_USER_TOKEN_PREFIX.concat(jsonObject.getJSONObject("data").getString("access_token")); + expiresIn = jsonObject.getJSONObject("data").getInteger("expires_in"); + expiresIn = expiresIn - 1000; + redisUtil.set(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey()), accessToken, Long.valueOf(expiresIn), TimeUnit.SECONDS); + return accessToken; + } + + /** + * 获取一号通token + * + * @return + */ + public String getToken() { + OnePassLoginVo loginVo = getLoginVo(); + boolean exists = redisUtil.exists(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + if (exists) { + Object token = redisUtil.get(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + return token.toString(); + } + // 缓存中不存在token,重新获取,存入缓存 + MultiValueMap map = new LinkedMultiValueMap<>(); + map.add(OnePassConstants.ONE_PASS_ACCESS_KEY, loginVo.getAccessKey()); + map.add(OnePassConstants.ONE_PASS_SECRET_KEY, loginVo.getSecretKey()); + JSONObject jsonObject = postFrom(OnePassConstants.ONE_PASS_API_URL + OnePassConstants.USER_LOGIN_URI, map, null); + String accessToken = ""; + Long expiresIn = 0L; + accessToken = OnePassConstants.ONE_PASS_USER_TOKEN_PREFIX.concat(jsonObject.getJSONObject("data").getString("access_token")); + expiresIn = jsonObject.getJSONObject("data").getLong("expires_in"); + expiresIn = expiresIn - YztDateUtil.getTime(); + redisUtil.set(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey()), accessToken, expiresIn, TimeUnit.SECONDS); + return accessToken; + } + + /** + * 清除token + */ + public void removeToken(OnePassLoginVo loginVo) { + boolean exists = redisUtil.exists(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + if (exists) { + redisUtil.delete(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + } + } + + /** + * 清除token + */ + public void removeToken() { + OnePassLoginVo loginVo = getLoginVo(); + boolean exists = redisUtil.exists(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + if (exists) { + redisUtil.delete(StrUtil.format(OnePassConstants.ONE_PASS_TOKEN_KEY_PREFIX, loginVo.getAccessKey())); + } + } + + /** + * post请求from表单模式提交 + */ + public JSONObject postFrom(String url, MultiValueMap param, Map header) { + String result = restTemplateUtil.postFromUrlencoded(url, param, header); + logger.info("OnePass-postForm:{}", result); + return checkResult(result); + } + + public JSONObject getFrom(String url, MultiValueMap param, Map header) { + JSONObject jsonObject = restTemplateUtil.getDataForm(url, param, header); + return checkResult(jsonObject); + } + + /** + * post请求from表单模式提交 + */ + public JSONObject getData(String url, Map header) { + String result = restTemplateUtil.getData(url, header); + logger.info("OnePass-postForm:{}", result); + return checkResult(result); + } + + /** + * 检测结构请求返回的数据 + * + * @param result 接口返回的结果 + * @return JSONObject + + */ + private JSONObject checkResult(String result) { + if (StringUtils.isBlank(result)) { + throw new YztException("一号通平台接口异常,没任何数据返回!"); + } + JSONObject jsonObject = null; + try { + jsonObject = JSONObject.parseObject(result); + } catch (Exception e) { + throw new YztException("一号通平台接口异常!"); + } + if (OnePassConstants.ONE_PASS_ERROR_CODE.equals(jsonObject.getInteger("status"))) { + throw new YztException("一号通平台接口" + jsonObject.getString("msg")); + } + return jsonObject; + } + + private JSONObject checkResult(JSONObject jsonObject) { + if (ObjectUtil.isNull(jsonObject)) { + throw new YztException("一号通平台接口异常,没任何数据返回!"); + } + if (OnePassConstants.ONE_PASS_ERROR_CODE.equals(jsonObject.getInteger("status"))) { + throw new YztException("一号通平台接口" + jsonObject.getString("msg")); + } + return jsonObject; + } + + /** + * 获取请求的headerMap + * + * @param accessToken + * @return + */ + public HashMap getCommonHeader(String accessToken) { + HashMap header = CollUtil.newHashMap(); + header.put("Authorization", accessToken); + return header; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/YlyUtil.java b/fightwine-service/src/main/java/com/yzt/service/util/YlyUtil.java new file mode 100644 index 0000000..c1bdd1d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/YlyUtil.java @@ -0,0 +1,252 @@ +package com.yzt.service.util; + + +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.yzt.common.constants.YlyConstants; +import com.yzt.common.exception.YztException; +import com.yzt.common.request.YlyPrintRequest; +import com.yzt.common.request.YlyPrintRequestGoods; +import com.yzt.common.response.YlyAccessTokenResponse; +import com.yzt.common.utils.RedisUtil; +import com.yzt.service.service.SystemConfigService; +import com.yzt.service.util.yly.RequestMethod; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.net.URLEncoder; +import java.util.List; +import java.util.concurrent.TimeUnit; + + +/** 易联云 工具类 + * + **/ +@Component +public class YlyUtil { + private static final Logger logger = LoggerFactory.getLogger(YlyUtil.class); + + private YlyAccessTokenResponse ylyAccessTokenResponse; + + @Autowired + private SystemConfigService systemConfigService; + + @Autowired + private RedisUtil redisUtil; + + // 易联云颁发给开发者的应用ID + private static String client_id = ""; + // 易联云颁发给开发者的应用密钥 + private static String client_secret = ""; + // 易联云打印机设备唯一串码 + private static String machine_code = ""; + // 易联云打印机终端密钥 + private static String msign = ""; + // 是否开启打印 + private static String status = ""; + + /** + * 初始化易联云打印机并链接 + * 添加打印机 + * 参数:* @param machine_code 易联云打印机终端号 + * * @param msign 易联云打印机终端密钥 + * * @param access_token 授权的token 必要参数,有效时间35天 + */ + public void instant() { + if(ObjectUtil.isNotNull(ylyAccessTokenResponse) && StringUtils.isNotBlank(ylyAccessTokenResponse.getBody().getAccess_token())){ + return; + } + try { + client_id = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_APP_ID); + client_secret = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_APP_SECRET); + machine_code = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_APP_MACHINE_CODE); + msign = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_APP_MACHINE_MSIGN); + status = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_STATUS); + if(StringUtils.isBlank(client_id) || StringUtils.isBlank(client_secret) + || StringUtils.isBlank(machine_code) || StringUtils.isBlank(msign)){ + throw new YztException("易联云配置数据不完整"); + } + if(StringUtils.isBlank(status) || "false".equals(status)){ + return; + } + // 初始化易联云 + RequestMethod.init(client_id,client_secret); + // 获取Access Token + boolean exists = redisUtil.exists(YlyConstants.YLY_REDIS_TOKEN); + if(exists){ + Object o = redisUtil.get(YlyConstants.YLY_REDIS_TOKEN); + ylyAccessTokenResponse = JSON.parseObject(o.toString(),YlyAccessTokenResponse.class); + }else{ + ylyAccessTokenResponse = JSON.parseObject(RequestMethod.getAccessToken(),YlyAccessTokenResponse.class); + redisUtil.set(YlyConstants.YLY_REDIS_TOKEN,JSON.toJSONString(ylyAccessTokenResponse),30L, TimeUnit.DAYS); + } + + logger.info("获取的易联云AccessToken:"+JSON.toJSONString(ylyAccessTokenResponse)); + String addedPrint = RequestMethod.getInstance().addPrinter(machine_code, msign, ylyAccessTokenResponse.getBody().getAccess_token()); + logger.info("添加打印机结果:"+addedPrint); + }catch (Exception e){ + logger.error("添加易联云打印机失败"+e.getMessage()); + logger.error(String.format("易联云 配置参数 client_id=%s client_secret=%s machine_code=%s msign=%s",client_id,client_secret,machine_code,msign)); + } + + } + + /** + * 设置内置语音接口 设置了易联云也不会播放 暂时停用 + * 注意: 仅支持K4-WA、K4-GAD、K4-WGEAD、k6型号(除k6-wh外) + * RequestMethod.getInstance().printerSetVoice(String access_token,String machine_code,String content,String is_file,String aid,String origin_id) + * 参数:* @param access_token 授权的token 必要参数 + * * @param machine_code 易联云打印机终端号 + * * @param content 播报内容 , 音量(1~9) , 声音类型(0,1,3,4) 组成json ! 示例 ["测试",9,0] 或者是在线语音链接! 语音内容请小于24kb + * * @param is_file true or false , 判断content是否为在线语音链接,格式MP3 + * * @param aid 0~9 , 定义需设置的语音编号,若不提交,默认升序 + * * @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + */ + public void ylyVoice() throws Exception { + instant(); + RequestMethod.getInstance().printerSetVoice( + ylyAccessTokenResponse.getBody().getAccess_token(), + machine_code,"[\"YZT 来新单了\",9,0]","false", + "0","ORDER xxx"); + logger.info("设置语音成功"); + } + + /** + * 声音调节接口 + * RequestMethod.getInstance().printSetSound(String access_token,String machine_code,String response_type,String voice) + * 参数:* @param access_token 授权的token 必要参数 + * * @param machine_code 易联云打印机终端号 + * * @param response_type 蜂鸣器:buzzer,喇叭:horn + * * @param voice [0,1,2,3] 4种音量设置 + */ + public void ylySetSound(String responseType,String volume) throws Exception { + instant(); + RequestMethod.getInstance().printSetSound(ylyAccessTokenResponse.getBody().getAccess_token(), + machine_code,responseType,volume); + logger.info("设置音量成功"); + } + + /** + * 取消所有未打印订单 + * RequestMethod.getInstance().printCancelAll(String access_token,String machine_code) + * 参数:* @param access_token 授权的token 必要参数 + * * @param machine_code 易联云打印机终端号 + */ + public void ylyCancelAll() throws Exception { + instant(); + String cancelAllPrint = RequestMethod.getInstance().printCancelAll(ylyAccessTokenResponse.getBody().getAccess_token(), machine_code); + logger.info("取消掉所有打印订单"+cancelAllPrint); + } + + + /** + * 文本打印 + * 参数:* @param access_token 授权的token 必要参数 + * * @param machine_code 易联云打印机终端号 + * * @param content 打印内容(需要urlencode),排版指令详见打印机指令 + * * @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + * String printContent = "一段美好的文字"; + * @throws Exception 打印方式 + */ + public void ylyPrint(YlyPrintRequest ylyPrintRequest) throws Exception { + instant(); + String printSb = "
"+ylyPrintRequest.getBusinessName()+"
" + + "********************************" + + "订单编号:" + ylyPrintRequest.getOrderNo()+"\n"+ + "日 期:" + ylyPrintRequest.getDate()+"\n"+ + "姓 名:" + ylyPrintRequest.getName()+"\n"+ + "电 话:" + ylyPrintRequest.getPhone()+"\n"+ + "地 址:" + ylyPrintRequest.getAddress()+"\n"+ + "订单备注:"+ ylyPrintRequest.getNote()+"\n" + + "********************************\n" + + "" + + "商品名称 单价 数量 金额\n" + + "" + ylyPrintFormatGoodsList(ylyPrintRequest.getGoods())+ + "" + + "********************************\n" + + "" + + "合计:¥"+ ylyPrintRequest.getAmount()+"元,优惠:¥"+ylyPrintRequest.getDiscount()+"元" + + "邮费:¥"+ylyPrintRequest.getPostal()+"元,抵扣:¥"+ylyPrintRequest.getDeduction()+"元" + + "" + + "实际支付:¥"+ylyPrintRequest.getPayMoney()+"元" + + "
完
"; + RequestMethod.getInstance().printIndex(ylyAccessTokenResponse.getBody().getAccess_token(),machine_code, + URLEncoder.encode(printSb, "utf-8"),"order111"); + } + + /** + * 付款成后打印易联云订单 + */ + public boolean checkYlyPrintAfterPaySuccess(){ + String printAuto = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_AUTO_STATUS); + return !StringUtils.isBlank(printAuto) && "'0'".equals(printAuto); + } + + /** + * 检查是否开启打印 + */ + public boolean checkYlyPrintStatus(){ + String printAuto = systemConfigService.getValueByKey(YlyConstants.YLY_PRINT_STATUS); + return !StringUtils.isBlank(printAuto) && "'0'".equals(printAuto); + } + + /** + * 格式化商品详情打印格式 + * @param goods 待格式化的商品详情 + * @return 格式化后的商品详情 + */ + public String ylyPrintFormatGoodsList(List goods){ + StringBuilder printGoodsString = new StringBuilder(); + for (YlyPrintRequestGoods goood : goods) { + printGoodsString.append(goood.getGoodsName()); + printGoodsString.append(" ").append(goood.getUnitPrice()); + printGoodsString.append(" ").append(goood.getNum()); + printGoodsString.append(" ").append(goood.getMoney()).append("\n"); + } + return printGoodsString.toString(); + } + + public static void main(String[] args) throws Exception { + YlyUtil ylyUtil = new YlyUtil(); + ylyUtil.instant(); +// ylyUtil.ylyVoice(); + // 响应类型 蜂鸣器:buzzer,喇叭:horn + // 音量大小 【1234】 +// ylyUtil.ylySetSound(EnumYly.VOLUME_RESPONSE_TYPE_FENGMINGQI.getCode(), +// EnumYly.VOLUME_RESPONSE_VOICE3.getCode()); + ylyUtil.ylyVoice(); + + + // 根据商品对象打印商品信息 +// List goods = new ArrayList<>(); +// YlyPrintRequestGoods g1 = new YlyPrintRequestGoods("红轴的机械键盘","110","1","110"); +// YlyPrintRequestGoods g2 = new YlyPrintRequestGoods("新版的Iphone18 工程机 侧面带滑轮的那种","9999","1","9999"); +// goods.add(g1); +// goods.add(g2); +// YlyPrintRequest ylyPrintRequest = new YlyPrintRequest(); +// ylyPrintRequest.setBusinessName("CRMEB Java Order"); +// ylyPrintRequest.setOrderNo("Order110"); +// ylyPrintRequest.setDate("20211127"); +//// ylyPrintRequest.setTime("12:00:00"); +// ylyPrintRequest.setName("大粽子"); +// ylyPrintRequest.setPhone("18292417675"); +// ylyPrintRequest.setAddress("陕西省 西安市 雁塔区 春林东街"); +// ylyPrintRequest.setNote("死鬼 来的是否先打电话"); +// +// ylyPrintRequest.setGoods(goods); +// ylyPrintRequest.setAmount("10109"); +// ylyPrintRequest.setDiscount("100"); +// ylyPrintRequest.setPostal("0"); +// ylyPrintRequest.setDeduction("9"); +// ylyPrintRequest.setPayMoney("10000"); +// // 执行打印 +// ylyUtil.ylyPrint(ylyPrintRequest); + + // 取消多有待打印订单 根据需求调用 +// ylyUtil.ylyCancelAll(); + + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/yly/HttpRequest.java b/fightwine-service/src/main/java/com/yzt/service/util/yly/HttpRequest.java new file mode 100644 index 0000000..f0cb968 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/yly/HttpRequest.java @@ -0,0 +1,93 @@ +package com.yzt.service.util.yly; + +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.List; +import java.util.Map; + +class HttpRequest { + public static String sendGet(String url, Map paramMap) { + String param = forMap(paramMap); + String result = ""; + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + URLConnection connection = getUrlConnection(urlNameString); + connection.connect(); + Map> map = connection.getHeaderFields(); + for (String key : map.keySet()) + System.out.println(key + "--->" + map.get(key)); + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + while ((line = in.readLine()) != null) + result = result + line; + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (in != null) + in.close(); + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return result; + } + + public static String sendPost(String url, Map paramMap) { + String param = forMap(paramMap); + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + URLConnection conn = getUrlConnection(url); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + while ((line = in.readLine()) != null) + result.append(line); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (out != null) + out.close(); + if (in != null) + in.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return result.toString(); + } + + private static URLConnection getUrlConnection(String url) throws IOException { + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setConnectTimeout(30000); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + return conn; + } + + private static String forMap(Map paramMap) { + String reqStr = ""; + if (null != paramMap && !paramMap.isEmpty()) { + for (Map.Entry entry : paramMap.entrySet()) { + System.out.println("key = " + (String)entry.getKey() + ", value = " + (String)entry.getValue()); + reqStr = (String)entry.getKey() + "=" + (String)entry.getValue() + "&" + reqStr; + } + reqStr = reqStr.substring(0, reqStr.length() - 1); + } + return reqStr; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/yly/RequestMethod.java b/fightwine-service/src/main/java/com/yzt/service/util/yly/RequestMethod.java new file mode 100644 index 0000000..49c0770 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/yly/RequestMethod.java @@ -0,0 +1,529 @@ +package com.yzt.service.util.yly; + +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class RequestMethod { + private static String example = "{\"error\":\"20\",\"error_description\":\"success\",\"body\":\"\"}"; + + public static String ClientId; + + public static String ClientSecret; + + private static final RequestMethod singleton = new RequestMethod(); + + public static RequestMethod getInstance() { + return singleton; + } + + public static void init(String client_id, String client_secret) { + ClientId = client_id; + ClientSecret = client_secret; + } + + private static boolean CCIsNull(String client_id, String client_secret) { + if (ClientId != null && ClientSecret != null && !ClientId.equals("") && !ClientSecret.equals("")) + return true; + return false; + } + + public String getCodeOpen(String redirect_uri) { + if (ClientId != null && !ClientId.equals("")) + return UtilUrl.openType + "?response_type=code&client_id=" + ClientId + "&redirect_uri=" + redirect_uri + "&state=1"; + return example; + } + + public String getOpenAccessToken(String code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("client_id", ClientId); + paramMap.put("grant_type", "authorization_code"); + paramMap.put("sign", sign); + paramMap.put("code", code); + paramMap.put("scope", "all"); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + return HttpRequest.sendPost(UtilUrl.freeType, paramMap); + } + return example; + } + + public static String getAccessToken() throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("client_id", ClientId); + paramMap.put("grant_type", "client_credentials"); + paramMap.put("sign", sign); + paramMap.put("scope", "all"); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + return HttpRequest.sendPost(UtilUrl.freeType, paramMap); + } + return example; + } + + public String getRefreshAccessToken(String refresh_token) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("refresh_token", refresh_token); + paramMap.put("grant_type", "refresh_token"); + paramMap.put("scope", "all"); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.freeType, paramMap); + } + return example; + } + + public String addPrinter(String machine_code, String msign, String access_token) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("machine_code", machine_code); + paramMap.put("msign", msign); + paramMap.put("access_token", access_token); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.addPrinter, paramMap); + } + return example; + } + + public String addPrinter(String machine_code, String msign, String access_token, String phone, String print_name) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("machine_code", machine_code); + paramMap.put("msign", msign); + paramMap.put("access_token", access_token); + paramMap.put("phone", phone); + paramMap.put("print_name", print_name); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.addPrinter, paramMap); + } + return example; + } + + public String scanCodeModel(String machine_code, String qr_key) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("machine_code", machine_code); + paramMap.put("qr_key", qr_key); + paramMap.put("scope", "all"); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.scanCodeModel, paramMap); + } + return example; + } + + public String printIndex(String access_token, String machine_code, String content, String origin_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("content", content); + paramMap.put("origin_id", origin_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printIndex, paramMap); + } + return example; + } + + public static String picturePrintIndex(String access_token, String machine_code, String picture_url, String origin_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("picture_url", URLEncoder.encode(picture_url, "UTF-8")); + paramMap.put("origin_id", origin_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.picturePrintIndex, paramMap); + } + return example; + } + + public String expressPrintIndex(String access_token, String machine_code, String content, String origin_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("content", content); + paramMap.put("origin_id", origin_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.expressPrintIndex, paramMap); + } + return example; + } + + public String printerSetVoice(String access_token, String machine_code, String content, String is_file, String aid, String origin_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("content", content); + paramMap.put("is_file", is_file); + paramMap.put("aid", aid); + paramMap.put("origin_id", origin_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerSetVoice, paramMap); + } + return example; + } + + public String printerDeleteVoice(String access_token, String machine_code, String aid, String origin_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("aid", aid); + paramMap.put("origin_id", origin_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerDeleteVoice, paramMap); + } + return example; + } + + public String printerDeletePrinter(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerDeletePrinter, paramMap); + } + return example; + } + + public String printMenuAddPrintMenu(String access_token, String machine_code, String content) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("content", content); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printMenuAddPrintMenu, paramMap); + } + return example; + } + + public String printShutdownRestart(String access_token, String machine_code, String response_type) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("response_type", response_type); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printShutdownRestart, paramMap); + } + return example; + } + + public String printSetSound(String access_token, String machine_code, String response_type, String voice) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("response_type", response_type); + paramMap.put("voice", voice); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printSetSound, paramMap); + } + return example; + } + + public String printPrintInfo(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printPrintInfo, paramMap); + } + return example; + } + + public String printGetVersion(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printGetVersion, paramMap); + } + return example; + } + + public String printCancelAll(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printCancelAll, paramMap); + } + return example; + } + + public String printCancelOne(String access_token, String machine_code, String order_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("order_id", order_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printCancelOne, paramMap); + } + return example; + } + + public String printSetIcon(String access_token, String machine_code, String img_url) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("img_url", img_url); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printSetIcon, paramMap); + } + return example; + } + + public String printDeleteIcon(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printDeleteIcon, paramMap); + } + return example; + } + + public String printBtnPrint(String access_token, String machine_code, String response_type) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("response_type", response_type); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printBtnPrint, paramMap); + } + return example; + } + + public String printGetOrder(String access_token, String machine_code, String response_type) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("response_type", response_type); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printGetOrder, paramMap); + } + return example; + } + + public String oauthSetPushUrl(String access_token, String machine_code, String cmd, String url, String status) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("cmd", cmd); + paramMap.put("url", url); + paramMap.put("status", status); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.oauthSetPushUrl, paramMap); + } + return example; + } + + public String printerGetOrderStatus(String access_token, String machine_code, String order_id) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("order_id", order_id); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerGetOrderStatus, paramMap); + } + return example; + } + + public String printerGetOrderPagingList(String access_token, String machine_code, String page_index, String page_size) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("page_index", page_index); + paramMap.put("page_size", page_size); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerGetOrderPagingList, paramMap); + } + return example; + } + + public String printerGetPrintStatus(String access_token, String machine_code) throws Exception { + if (CCIsNull(ClientId, ClientSecret)) { + String timestamp = Utils.getTimestamp(); + String signMD5 = ClientId + timestamp + ClientSecret; + String sign = Utils.getMD5Str(signMD5); + Map paramMap = new HashMap<>(); + paramMap.put("access_token", access_token); + paramMap.put("machine_code", machine_code); + paramMap.put("client_id", ClientId); + paramMap.put("timestamp", timestamp); + paramMap.put("id", UUID.randomUUID().toString()); + paramMap.put("sign", sign); + return HttpRequest.sendPost(UtilUrl.printerGetPrintStatus, paramMap); + } + return example; + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/yly/UtilUrl.java b/fightwine-service/src/main/java/com/yzt/service/util/yly/UtilUrl.java new file mode 100644 index 0000000..6ea3e27 --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/yly/UtilUrl.java @@ -0,0 +1,55 @@ +package com.yzt.service.util.yly; + +class UtilUrl { + public static String baseUrl = "https://open-api.10ss.net/"; + + public static String openType = baseUrl + "oauth/authorize"; + + public static String freeType = baseUrl + "oauth/oauth"; + + public static String addPrinter = baseUrl + "printer/addprinter"; + + public static String scanCodeModel = baseUrl + "oauth/scancodemodel"; + + public static String printIndex = baseUrl + "print/index"; + + public static String picturePrintIndex = baseUrl + "pictureprint/index"; + + public static String expressPrintIndex = baseUrl + "expressprint/index"; + + public static String printerSetVoice = baseUrl + "printer/setvoice"; + + public static String printerDeleteVoice = baseUrl + "printer/deletevoice"; + + public static String printerDeletePrinter = baseUrl + "printer/deleteprinter"; + + public static String printMenuAddPrintMenu = baseUrl + "printmenu/addprintmenu"; + + public static String printShutdownRestart = baseUrl + "printer/shutdownrestart"; + + public static String printSetSound = baseUrl + "printer/setsound"; + + public static String printPrintInfo = baseUrl + "printer/printinfo"; + + public static String printGetVersion = baseUrl + "printer/getversion"; + + public static String printCancelAll = baseUrl + "printer/cancelall"; + + public static String printCancelOne = baseUrl + "printer/cancelone"; + + public static String printSetIcon = baseUrl + "printer/seticon"; + + public static String printDeleteIcon = baseUrl + "printer/deleteicon"; + + public static String printBtnPrint = baseUrl + "printer/btnprint"; + + public static String printGetOrder = baseUrl + "printer/getorder"; + + public static String oauthSetPushUrl = baseUrl + "oauth/setpushurl"; + + public static String printerGetOrderStatus = baseUrl + "printer/getorderstatus"; + + public static String printerGetOrderPagingList = baseUrl + "printer/getorderpaginglist"; + + public static String printerGetPrintStatus = baseUrl + "printer/getprintstatus"; +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/yly/Utils.java b/fightwine-service/src/main/java/com/yzt/service/util/yly/Utils.java new file mode 100644 index 0000000..9e5a88d --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/yly/Utils.java @@ -0,0 +1,40 @@ +package com.yzt.service.util.yly; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Utils { + public static String getMD5Str(String str) { + String re = null; + try { + byte[] tem = str.getBytes(); + MessageDigest md5 = MessageDigest.getInstance("md5"); + md5.reset(); + md5.update(tem); + byte[] encrypt = md5.digest(); + StringBuilder sb = new StringBuilder(); + for (byte t : encrypt) { + String s = Integer.toHexString(t & 0xFF); + if (s.length() == 1) + s = "0" + s; + sb.append(s); + } + re = sb.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + if (re.length() == 31) + return "0" + re; + return re; + } + + public static boolean isNull(String content) { + if (content != null && !content.equals("")) + return false; + return true; + } + + public static String getTimestamp() { + return String.valueOf(System.currentTimeMillis() / 1000L); + } +} diff --git a/fightwine-service/src/main/java/com/yzt/service/util/yly/ylyReade.md b/fightwine-service/src/main/java/com/yzt/service/util/yly/ylyReade.md new file mode 100644 index 0000000..e9f9bcc --- /dev/null +++ b/fightwine-service/src/main/java/com/yzt/service/util/yly/ylyReade.md @@ -0,0 +1,170 @@ +下请求方法在子线程中执行 + +1. 下载下方的jar包,将jar导入项目中 + +2. 需要先对RequestMethod类进行init初始化设置,配置相关易联云信息 + RequestMethod.getInstance().init(client_id,client_secret); + 参数:* @param client_id 易联云颁发给开发者的应用ID + * @param client_secret 易联云颁发给开发者的应用密钥 + +3. 开放型应用方法实例 + + RequestMethod.getInstance().getCodeOpen(String redirect_uri); + 参数:redirect_uri 开发者自身的回调地址 (需要urlencode) + + RequestMethod.getInstance().getOpenAccessToken(String code); + 参数:* @param code 授权码code + + 极速授权 仅支持开放服务 + RequestMethod.getInstance().scanCodeModel(String machine_code,String qr_key); + 参数:* @param machine_code 易联云打印机终端号 + * @param qr_key 特殊密钥(有效期为300秒) + +自有型新应用 + +获取Access Token +RequestMethod.getInstance().getAccessToken(); + +Refresh token更新Access Token +RequestMethod.getInstance().getRefreshAccessToken(String refresh_token); +参数:* @param refresh_token 更新access_token所需,有效时间35天 + +添加打印机 +RequestMethod.getInstance().addPrinter( machine_code, msign, access_token); +参数:* @param machine_code 易联云打印机终端号 +* @param msign 易联云打印机终端密钥 +* @param access_token 授权的token 必要参数,有效时间35天 + +文本打印 +RequestMethod.getInstance().printIndex(String access_token,String machine_code,String content,String origin_id); +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param content 打印内容(需要urlencode),排版指令详见打印机指令 +* @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + +图形打印 +RequestMethod.getInstance().picturePrintIndex(String access_token,String machine_code,String picture_url,String origin_id) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param picture_url 线上图片地址,格式为 jpg,jpeg,png , K4图片宽度不能超过384像素。理论上图片 (像素宽/8)*像素高 不能超过 100*1024。K5图片宽度不能超过108*8像素。理论上图片 (像素宽/8)*像素高 不能超过 200*1024。 +* @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + +面单打印 +RequestMethod.getInstance().expressPrintIndex(String access_token,String machine_code,String content,String origin_id); +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param content Json字符串 +* @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + +设置内置语音接口 +注意: 仅支持K4-WA、K4-GAD、K4-WGEAD、k6型号(除k6-wh外) +RequestMethod.getInstance().printerSetVoice(String access_token,String machine_code,String content,String is_file,String aid,String origin_id) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param content 播报内容 , 音量(1~9) , 声音类型(0,1,3,4) 组成json ! 示例 ["测试",9,0] 或者是在线语音链接! 语音内容请小于24kb +* @param is_file true or false , 判断content是否为在线语音链接,格式MP3 +* @param aid 0~9 , 定义需设置的语音编号,若不提交,默认升序 +* @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + +删除内置语音接口 +注意: 仅支持K4-WA、K4-GAD、K4-WGEAD、k6型号(除k6-wh外) +RequestMethod.getInstance().printerDeleteVoice(String access_token,String machine_code,String aid,String origin_id) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param aid 0~9 , 定义需删除的语音编号 +* @param origin_id 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母 ,且在同一个client_id下唯一。详见商户订单号 + +删除终端授权 +RequestMethod.getInstance().printerDeletePrinter(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 + +添加应用菜单 +注意: 仅支持除k4-WA,k4-WH外的k4或w1机型.唤醒应用菜单请使用打印指令 +RequestMethod.getInstance().printMenuAddPrintMenu(String access_token,String machine_code,String content) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param content json格式的应用菜单(其中url和菜单名称需要urlencode) + +关机重启接口 +RequestMethod.getInstance().printShutdownRestart(String access_token,String machine_code,String response_type) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param response_type 重启:restart,关闭:shutdown + +声音调节接口 +RequestMethod.getInstance().printSetSound(String access_token,String machine_code,String response_type,String voice) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param response_type 蜂鸣器:buzzer,喇叭:horn +* @param voice [0,1,2,3] 4种音量设置 + +获取机型打印宽度接口 +RequestMethod.getInstance().printPrintInfo(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 + +获取机型软硬件版本接口 +RequestMethod.getInstance().printGetVersion(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 + +取消所有未打印订单 +RequestMethod.getInstance().printCancelAll(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 + +取消单条未打印订单 +RequestMethod.getInstance().printCancelOne(String access_token,String machine_code,String order_id) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param order_id 通过打印接口返回的订单号 + +设置logo接口 +RequestMethod.getInstance().printSetIcon(String access_token,String machine_code,String img_url) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param img_url 图片地址,图片宽度最大为350px,文件大小不能超过40Kb + +取消logo接口 +RequestMethod.getInstance().printDeleteIcon(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 + +打印方式接口 +RequestMethod.getInstance().printBtnPrint(String access_token,String machine_code,String response_type) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param response_type 开启:btnopen,关闭:btnclose; 按键打印 + +接单拒单设置接口 +RequestMethod.getInstance().printGetOrder(String access_token,String machine_code,String response_type) +参数;* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param response_type 开启:open,关闭:close + +设置推送url接口 +RequestMethod.getInstance().oauthSetPushUrl(String access_token,String machine_code,String cmd,String url,String status) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param cmd 打印完成标识oauth_finish,接单拒单标识oauth_getOrder,终端状态标识oauth_printStatus, 按键请求标识oauth_request +* @param url 推送地址填写必须以http://或https://开头的地址。推送地址需要支持GET访问,当GET请求访问时,请直接返回{"data":"OK"},用于推送地址的可用性测试 +* @param status 开启open,关闭close + +获取订单状态接口 +RequestMethod.getInstance().printerGetOrderStatus(String access_token,String machine_code,String order_id) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param order_id 易联云订单id + +获取订单状态接口 +RequestMethod.getInstance().printerGetOrderPagingList(String access_token,String machine_code,String page_index,String page_size) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 +* @param page_index 查询条件—当前页码,暂只提供前3页数据 +* @param page_size 查询条件—每页显示条数,每页最大条数100 + +获取终端状态接口 +RequestMethod.getInstance().printerGetPrintStatus(String access_token,String machine_code) +参数:* @param access_token 授权的token 必要参数 +* @param machine_code 易联云打印机终端号 diff --git a/fightwine-service/src/main/resources/mapper/activitystyle/ActivityStyleMapper.xml b/fightwine-service/src/main/resources/mapper/activitystyle/ActivityStyleMapper.xml new file mode 100644 index 0000000..a856c47 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/activitystyle/ActivityStyleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/article/ArticleMapper.xml b/fightwine-service/src/main/resources/mapper/article/ArticleMapper.xml new file mode 100644 index 0000000..318bd7f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/article/ArticleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/category/CategoryMapper.xml b/fightwine-service/src/main/resources/mapper/category/CategoryMapper.xml new file mode 100644 index 0000000..3fe83f1 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/category/CategoryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/exception/ExceptionLogMapper.xml b/fightwine-service/src/main/resources/mapper/exception/ExceptionLogMapper.xml new file mode 100644 index 0000000..d081419 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/exception/ExceptionLogMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + id, exp_url, exp_params, exp_type, exp_controller, exp_method, exp_detail, create_time + + + diff --git a/fightwine-service/src/main/resources/mapper/express/ExpressMapper.xml b/fightwine-service/src/main/resources/mapper/express/ExpressMapper.xml new file mode 100644 index 0000000..1c896d9 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/express/ExpressMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesFreeMapper.xml b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesFreeMapper.xml new file mode 100644 index 0000000..e7c3a59 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesFreeMapper.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesMapper.xml b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesMapper.xml new file mode 100644 index 0000000..fdd9e7e --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesRegionMapper.xml b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesRegionMapper.xml new file mode 100644 index 0000000..b4f0b01 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/express/ShippingTemplatesRegionMapper.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/finance/UserExtractMapper.xml b/fightwine-service/src/main/resources/mapper/finance/UserExtractMapper.xml new file mode 100644 index 0000000..f6c7736 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/finance/UserExtractMapper.xml @@ -0,0 +1,4 @@ + + + + diff --git a/fightwine-service/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml b/fightwine-service/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml new file mode 100644 index 0000000..42412b6 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/finance/UserFundsMonitorMapper.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/finance/UserRechargeMapper.xml b/fightwine-service/src/main/resources/mapper/finance/UserRechargeMapper.xml new file mode 100644 index 0000000..f73c080 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/finance/UserRechargeMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/log/StoreProductLogMapper.xml b/fightwine-service/src/main/resources/mapper/log/StoreProductLogMapper.xml new file mode 100644 index 0000000..9b14a68 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/log/StoreProductLogMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/marketing/StoreCouponMapper.xml b/fightwine-service/src/main/resources/mapper/marketing/StoreCouponMapper.xml new file mode 100644 index 0000000..f2147cc --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/marketing/StoreCouponMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/marketing/StoreCouponUserMapper.xml b/fightwine-service/src/main/resources/mapper/marketing/StoreCouponUserMapper.xml new file mode 100644 index 0000000..73e71e7 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/marketing/StoreCouponUserMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/record/UserVisitRecordMapper.xml b/fightwine-service/src/main/resources/mapper/record/UserVisitRecordMapper.xml new file mode 100644 index 0000000..216bdfc --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/record/UserVisitRecordMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/sms/SmsRecordMapper.xml b/fightwine-service/src/main/resources/mapper/sms/SmsRecordMapper.xml new file mode 100644 index 0000000..151cf9f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/sms/SmsRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/sms/SmsTemplateMapper.xml b/fightwine-service/src/main/resources/mapper/sms/SmsTemplateMapper.xml new file mode 100644 index 0000000..8115b59 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/sms/SmsTemplateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreBargainMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreBargainMapper.xml new file mode 100644 index 0000000..4746034 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreBargainMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreBargainUserHelpMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreBargainUserHelpMapper.xml new file mode 100644 index 0000000..5344522 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreBargainUserHelpMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreBargainUserMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreBargainUserMapper.xml new file mode 100644 index 0000000..789a428 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreBargainUserMapper.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreCartMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreCartMapper.xml new file mode 100644 index 0000000..5c66a93 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreCartMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreCombinationMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreCombinationMapper.xml new file mode 100644 index 0000000..dc9ad53 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreCombinationMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreOrderInfoMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreOrderInfoMapper.xml new file mode 100644 index 0000000..73e8b93 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreOrderInfoMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreOrderInvoiceMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreOrderInvoiceMapper.xml new file mode 100644 index 0000000..df3bf1e --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreOrderInvoiceMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreOrderMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreOrderMapper.xml new file mode 100644 index 0000000..e77b479 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreOrderMapper.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreOrderStatusMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreOrderStatusMapper.xml new file mode 100644 index 0000000..bce6afc --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreOrderStatusMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StorePinkMapper.xml b/fightwine-service/src/main/resources/mapper/store/StorePinkMapper.xml new file mode 100644 index 0000000..8d32946 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StorePinkMapper.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductAttrMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrMapper.xml new file mode 100644 index 0000000..864cea9 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrMapper.xml @@ -0,0 +1,13 @@ + + + + + update fw_store_product_attr + + attr_name = #{ attrName }, + attr_values = #{ attrValues }, + type = #{ type } + + where product_id = #{ productId, jdbcType=INTEGER} + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductAttrResultMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrResultMapper.xml new file mode 100644 index 0000000..0a0c935 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrResultMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductAttrValueMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrValueMapper.xml new file mode 100644 index 0000000..608fca5 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductAttrValueMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductCouponMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductCouponMapper.xml new file mode 100644 index 0000000..d20d9bd --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductCouponMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductDescriptionMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductDescriptionMapper.xml new file mode 100644 index 0000000..9642965 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductDescriptionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductMapper.xml new file mode 100644 index 0000000..11625d8 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductRelationMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductRelationMapper.xml new file mode 100644 index 0000000..06859e2 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductRelationMapper.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductReplyMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductReplyMapper.xml new file mode 100644 index 0000000..bdf3f64 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductReplyMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreProductRuleMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreProductRuleMapper.xml new file mode 100644 index 0000000..d730a13 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreProductRuleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreSeckillMangerMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreSeckillMangerMapper.xml new file mode 100644 index 0000000..6c5fd0b --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreSeckillMangerMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/store/StoreSeckillMapper.xml b/fightwine-service/src/main/resources/mapper/store/StoreSeckillMapper.xml new file mode 100644 index 0000000..7cc1035 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/store/StoreSeckillMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemAdminMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemAdminMapper.xml new file mode 100644 index 0000000..3f3729d --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemAdminMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemAttachmentMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemAttachmentMapper.xml new file mode 100644 index 0000000..655284b --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemAttachmentMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemCityMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemCityMapper.xml new file mode 100644 index 0000000..9dfec71 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemCityMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemConfigMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemConfigMapper.xml new file mode 100644 index 0000000..68fa20a --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemFormTempMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemFormTempMapper.xml new file mode 100644 index 0000000..dbde795 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemFormTempMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemGroupDataMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemGroupDataMapper.xml new file mode 100644 index 0000000..d6f5a5f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemGroupDataMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemGroupMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemGroupMapper.xml new file mode 100644 index 0000000..bcdb3c7 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemGroupMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemMenuMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemMenuMapper.xml new file mode 100644 index 0000000..65f3be7 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemMenuMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemNotificationMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemNotificationMapper.xml new file mode 100644 index 0000000..e10558f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemNotificationMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemPermissionsMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemPermissionsMapper.xml new file mode 100644 index 0000000..14bdde0 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemPermissionsMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemRoleMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemRoleMapper.xml new file mode 100644 index 0000000..9c51cc5 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemRoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemRoleMenuMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemRoleMenuMapper.xml new file mode 100644 index 0000000..dbd3d1f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemRoleMenuMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemRolePermissionsMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemRolePermissionsMapper.xml new file mode 100644 index 0000000..845863e --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemRolePermissionsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemStoreMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemStoreMapper.xml new file mode 100644 index 0000000..32e5740 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemStoreMapper.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemStoreStaffMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemStoreStaffMapper.xml new file mode 100644 index 0000000..a7b2ba6 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemStoreStaffMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/system/SystemUserLevelMapper.xml b/fightwine-service/src/main/resources/mapper/system/SystemUserLevelMapper.xml new file mode 100644 index 0000000..17aa861 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/system/SystemUserLevelMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserAddressMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserAddressMapper.xml new file mode 100644 index 0000000..ff4fcc5 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserAddressMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserBillMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserBillMapper.xml new file mode 100644 index 0000000..809c31f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserBillMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml new file mode 100644 index 0000000..eafaebb --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserBrokerageRecordMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserExperienceRecordMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserExperienceRecordMapper.xml new file mode 100644 index 0000000..57dd135 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserExperienceRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserGroupMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserGroupMapper.xml new file mode 100644 index 0000000..9e612fa --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserGroupMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserIntegralRecordMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserIntegralRecordMapper.xml new file mode 100644 index 0000000..0a10b6c --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserIntegralRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserLevelMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserLevelMapper.xml new file mode 100644 index 0000000..5cf5a79 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserLevelMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserMapper.xml new file mode 100644 index 0000000..52b1e2d --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserSignMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserSignMapper.xml new file mode 100644 index 0000000..43c5db2 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserSignMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserTagMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserTagMapper.xml new file mode 100644 index 0000000..d5ff22c --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserTagMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/user/UserTokenMapper.xml b/fightwine-service/src/main/resources/mapper/user/UserTokenMapper.xml new file mode 100644 index 0000000..059e08d --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/user/UserTokenMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/TemplateMessageMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/TemplateMessageMapper.xml new file mode 100644 index 0000000..2531a61 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/TemplateMessageMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatCallbackMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatCallbackMapper.xml new file mode 100644 index 0000000..1acee4c --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatCallbackMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatExceptionsMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatExceptionsMapper.xml new file mode 100644 index 0000000..34e0620 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatExceptionsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatPayInfoMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatPayInfoMapper.xml new file mode 100644 index 0000000..223b47a --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatPayInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatProgramMyTempMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatProgramMyTempMapper.xml new file mode 100644 index 0000000..6a7f90c --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatProgramMyTempMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatProgramPublicTempMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatProgramPublicTempMapper.xml new file mode 100644 index 0000000..f6d34f7 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatProgramPublicTempMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatQrcodeMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatQrcodeMapper.xml new file mode 100644 index 0000000..9cf6c9f --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatQrcodeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/fightwine-service/src/main/resources/mapper/wechat/WechatReplyMapper.xml b/fightwine-service/src/main/resources/mapper/wechat/WechatReplyMapper.xml new file mode 100644 index 0000000..32763f5 --- /dev/null +++ b/fightwine-service/src/main/resources/mapper/wechat/WechatReplyMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e6ec84d --- /dev/null +++ b/pom.xml @@ -0,0 +1,386 @@ + + + 4.0.0 + + com.yzt.fightwine + yzt-fightwine + 1.0-SNAPSHOT + pom + yzt-fightwine + fightwine 项目 + + fightwine-common + fightwine-admin + fightwine-service + fightwine-front + + + + org.springframework.boot + spring-boot-starter-parent + 2.5.2 + + + + + 21 + 21 + UTF-8 + 1.18.30 + 1.3.0.Final + 2.5.2 + 8.0.15 + 3.5.5 + 3.0.3 + 1.2.9 + 1.2.20 + 5.8.16 + 3.5 + 2.16.1 + 3.4 + 25.0-jre + 2.8.2 + 1.2.83 + 4.0.0-RC1 + 3.7.73.ALL + 3.10.2 + 3.0.10 + 3.4.0 + 5.6.22 + 3.1.922 + 7.2.25 + 5.4.0 + 1.5.21 + 2.9.2 + 1.5.22 + 1.9.3 + 3.9.0 + 1.3.1 + 2.0.1.Final + 4.5.13 + 4.5.2 + 3.17 + 1.4 + 2.5 + 0.4.15 + 1.6.1 + 1.4.19 + 4.0.5 + 0.0.20131108.vaadin1 + 3.5.0 + 2.5.0 + 0.9.1 + 0.9.0 + 5.9.2 + 4.3.0 + + + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + com.alibaba + druid + ${druid.version} + + + + + mysql + mysql-connector-java + ${mysql.version} + + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus.version} + + + + + junit + junit + ${junit.version} + test + + + org.springframework + spring-test + 5.3.28 + compile + + + + + io.swagger + swagger-annotations + ${swagger.version} + + + io.swagger + swagger-models + ${swagger-models.version} + + + + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.swagger + swagger-models + + + + + + + com.github.xiaoymin + swagger-bootstrap-ui + ${swagger-bootstrap-ui.version} + + + + + net.logstash.logback + logstash-logback-encoder + 5.3 + + + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + io.lettuce + lettuce-core + + + + + + + redis.clients + jedis + ${jedis.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper-spring.version} + + + org.mybatis + mybatis + + + + + + + javax.validation + validation-api + ${validation.version} + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + + org.apache.commons + commons-lang3 + ${commons-apache.version} + + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + net.coobird + thumbnailator + ${thumbnailator.version} + + + + + com.aliyun.oss + aliyun-sdk-oss + ${alipay-oss.version} + + + + + com.qcloud + cos_api + ${cos-api.version} + + + + + com.tencentcloudapi + tencentcloud-sdk-java + ${tencentcloud.version} + + + + + com.qiniu + qiniu-java-sdk + ${qiniu-java.version} + + + + + dom4j + dom4j + ${dom4j.version} + + + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + + + org.mongodb + mongodb-driver-core + ${mongodb.version} + + + com.vaadin.external.google + android-json + ${android-json.version} + compile + + + + + org.apache.httpcomponents + httpmime + ${httpmime.version} + + + + + com.google.zxing + core + ${core.version} + + + com.google.zxing + javase + ${core.version} + + + + + com.belerweb + pinyin4j + ${pinyin4j.version} + + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + com.auth0 + jwks-rsa + ${jwks-rsa.version} + + + + + com.squareup.okhttp3 + okhttp + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 17 + 17 + UTF-8 + + + + + + + + + + + \ No newline at end of file