无卡消费 后端你代码完成

parents
Pipeline #161 failed with stages
# Created by .ignore support plugin (hsz.mobi)
### Example user template template
### Example user template
# IntelliJ project files
.idea
.idea/*
*.iml
out
gen
/rebel.xml
/logs/*
/target
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>card-consume</artifactId>
<groupId>cn.wise.sc.cmbapp</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consume-business</artifactId>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.11.1</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<version>5.1.45</version>-->
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>cn.wise.sc.cmbapp</groupId>
<artifactId>common-swagger</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<!--*******************************************-->
<!--招行app使用-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.8</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<!--腾讯短信依赖-->
<dependency>
<groupId>com.github.qcloudsms</groupId>
<artifactId>qcloudsms</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>zip</nonFilteredFileExtension>
<nonFilteredFileExtension>cer</nonFilteredFileExtension>
<nonFilteredFileExtension>pfx</nonFilteredFileExtension>
<nonFilteredFileExtension>py</nonFilteredFileExtension>
<nonFilteredFileExtension>keystore</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>*.xlsx</include>
<include>*</include>
</includes>
</resource>
<resource>
<directory>src/main/java/cn/wise/sc/consume/business/mapper/xml</directory>
<filtering>true</filtering>
<includes>
<include>*.xml</include>
</includes>
<targetPath>cn/wise/sc/consume/business/mapper</targetPath>
</resource>
</resources>
</build>
</project>
\ No newline at end of file
package cn.wise.sc.consume.business;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.TimeZone;
/**
* 启动类
*
* @author zhutianwei
*
*/
@SpringBootApplication
@MapperScan("cn.wise.sc.consume.business.mapper")
public class SecurityApplication {
public static void main(String[] args) {
// 系统默认的时区
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(SecurityApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
package cn.wise.sc.consume.business.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Configuration
public class DateConfig {
/** 默认日期时间格式 */
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 默认日期格式 */
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/** 默认时间格式 */
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/**
* LocalDate转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDate> localDateConverter() {
return new Converter<String, LocalDate>() {
@Override
public LocalDate convert(String source) {
return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
}
};
}
/**
* LocalDateTime转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String source) {
return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT));
}
};
}
/**
* LocalTime转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, LocalTime> localTimeConverter() {
return new Converter<String, LocalTime>() {
@Override
public LocalTime convert(String source) {
return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
}
};
}
/**
* Date转换器,用于转换RequestParam和PathVariable参数
*/
@Bean
public Converter<String, Date> dateConverter() {
return new Converter<String, Date>() {
@Override
public Date convert(String source) {
SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
try {
return format.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
};
}
/**
* Json序列化和反序列化转换器,用于转换Post请求体中的json以及将我们的对象序列化为返回响应的json
*/
@Bean
public ObjectMapper objectMapper(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
//ObjectMapper忽略多余字段
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//LocalDateTime系列序列化和反序列化模块,继承自jsr310,我们在这里修改了日期格式
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class,new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addSerializer(LocalDate.class,new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addSerializer(LocalTime.class,new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDateTime.class,new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
javaTimeModule.addDeserializer(LocalDate.class,new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)));
javaTimeModule.addDeserializer(LocalTime.class,new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
//Date序列化和反序列化
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
SimpleDateFormat formatter = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String formattedDate = formatter.format(date);
jsonGenerator.writeString(formattedDate);
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
String date = jsonParser.getText();
try {
return format.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
});
// 注册新的模块到objectMapper
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.nio.charset.Charset;
/**
* @date :Created in 2019-03-21 10:21
* @description:用途:
*/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
private ObjectMapper objectMapper = new ObjectMapper();
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class<T> clazz;
static {
//解决fastJson autoType is not support错误
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
public FastJsonRedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return JSON.parseObject(str, clazz);
}
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
protected JavaType getJavaType(Class<?> clazz) {
return TypeFactory.defaultInstance().constructType(clazz);
}
}
package cn.wise.sc.consume.business.config;
import cn.wise.sc.consume.business.exception.BusinessException;
import cn.wise.sc.consume.business.wrapper.WrapMapper;
import cn.wise.sc.consume.business.wrapper.Wrapper;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.context.request.WebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@ControllerAdvice
@RestController
public class GlobalDefaultExceptionHandler extends AbstractErrorController {
@ExceptionHandler(value = RuntimeException.class)
@ResponseBody
public Wrapper defaultErrorHandler(HttpServletResponse response, BusinessException e) {
response.setStatus(e.getStatusCode().value());
return WrapMapper.error(e.getMessage());
}
public GlobalDefaultExceptionHandler(ErrorAttributes errorAttributes) {
super(errorAttributes);
}
private static final String ERROR_PATH = "/error";
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@RequestMapping(value = ERROR_PATH)
public Wrapper error(HttpServletRequest request) {
WebRequest webRequest = new ServletWebRequest(request);
Throwable e = getError(webRequest);
if (e == null) {
Map<String, Object> attributes = getErrorAttributes(request, false);
Object timestamp = attributes.get("timestamp");
Object status = attributes.get("status");
String error = attributes.get("error").toString();
String message = attributes.get("message").toString();
Object path = attributes.get("path");
//todo 上线后更改为error
return WrapMapper.wrap(Integer.parseInt(status.toString()), message);
}else {
return WrapMapper.error(e.getMessage());
}
}
private Throwable getError(WebRequest webRequest) {
return (Throwable) this.getAttribute(webRequest, "javax.servlet.error.exception");
}
private Object getAttribute(RequestAttributes requestAttributes, String name) {
return requestAttributes.getAttribute(name, 0);
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class MapStringTypeHandler<T> extends BaseTypeHandler<Map<String, T>> {
private Class<T> clazz;
//private static final TypeReference<HashMap<String, String>> mapStrStrTypeRef = new TypeReference<HashMap<String, String>>(){};
private final TypeReference<HashMap<String, T>> typeRef = new TypeReference<HashMap<String, T>>() {
};
public MapStringTypeHandler(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String, T> parameter, JdbcType jdbcType) throws SQLException {
String json = JSON.toJSONString(parameter);
ps.setString(i, json);
}
@Override
public Map<String, T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
return parseJson(rs.getString(columnName));
}
@Override
public Map<String, T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return parseJson(rs.getString(columnIndex));
}
@Override
public Map<String, T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return parseJson(cs.getString(columnIndex));
}
private Map<String, T> parseJson(String json) {
if (String.class == clazz || Integer.class == clazz || Boolean.class == clazz) {
return JSON.parseObject(json, typeRef);
}
Map<String, T> result = new HashMap<>();
JSON.parseObject(json).forEach((k, v) -> result.put(k, JSON.parseObject(JSON.toJSONString(v), clazz)));
return result;
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author miemie
* @since 2018-08-10
*/
@Configuration
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
// 开启 count 的 join 优化,只针对 left join !!!
return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));
}
}
package cn.wise.sc.consume.business.config;
import com.alibaba.fastjson.parser.ParserConfig;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
* @description:用途: @EnableCaching 开启声明式缓存支持. 之后就可以使用 @Cacheable/@CachePut/@CacheEvict 注解缓存数据.
*/
@Configuration
@EnableCaching
public class RedisCacheConfig {
private RedisConnectionFactory redisConnectionFactory;
public RedisCacheConfig(RedisConnectionFactory redisConnectionFactory) {
this.redisConnectionFactory = redisConnectionFactory;
}
// @Bean
// public Jedis jedis() {
// JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// jedisPoolConfig.setMaxTotal(80);
// jedisPoolConfig.setMinIdle(20);
// jedisPoolConfig.setMaxIdle(80);
// JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
// return jedisPool.getResource();
// }
/**
* 覆盖默认的配置
*
* @return RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// 设置value的序列化规则和key的序列化规则
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
template.setDefaultSerializer(fastJsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* 解决注解方式存放到redis中的值是乱码的情况
*
* @param factory
* @return CacheManager
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// 配置注解方式的序列化
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
RedisCacheConfiguration redisCacheConfiguration =
config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer))
//配置注解默认的过期时间
.entryTtl(Duration.ofDays(1));
// 加入白名单 https://github.com/alibaba/fastjson/wiki/enable_autotype
ParserConfig.getGlobalInstance().addAccept("cn.wise");
return RedisCacheManager.builder(factory).cacheDefaults(redisCacheConfiguration).build();
}
}
package cn.wise.sc.consume.business.config;
import cn.wise.sc.consume.business.util.GlobalHolder;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 上下文初始化
* 以及跨域的支持
*/
public class RequestInterceptor extends HandlerInterceptorAdapter {
/**
* 拦截request和response并放到上下文中
* @param request 要拦截的request
* @param response 要拦截的response
* @param handler spring 机制传递过来的
* @return 不中断,继续执行,返回为true
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//request 和response存到 上下文中
GlobalHolder.setHttpResponse(response);
GlobalHolder.setHttpRequest(request);
return super.preHandle(request, response, handler);
}
/**
* 处理完成 从上下文中移除 request 和respseon
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
GlobalHolder.remove();
super.afterCompletion(request, response, handler, ex);
}
}
package cn.wise.sc.consume.business.config;
import cn.wise.sc.consume.business.security.*;
import cn.wise.sc.consume.business.security.jwt.JwtAuthenticationProvider;
import cn.wise.sc.consume.business.security.jwt.JwtUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
import org.springframework.security.web.header.Header;
import org.springframework.security.web.header.writers.StaticHeadersWriter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import java.util.Arrays;
/**
* spring security配置
*
* @author zhutianwei
*/
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
// 基于token,所以不需要session
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.authorizeRequests()
.antMatchers("/", "/*.html", "/favicon.ico", "/css/**", "/js/**", "/fonts/**", "/layui/**", "/img/**",
"/v2/api-docs/**", "/swagger-resources/**", "/webjars/**", "/pages/**", "/druid/**",
"/statics/**", "/login/**","/test-websocket/**","/testWebsocket/**","/common/**","/cmbOneNet/**")
.permitAll().anyRequest().authenticated()
.and()
.formLogin().disable()
.sessionManagement().disable()
.cors()
.and()
.headers()
.addHeaderWriter(
new StaticHeadersWriter(
Arrays.asList(
new Header("Access-control-Allow-Origin", "*"),
new Header("Access-Control-Expose-Headers", "Authorization"))))
.and()
.addFilterAfter(new OptionsRequestFilter(), CorsFilter.class)
.apply(new JsonLoginConfigurer<>()).loginSuccessHandler(jsonLoginSuccessHandler())
.and()
.apply(new JwtLoginConfigurer<>()).tokenValidSuccessHandler(jwtRefreshSuccessHandler())
.and()
.logout()
// .logoutUrl("/logout") //默认就是"/logout"
.addLogoutHandler(tokenClearLogoutHandler())
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
.and()
.sessionManagement().disable();
// 解决不允许显示在iframe的问题
http.headers().frameOptions().disable();
http.headers().cacheControl();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder())
.and().authenticationProvider(jwtAuthenticationProvider());
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean("jwtAuthenticationProvider")
protected AuthenticationProvider jwtAuthenticationProvider() {
return new JwtAuthenticationProvider(userService);
}
@Bean("daoAuthenticationProvider")
protected AuthenticationProvider daoAuthenticationProvider() throws Exception {
//这里会默认使用BCryptPasswordEncoder比对加密后的密码,注意要跟createUser时保持一致
DaoAuthenticationProvider daoProvider = new DaoAuthenticationProvider();
daoProvider.setUserDetailsService(userDetailsService());
return daoProvider;
}
@Autowired
JwtUserService userService;
@Override
protected UserDetailsService userDetailsService() {
return userService;
}
@Bean
protected JsonLoginSuccessHandler jsonLoginSuccessHandler() {
return new JsonLoginSuccessHandler(userService);
}
@Bean
protected JwtRefreshSuccessHandler jwtRefreshSuccessHandler() {
return new JwtRefreshSuccessHandler(userService);
}
@Bean
protected TokenClearLogoutHandler tokenClearLogoutHandler() {
return new TokenClearLogoutHandler(userService);
}
@Bean
protected CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("GET", "POST", "HEAD", "OPTION"));
configuration.setAllowedHeaders(Arrays.asList("*"));
configuration.addExposedHeader("Authorization");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
package cn.wise.sc.consume.business.config;
import cn.wise.sc.consume.business.filter.SwaggerInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.MappedInterceptor;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.*;
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.List;
import static com.google.common.collect.Lists.newArrayList;
@Configuration
@EnableSwagger2
public class Swagger2Configuration {
//api接口包扫描路径
public static final String SWAGGER_SCAN_BASE_PACKAGE = "cn.wise.sc.consume";
public static final String VERSION = "1.0.0";
/*@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).groupName("swagger接口文档")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
.paths(PathSelectors.any()) // 可以根据url路径设置哪些请求加入文档,忽略哪些请求
.securitySchemes(newArrayList(apiKey()))
.securityContexts(newArrayList(securityContext()))
.enableUrlTemplating(false)
.build(); //.host("192.168.110.84/consume");
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger接口文档") //设置文档的标题
.contact(new Contact("Wisenergy", "http://www.wisenergy.cn/", "service@wisenergy.cn"))
.description("cmb接口服务 API 接口文档") // 设置文档的描述
.version(VERSION) // 设置文档的版本信息-> 1.0.0 Version information
.termsOfServiceUrl("http://www.wisenergy.cn") // 设置文档的License信息->1.3 License information
.build();
}
*/
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2).groupName("swagger接口文档")
.apiInfo(new ApiInfoBuilder().title("swagger接口文档")
.contact(new Contact("Wisenergy", "http://www.wisenergy.cn/", "service@wisenergy.cn")).version("1.0").build())
.select().paths(PathSelectors.any()).build()
.securitySchemes(newArrayList(apiKey()))
.securityContexts(newArrayList(securityContext()))
.enableUrlTemplating(false)
;
}
private ApiKey apiKey() {
return new ApiKey("BearerToken", "Authorization", "header");
}
private SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("/.*"))
.build();
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return newArrayList(new SecurityReference("BearerToken", authorizationScopes));
}
@Value("${swagger.basic.username}")
private String username;
@Value("${swagger.basic.password}")
private String password;
/* 必须在此处配置拦截器,要不然拦不到swagger的静态资源 */
@Bean
@ConditionalOnProperty(name = "swagger.basic.enable", havingValue = "true")
public MappedInterceptor getMappedInterceptor() {
return new MappedInterceptor(new String[]{"/swagger-ui.html", "/webjars/**"}, new SwaggerInterceptor(username, password));
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.config;
/**
* top地址相关配置
*
* @author openapi@dingtalk
* @date 2020/2/4
*/
public class UrlConstant {
private static final String HOST = "https://oapi.dingtalk.com";
/**
* 钉钉网关 gettoken 地址
*/
public static final String URL_GET_TOKEN = HOST + "/gettoken";
/**
* 获取 jsapi_ticket 地址
*/
public static final String URL_GET_JSTICKET = HOST + "/get_jsapi_ticket";
/**
* 获取用户在企业内 userId 的接口URL
*/
public static final String URL_GET_USER_INFO = HOST + "/user/getuserinfo";
/**
* 获取用户姓名的接口URL
*/
public static final String URL_USER_GET = HOST + "/user/get";
/**
* 获取部门列表接口URL
*/
public static final String URL_DEPARTMENT_LIST = HOST + "/department/list";
/**
* 获取部门用户接口URL
*/
public static final String URL_USER_SIMPLELIST = HOST + "/user/simplelist";
}
package cn.wise.sc.consume.business.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 加载自定义的 拦截器
*/
@Configuration
public class WebInterceptorConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/**");
}
}
package cn.wise.sc.consume.business.config.lock;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
public interface DistributedLocker {
RLock lock(String lockKey);
RLock lock(String lockKey, int timeout);
RLock lock(String lockKey, TimeUnit unit, int timeout);
boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);
void unlock(String lockKey);
void unlock(RLock lock);
<T> T executeLock(String key, Function<String, T> consumer, String t);
<T> void executeLock(String lockKey, Consumer<T> consumer, T t);
}
\ No newline at end of file
package cn.wise.sc.consume.business.config.lock;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
public class RedissLockUtil {
private static DistributedLocker redissLock;
public static void setLocker(DistributedLocker locker) {
redissLock = locker;
}
public static RLock lock(String lockKey) {
return redissLock.lock(lockKey);
}
public static <T> T readWriteLock(String lockKey, Function<String,T> function) {
return redissLock.executeLock(lockKey,function,null);
}
public static <T> void playersLock(String lockKey, Consumer<T> consumer,T t){
redissLock.executeLock(lockKey,consumer,null);
}
public static void unlock(String lockKey) {
redissLock.unlock(lockKey);
}
public static void unlock(RLock lock) {
redissLock.unlock(lock);
}
public static RLock lock(String lockKey, int timeout) {
return redissLock.lock(lockKey, timeout);
}
public static RLock lock(String lockKey, TimeUnit unit , int timeout) {
return redissLock.lock(lockKey, unit, timeout);
}
public static boolean tryLock(String lockKey, int waitTime, int leaseTime) {
return redissLock.tryLock(lockKey, TimeUnit.SECONDS, waitTime, leaseTime);
}
public static boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
return redissLock.tryLock(lockKey, unit, waitTime, leaseTime);
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.config.lock;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
@Slf4j
public class RedissonDistributedLocker implements DistributedLocker {
private RedissonClient redissonClient;
@Override
public RLock lock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock();
return lock;
}
@Override
public RLock lock(String lockKey, int leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(leaseTime, TimeUnit.SECONDS);
return lock;
}
@Override
public RLock lock(String lockKey, TimeUnit unit, int timeout) {
RLock lock = redissonClient.getLock(lockKey);
lock.lock(timeout, unit);
return lock;
}
@Override
public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
RLock lock = redissonClient.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
return false;
}
}
public static void realeaseLock(RLock fairLock) {
fairLock.unlock();
}
@Override
public void unlock(String lockKey) {
RLock lock = redissonClient.getLock(lockKey);
lock.unlock();
}
@Override
public void unlock(RLock lock) {
lock.unlock();
}
@Override
public <T> T executeLock(String key, Function<String, T> function, String t) {
RLock lock = redissonClient.getLock(key);
boolean locked = false;
try {
lock.lock();
return (T) function.apply(t);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return null;
}
@Override
public <T> void executeLock(String lockKey, Consumer<T> consumer, T t) {
RLock lock = redissonClient.getLock(lockKey);
boolean locked = false;
try {
while (true) {
locked = lock.tryLock();
if (locked) break;
}
if (locked) {
consumer.accept(t);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (locked) {
lock.unlock();
}
}
}
public void setRedissonClient(RedissonClient redissonClient) {
this.redissonClient = redissonClient;
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.controller;
import cn.wise.sc.consume.business.util.UserUtil;
import cn.wise.sc.consume.business.util.dfs.FastDFSUtils;
import cn.wise.sc.consume.business.util.dfs.FileTypeUtil;
import cn.wise.sc.consume.business.wrapper.WrapMapper;
import cn.wise.sc.consume.business.wrapper.Wrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 附件管理Controller
* @author ztw
*/
@Api(tags = "附件管理")
@RestController
@RequestMapping("/enclosure")
public class EntityEnclosureController {
private static final Logger logger = LoggerFactory.getLogger("adminLogger");
@Autowired
protected HttpServletResponse response;
@Autowired
protected HttpServletRequest request;
@ApiOperation(value = "单个文件上传")
@PostMapping("/fileUpLoad")
public Wrapper fileUpLoad(MultipartFile file){
Map<String,Object> map = new HashMap<>();
String filePath = null;
String fileName = null;
String extName = null;
try {
Long userId = UserUtil.getLoginUser().getId();
if(userId != null){
filePath = FastDFSUtils.uploadPic(file.getBytes(),file.getOriginalFilename(),file.getSize());
fileName = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
}else {
return WrapMapper.wrap(400,"该账号已在其他地方登陆");
}
String picUrl = filePath;
map.put("fileUrl",picUrl);
map.put("fileName",fileName);
map.put("extName",extName);
return WrapMapper.wrap(200,"成功", map);
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "单个图片上传")
@PostMapping("/imgUpLoad")
public Wrapper imgUpLoad(MultipartFile file){
Map<String,Object> map = new HashMap<>();
String filePath = null;
String fileName = null;
String extName = null;
try {
Long userId = UserUtil.getLoginUser().getId();
if(userId != null){
if(!FileTypeUtil.isImageByExtension(file.getOriginalFilename())){
return WrapMapper.wrap(400,"请上传有效图片");
}
filePath = FastDFSUtils.uploadPic(file.getBytes(),file.getOriginalFilename(),file.getSize());
fileName = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
}else {
return WrapMapper.wrap(400,"该账号已在其他地方登陆");
}
String picUrl = filePath;
map.put("fileUrl",picUrl);
map.put("fileName",fileName);
map.put("extName",extName);
return WrapMapper.wrap(200,"成功", map);
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "多个文件上传")
@PostMapping("/filesUpLoad")
public Wrapper filesUpLoad(HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
List<MultipartFile> files = null;
String filePath = null;
String fileName = null;
String extName = null;
List<Map<String,Object>> filePathList = null;
try {
filePathList = new ArrayList<>();
files = ((MultipartHttpServletRequest)request).getFiles("files");
Long userId = UserUtil.getLoginUser().getId();
if(userId != null){
if(files != null && files.size() > 0) {
for (MultipartFile file : files) {
Map<String,Object> mapSub = new HashMap<>();
filePath = FastDFSUtils.uploadPic(file.getBytes(), file.getOriginalFilename(), file.getSize());
fileName = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String picUrl = filePath;
mapSub.put("fileUrl",picUrl);
mapSub.put("fileName",fileName);
mapSub.put("extName",extName);
filePathList.add(mapSub);
}
}else {
return WrapMapper.wrap(400,"没有文件");
}
}else {
return WrapMapper.wrap(400,"该账号已在其他地方登陆");
}
map.put("status",200);
map.put("message","上传成功");
map.put("filePathList",filePathList);
return WrapMapper.wrap(200,"成功", filePathList);
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "单个文件下载")
@PostMapping("/fileDownload")
public Wrapper fileDownload(String fileUrl,String fileName,String extName){
OutputStream out = null;
try {
response.setHeader("Content-Disposition", "attachment;filename="+fileName+extName);
response.setContentType("application/force-download");
out = response.getOutputStream();
Long userId = UserUtil.getLoginUser().getId();
if(userId != null){
fileUrl = fileUrl.substring(fileUrl.indexOf("g"));
byte[] by = FastDFSUtils.fileDownload(fileUrl);
out.write(by);
out.close();
}else {
return WrapMapper.wrap(400,"该账号已在其他地方登陆");
}
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "app扫描二维码下载")
@GetMapping("/appDownload")
public Wrapper appDownload(String fileUrl){
Map<String,Object> map = new HashMap<>();
OutputStream out = null;
try {
response.setHeader("Content-Disposition", "attachment;filename=app-release.apk");
response.setContentType("application/force-download");
out = response.getOutputStream();
fileUrl = fileUrl.substring(fileUrl.indexOf("g"));
byte[] by = FastDFSUtils.fileDownload(fileUrl);
out.write(by);
out.close();
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "删除相关文件")
@PostMapping("/fileDeleted")
public Wrapper fileDeleted(String[] filePaths){
Map<String,Object> map = new HashMap<>();
String filePath = null;
boolean rel = false;
try {
Long userId = UserUtil.getLoginUser().getId();
if(userId != null){
for(String url : filePaths){
/*filePath = url.substring(0,url.indexOf("g"));*/
rel = FastDFSUtils.deletePic(url);
if(!rel){
return WrapMapper.wrap(400,"删除失败");
}
}
}else {
return WrapMapper.wrap(400,"该账号已在其他地方登陆");
}
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
logger.error(e.toString());
}
return WrapMapper.error("失败");
}
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-07-30
*/
@RestController
@RequestMapping("/business/sms-auth")
public class SmsAuthController {
}
package cn.wise.sc.consume.business.controller;
import cn.wise.sc.consume.business.entity.SysEnterprise;
import cn.wise.sc.consume.business.mapper.SysEnterpriseMapper;
import cn.wise.sc.consume.business.model.PageTableRequest;
import cn.wise.sc.consume.business.service.ISysEnterpriseService;
import cn.wise.sc.consume.business.util.RedisUtil;
import cn.wise.sc.consume.business.wrapper.WrapMapper;
import cn.wise.sc.consume.business.wrapper.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Api(tags = "企业管理")
@RestController
@RequestMapping("/business/sys-enterprise")
public class SysEnterpriseController {
private static final Logger log = LoggerFactory.getLogger("SysEnterpriseController");
@Autowired
RedisUtil redisUtil;
@Autowired
private ISysEnterpriseService enterpriseService;
@Resource
private SysEnterpriseMapper enterpriseMapper;
public String redisExample() {
redisUtil.setString("token", new Object(), 2000);
return "sucess";
}
@ApiOperation(value = "企业列表")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "current", value = "当前页数(从1开始)", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "size", value = "当前每页显示数", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "enterpriseName", value = "企业名称", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "状态:0禁用, 1启用,2待审批", paramType = "query", dataType = "Integer")
})
@GetMapping("/getList")
public Wrapper getList(PageTableRequest request, String enterpriseName, Integer status) {
try {
QueryWrapper<SysEnterprise> wrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(enterpriseName)) {
wrapper.like("enterprise_name", enterpriseName);
}
if (status != null) {
wrapper.eq("status", status);
}
wrapper.eq("is_delete", 1);
wrapper.orderByDesc("create_time");
IPage<SysEnterprise> page = new Page<>(request.getCurrent(), request.getSize());
page = enterpriseMapper.selectPage(page, wrapper);
return WrapMapper.wrap(200, "成功", page);
} catch (Exception e) {
log.debug("企业列表{}", e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "添加企业")
@PostMapping("/save")
public Wrapper save(@RequestBody SysEnterprise enterprise){
try {
enterprise.setStatus(1);
enterprise.setIsDelete(1);
enterprise.setCreateTime(LocalDateTime.now());
enterpriseService.save(enterprise);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("添加企业{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "修改企业")
@PostMapping("/update")
public Wrapper update(@RequestBody SysEnterprise enterprise){
try {
SysEnterprise e = enterpriseService.getById(enterprise.getId());
if(e == null){
return WrapMapper.wrap(400,"信息错误");
}
enterpriseService.updateById(enterprise);
return WrapMapper.wrap(200,"成功");
}catch (Exception e){
log.debug("修改企业{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "企业详情")
@GetMapping("{id}")
public Wrapper getById(@PathVariable Long id){
try {
SysEnterprise e = enterpriseService.getById(id);
if(e == null){
return WrapMapper.wrap(400,"信息错误");
}
return WrapMapper.wrap(200,"成功",e);
}catch (Exception e){
log.debug("企业详情{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "修改企业状态")
@PostMapping("/updateStatus/{id}")
public Wrapper updateStatus(@PathVariable Long id) {
try {
SysEnterprise e = enterpriseService.getById(id);
if (e == null ) {
return WrapMapper.wrap(400,"企业不存在");
}
Integer status = e.getStatus()==0?1:0;
e.setStatus(status);
enterpriseService.updateById(e);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("修改企业状态{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "删除企业")
@PostMapping("/{id}")
public Wrapper delete(@PathVariable Long id) {
try {
SysEnterprise e = enterpriseService.getById(id);
if (e == null ) {
return WrapMapper.wrap(400,"企业不存在");
}
e.setStatus(0);
e.setIsDelete(0);
enterpriseService.updateById(e);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("删除企业{}",e);
}
return WrapMapper.error("失败");
}
@ApiOperation(value = "审批企业入驻申请")
@PostMapping("/approval")
public Wrapper approval(Long id) {
try {
SysEnterprise e = enterpriseService.getById(id);
if (e == null ) {
return WrapMapper.wrap(400,"企业不存在");
}
e.setStatus(1);
enterpriseService.updateById(e);
return WrapMapper.wrap(200,"成功");
}catch (Exception e) {
log.debug("审批企业入驻申请{}",e);
}
return WrapMapper.error("失败");
}
//****************************************************************************************************
/*@ApiOperation(value = "企业列表(自定义sql实现)")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "current", value = "当前页数(从1开始)", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "size", value = "当前每页显示数", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "enterpriseName", value = "企业名称", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "状态:0禁用, 1启用", paramType = "query", dataType = "Integer")
})
@GetMapping("getList1")
public Wrapper getList1(PageTableRequest request, String enterpriseName, Integer status){
try {
Page<SysEnterprise> page = new Page<>(request.getCurrent(), request.getSize());
Map<String, Object> map = new HashMap<>();
map.put("enterpriseName", enterpriseName);
map.put("status", status);
List<SysEnterprise> enterpriseList = enterpriseService.getPage(map);
page.setRecords(enterpriseList).setTotal(enterpriseList.size());
return WrapMapper.wrap(200,"成功",page);
}catch (Exception e){
log.debug("企业列表{}",e);
}
return WrapMapper.error("失败");
}*/
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-07-29
*/
@RestController
@RequestMapping("/business/sys-logs")
public class SysLogsController {
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-08-03
*/
@RestController
@RequestMapping("/business/sys-member")
public class SysMemberController {
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@RestController
@RequestMapping("/business/sys-permission")
public class SysPermissionController {
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@RestController
@RequestMapping("/business/sys-role")
public class SysRoleController {
}
package cn.wise.sc.consume.business.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@RestController
@RequestMapping("/business/sys-user")
public class SysUserController {
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-08-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class RefEntityEnclosure implements Serializable {
private static final long serialVersionUID=1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 实体id
*/
private Long entityId;
/**
* 实体类型(0:用户(头像),1:合同附件)
*/
private Integer entityType;
/**
* 附件地址
*/
private String enclosureUrl;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 是否删除(0:已经删除,1:未删除)
*/
private Integer isDeleted;
/**
* 文件名
*/
private String alias;
/**
* 扩展名
*/
private String extName;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-30
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SmsAuth implements Serializable {
private static final long serialVersionUID=1L;
/**
* id
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 手机号码
*/
private String iphone;
/**
* 验证码
*/
private String code;
/**
* 类型:1登录 2忘记密码
*/
private String type;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private LocalDateTime createTime;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysCoupon implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("优惠券名称")
private String couponName;
@ApiModelProperty("企业表id")
private Long enterpriseId;
@ApiModelProperty("优惠券图片")
private String couponLogo;
@ApiModelProperty("状态(0禁用,1启用)")
private Integer status;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("备注")
private String remark;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysCouponDetail implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("优惠券表id")
private Long couponId;
@ApiModelProperty("招行编号(自己生成)")
private String cmbNo;
@ApiModelProperty("券码(第三方生成)")
private String couponCode;
@ApiModelProperty("活动开始时间")
private LocalDate startDate;
@ApiModelProperty("活动结束时间")
private LocalDate endDate;
@ApiModelProperty("领取状态:0未领取,1已领取,2已过期")
private Integer isReceive;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("备注")
private String remark;
}
package cn.wise.sc.consume.business.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-06-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysEnterprise implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("企业名称-客户名称")
private String enterpriseName;
@ApiModelProperty("企业成立年限")
private Double years;
@ApiModelProperty("注册资金")
private BigDecimal registerCapital;
@ApiModelProperty("经营范围")
private String businessScope;
@ApiModelProperty("经营产品或者服务")
private String product;
@ApiModelProperty("希望入驻的模块(会员、商圈、物业、出行)")
private String modular;
@ApiModelProperty("联系人姓名")
private String contacts;
@ApiModelProperty("联系人电话")
private String phone;
@ApiModelProperty("联系人邮箱")
private String email;
@ApiModelProperty("推荐理由-公司简介")
private String recommendReason;
@ApiModelProperty("租户logo")
private String logo;
@ApiModelProperty("状态(0禁用,1启用, 2代审批)")
private Integer status;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("租户地址")
private String address;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("企业app企业ID-客户号")
private String coridc;
@ApiModelProperty("发券类型(抵用,权益,折扣)")
private String couponType;
@ApiModelProperty("自建商城(1有,0无)")
private Integer shoppingSelf;
@ApiModelProperty("商城网址")
private String shoppingAddress;
@ApiModelProperty("券使用链接")
private String couponLink;
@ApiModelProperty("公司品牌")
private String brand;
@ApiModelProperty("会员服务申明")
private String vipStatement;
@ApiModelProperty("备注")
private String remark;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysLogs implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 操作用户
*/
@TableField("userId")
private String userId;
/**
* 操作内容
*/
private String module;
/**
* 操作状态1成功,0失败
*/
private Integer flag;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
@TableField("createTime")
private LocalDateTime createTime;
/**
* 租户id 超级管理员为0
*/
private String tenantId;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-08-03
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysMember implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 企业id
*/
private Long enterpriseId;
/**
* 企业app用户ID
*/
private String usridc;
/**
* 申请人姓名
*/
private String name;
/**
* 申请人联系电话
*/
private String phone;
/**
* 出生年月日
*/
private LocalDate birthday;
private LocalDateTime createTime;
private String remark;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysPermission implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 上级ID(如果是一级为0)
*/
@TableField("parentId")
private Long parentId;
/**
* 名字
*/
private String name;
/**
* 菜单图标
*/
private String css;
/**
* 链接
*/
private String href;
/**
* 1菜单权限,2按钮权限
*/
private Integer type;
/**
* 接口权限
*/
private String permission;
/**
* 排序
*/
private Integer sort;
private String remark;
private List<SysRole> roleList;
}
package cn.wise.sc.consume.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysRole implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private LocalDateTime createTime;
/**
* (0禁用,1启用)
*/
private Integer status;
private String remark;
/**
* 租户id 超级管理员为0
*/
private String tenantId;
// private List<Permission> permissionList;
private List<SysUser> userList;
}
package cn.wise.sc.consume.business.entity;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDate;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysUser implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 登录名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 姓名
*/
private String nickName;
/**
* 头像
*/
private String headImgUrl;
/**
* 手机
*/
private String phone;
/**
* 电话
*/
private String telephone;
/**
* 邮箱
*/
private String email;
/**
* 开户银行
*/
private String bankName;
/**
* 银行卡号
*/
private String accountNo;
private LocalDate birthday;
/**
* (0男,1女)
*/
private Integer sex;
/**
* 职务表id,用于权限审批
*/
private Long postId;
/**
* (0禁用,1启用)
*/
private Integer status;
/**
* (0删除,1正常)
*/
private Integer isDelete;
private LocalDateTime createTime;
private LocalDateTime updateTime;
/**
* 微信标识
*/
private String openId;
private String remark;
/**
* 已使用额度
*/
private BigDecimal usedMoney;
/**
* 0普通用户,1租户管理员,2超级管理员
*/
private Integer isAdmin;
/**
* 租户id 超级管理员为0
*/
private String tenantId;
/**
* 企业app用户ID
*/
private String usridc;
public interface Status {
int DISABLED = 0;
int VALID = 1;
int LOCKED = 2;
}
}
package cn.wise.sc.consume.business.entity;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SysUserCoupon implements Serializable {
private static final long serialVersionUID=1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 用户表id
*/
private String userId;
/**
* 优惠券明细表id
*/
private Long couponDetailId;
/**
* 票券使用状态:0可使用,1已使用,2已过期
*/
private Integer isUse;
/**
* 领取时间
*/
private LocalDateTime createTime;
/**
* 使用时间
*/
private LocalDateTime useTime;
/**
* 备注
*/
private String remark;
}
package cn.wise.sc.consume.business.entity;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class TokenModel implements Serializable {
private static final long serialVersionUID=1L;
/**
* token
*/
private String id;
/**
* LoginUser的json串
*/
private String val;
@TableField("expireTime")
private Date expireTime;
@TableField("createTime")
private Date createTime;
@TableField("updateTime")
private Date updateTime;
}
package cn.wise.sc.consume.business.entity.cmbnoenet;
import cn.wise.sc.consume.business.entity.SysMember;
import cn.wise.sc.consume.business.entity.cmbnoenet.model.BaseResponse;
import cn.wise.sc.consume.business.entity.cmbnoenet.model.TokenInfoQuery;
import cn.wise.sc.consume.business.model.SysEnterpriseDto;
import cn.wise.sc.consume.business.service.impl.CMBOneNetPayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* @description: 招行一卡通
* @author: qh
* @create: 2020-04-09 17:05
*/
@Api(tags = "企业app接口")
@CrossOrigin
@RestController
@RequestMapping("/cmbOneNet")
public class CMBOneNetController {
private static final Logger log = LoggerFactory.getLogger("CMBOneNetController");
final CMBOneNetPayService CMBOneNetPayService;
public CMBOneNetController(CMBOneNetPayService CMBOneNetPayService) {
this.CMBOneNetPayService = CMBOneNetPayService;
}
@ApiOperation("获取招行app支付订单信息")
@PostMapping("/fmordsubOrderInfo")
public BaseResponse fmordsubOrderInfo(
String orderNo, String txnAmt, String receAccount, String receName, String receBank)
throws Exception {
return CMBOneNetPayService.oneNetOrderInfo(orderNo, txnAmt, receAccount, receName, receBank);
}
@ApiOperation("订单支付回调")
@PostMapping("/payNotice")
public BaseResponse payNotice(HttpServletRequest request) {
return BaseResponse.okMsg("招行一卡通支付回调!", CMBOneNetPayService.getClass());
}
//****************************************************************
@ApiOperation("申请Api访问令牌")
@PostMapping("/applyInfo")
public BaseResponse getApplyInfo(@RequestBody String authCode){
return CMBOneNetPayService.getApplyInfo(authCode);
}
@ApiOperation("续费Api访问令牌")
@PutMapping("/reNewApplyInfo")
public BaseResponse reNewApplyInfo(@RequestBody String token){
return CMBOneNetPayService.renewApplyInfo(token);
}
@ApiOperation("查询企业信息")
@GetMapping("/getEnterprise")
public BaseResponse getEnterprise(String coridc, String token){
return CMBOneNetPayService.getEnterprise(coridc, token);
}
@ApiOperation("查询企业用户信息")
@GetMapping("/getEnterpriseUser")
public BaseResponse getEnterpriseUser(String usridc, String token){
return CMBOneNetPayService.getEnterpriseUser(usridc, token);
}
@ApiOperation("查询企业用户证件信息")
@GetMapping("/getEnterpriseUserCard")
public BaseResponse getEnterpriseUserCard(String usridc, String token){
return CMBOneNetPayService.getEnterpriseUserCard(usridc, token);
}
@ApiOperation("查询企业核心客户号")
@GetMapping("/getEnterpriseClientId")
public BaseResponse getEnterpriseClientId(String coridc, String token){
return CMBOneNetPayService.getEnterpriseClientId(coridc, token);
}
@ApiOperation("查询自然人用户信息")
@GetMapping("/getNatural")
public BaseResponse getNatural(String glbuid, String token){
return CMBOneNetPayService.getNatural(glbuid, token);
}
@ApiOperation("解析握手令牌token,获取招行App用户信息")
@PostMapping("/getUserInforMation")
public BaseResponse getUserInforMation(@RequestBody TokenInfoQuery tokenInfoQuery) {
return CMBOneNetPayService.getUserInforMation(tokenInfoQuery.getSignature(), tokenInfoQuery.getData());
}
@ApiOperation("判断企业申请状态")
@PostMapping("/getUserInfo")
public BaseResponse getUserInfo(@RequestBody String coridc) {
return CMBOneNetPayService.getUserInfo(coridc);
}
@ApiOperation(value = "申请发券")
@PostMapping("/applyEnterprise")
public BaseResponse applyEnterprise(@RequestBody SysEnterpriseDto enterpriseDto) {
return CMBOneNetPayService.applyEnterprise(enterpriseDto);
}
@ApiOperation(value = "票券列表(企业列表)")
@GetMapping("/getEnterpriseList")
public BaseResponse getEnterpriseList(String usridc) {
return CMBOneNetPayService.getEnterpriseList(usridc);
}
@ApiOperation(value = "会员申请")
@PostMapping("/applyMember")
public BaseResponse applyMember(@RequestBody SysMember sysMember) {
return CMBOneNetPayService.applyMember(sysMember);
}
@ApiOperation(value = "领券列表")
@GetMapping("/getCouponAppList")
public BaseResponse getCouponAppList(String coridc, String usridc) {
return CMBOneNetPayService.getCouponAppList(coridc, usridc);
}
@ApiOperation(value = "领取")
@GetMapping("/receive")
public BaseResponse receive(String couponId, String usridc) {
return CMBOneNetPayService.receive(couponId, usridc);
}
@ApiOperation(value = "已领取优惠券列表")
@GetMapping("/getReceivedList")
public BaseResponse getReceivedList(String coridc, String usridc) {
return CMBOneNetPayService.getReceivedList(coridc, usridc);
}
@ApiOperation(value = "使用优惠券")
@GetMapping("/useCoupon")
public BaseResponse useCoupon(Long couponDetailId) {
return CMBOneNetPayService.useCoupon(couponDetailId);
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import java.io.Serializable;
import java.util.List;
/**
* @description: 响应封装
* @author: qh
* @create: 2019-12-12 15:04
**/
public class BaseResponse<T> implements Serializable {
private static final long serialVersionUID = 2739858008722562194L;
public String msg;
public int code;
public T data;
public String className;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
private static <T> BaseResponse<T> createBaseResponse(T t) {
return new BaseResponse<T>();
}
public static <T> BaseResponse<T> ok() {
BaseResponse<T> baseResponse = new BaseResponse<>();
baseResponse.setCode(200);
baseResponse.setMsg("操作成功");
return baseResponse;
}
public static <T> BaseResponse<T> ok(T data) {
BaseResponse<T> baseResponse = createBaseResponse(data);
baseResponse.setCode(200);
baseResponse.setData(data);
baseResponse.setClassName(data.getClass().getName());
baseResponse.setMsg("操作成功");
return baseResponse;
}
public static <T> BaseResponse<T> ok(T data, Class clazz) {
BaseResponse<T> baseResponse = createBaseResponse(data);
baseResponse.setCode(200);
baseResponse.setData(data);
baseResponse.setClassName(clazz.getName());
baseResponse.setMsg("操作成功");
return baseResponse;
}
public static <T> BaseResponse<T> okMsg(String msg, Class clazz) {
BaseResponse<T> baseResponse = createBaseResponse(null);
baseResponse.setCode(200);
baseResponse.setData(null);
baseResponse.setClassName(clazz.getName());
baseResponse.setMsg(msg);
return baseResponse;
}
public static <T> BaseResponse<T> ok(List<T> list, Class clazz) {
BaseResponse<T> baseResponse = createBaseResponse(null);
baseResponse.setCode(200);
baseResponse.setData(null);
baseResponse.setClassName(clazz.getName());
baseResponse.setMsg("操作成功");
return baseResponse;
}
public static <T> BaseResponse<T> ok(String msg, T data) {
BaseResponse<T> baseResponse = createBaseResponse(data);
baseResponse.setCode(200);
baseResponse.setData(data);
baseResponse.setClassName(data.getClass().getName());
baseResponse.setMsg(msg);
return baseResponse;
}
public static <T> BaseResponse<T> error(String msg, T data) {
BaseResponse<T> baseResponse = createBaseResponse(data);
baseResponse.setCode(400);
baseResponse.setData(data);
baseResponse.setClassName(data.getClass().getName());
baseResponse.setMsg(msg);
return baseResponse;
}
public static <T> BaseResponse<T> error(String msg, String clazz) {
BaseResponse<T> baseResponse = createBaseResponse(null);
baseResponse.setCode(400);
baseResponse.setData(null);
baseResponse.setClassName(clazz);
baseResponse.setMsg(msg);
return baseResponse;
}
public static BaseResponse<String> hystrixError(String author) {
BaseResponse<String> baseResponse = createBaseResponse(null);
baseResponse.setCode(666666);
baseResponse.setData(null);
baseResponse.setClassName("熔断器");
baseResponse.setMsg("它又触发熔断了! 太难了! /(ㄒoㄒ)/~~ 问问是不是在调试 ___*(  ̄皿 ̄)/#____" + "author:" + author);
return baseResponse;
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
import java.io.Serializable;
/**
* @description: 招行一卡通 响应对象
* @author: qh
* @create: 2020-04-09 14:12
**/
@Data
public class CMBONeNetResponse implements Serializable {
private static final long serialVersionUID = -1L;
public CMBResponse response;
public String signature;
@Data
public class CMBResponse {
private String body;
private ResponseHead head;
@Data
public class ResponseHead {
private String vernbr;
private String tppidc;
private String FMORDSUB;
private String msgidc;
private String sigalg;
private String retcod;
private String retmsg;
private String rsptim;
}
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
/**
* @description: 招商银行 一网通
* @author: qh
* @create: 2020-04-08 14:53
**/
@Data
public class CMBOneNetOrderParams {
/**
* 订单号
*/
private String reford;
/**
* 商户类型
*/
private String mchtyp;
/**
* 币种 人民币
*/
private String ccynbr = "10";
/**
* 金额 最大15位包含2小数位
*/
private String trsamt;
/**
* 收方账号
*/
private String rcveac;
/**
* 收方账户名
*/
private String rcvean;
/**
* 收方开户账号
*/
private String rcvbbk;
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
/**
* @description: 招行一卡通 请求数据域
* @author: qh
* @create: 2020-04-09 09:57
**/
@Data
public class CMBOneNetRequestDataModel {
@JSONField(ordinal = 1)
private Header head;
/**
* 业务具体参数 要求加密RSA
*/
@JSONField(ordinal = 2)
private String body;
/**
* 请求头部
*/
@Data
public class Header {
/**
* 接口版本号 固定为1.0
*/
public String vernbr = "1.0";
/**
* 商户号 由招行分配
*/
public String tppidc;
/**
* 交易码 请求功能码,用以区分所进行的交易。区分大小写
*/
public String trscod = "FMORDSUB";
/**
* 请求时间 格式:yyyyMMddHHmmss精确到秒
*/
public String reqtim;
/**
* 报文ID 用以标明报文的唯一性,返回报文原样返回
*/
public String msgidc;
/**
* 签名算法 固定为“SHA256WithRSA
*/
public String sigalg = "SHA256WithRSA";
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
/**
* @description: 招行一卡通 请求对象
* @author: qh
* @create: 2020-04-09 10:01
**/
@Data
public class CMBOneNetRequestModel {
/**
* 数据域
*/
private CMBOneNetRequestDataModel request;
/**
* 签名域
*/
private String signature;
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
/**
* @description: 招行一卡通请求地址 维护对象
* @author: qh
* @create: 2020-04-09 15:20
*/
public class CMBOneNetRequestUrl {
//http://121.15.180.84/
//https://gtb.cmbchina.com/
/** FMORDSUB 订单数据提交 */
public static final String ORDERINFO_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/orderinfo";
/** 获取Api访问令牌的接口 */
public static final String APPLYINFO_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/applyinfo";
/** 续费Api访问令牌的接口 */
public static final String RENEWINFO_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/renewinfo";
/*查询企业信息*/
public static final String CORQRYITF_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/corqryitf";
/*查询企业用户信息*/
public static final String USRQRYITF_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/usrqryitf";
/*查询企业用户证件信息*/
public static final String USRCTFITF_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/usrctfitf";
/*查询企业核心客户号*/
public static final String CLTQRYITF_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/cltqryitf";
/*查询自然人用户信息*/
public static final String GLBQRYITF_URL = "https://gtb.cmbchina.com/CmbBank_GTB/API/glbqryitf";
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
/**
* @description: 招行一卡通 获取到得流程号
* @author: qh
* @create: 2020-04-09 15:06
**/
@Data
public class CMBOneNetResponseFlow {
private FlowResult subresult;
@Data
public class FlowResult {
/**
* 流程号
*/
private String seqnbr;
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
/**
* @description: 握手令牌对象
* @author: qh
* @create: 2020-05-19 11:39
*/
@Data
public class CMBOneNetTokenInfo {
/** 接口版本号 */
private String vernbr;
/** 签名算法 */
private String sigalg;
/** 请求时间 */
private String reqtim;
/** 企业 ID */
private String coridc;
/** 用户 ID */
private String usridc;
/** 手机号 */
private String usrmob;
/** 授权码 */
private String autcod;
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
/**
*
* <p>商户平台模式</p>
*
* @author Corpier
*/
public enum PayModel {
/**
* 商户模式
*/
BUSINESS_MODEL("BUSINESS_MODEL"),
/**
* 服务商模式
*/
SERVICE_MODE("SERVICE_MODE");
PayModel(String payModel) {
this.payModel = payModel;
}
/**
* 商户模式
*/
private final String payModel;
public String getPayModel() {
return payModel;
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
/**
*
* <p>签名方式</p>
*
* @author Corpier
*/
public enum SignType {
/**
* HMAC-SHA256 加密
*/
HMACSHA256("HMAC-SHA256"),
/**
* MD5 加密
*/
MD5("MD5");
SignType(String type) {
this.type = type;
}
private final String type;
public String getType() {
return type;
}
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
import lombok.Data;
/**
* @description:
* @author: qh
* @create: 2020-06-10 13:59
**/
@Data
public class TokenInfoQuery {
String signature;
String data;
}
package cn.wise.sc.consume.business.entity.cmbnoenet.model;
/**
*
* <p>支付方式</p>
*
* @author Corpier
*/
public enum TradeType {
/**
* 微信公众号支付或者小程序支付
*/
JSAPI("JSAPI"),
/**
* 微信扫码支付
*/
NATIVE("NATIVE"),
/**
* 微信APP支付
*/
APP("APP"),
/**
* 付款码支付
*/
MICROPAY("MICROPAY"),
/**
* H5支付
*/
MWEB("MWEB");
TradeType(String tradeType) {
this.tradeType = tradeType;
}
/**
* 交易类型
*/
private final String tradeType;
public String getTradeType() {
return tradeType;
}
}
package cn.wise.sc.consume.business.enumation;
import com.alibaba.fastjson.annotation.JSONType;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author neo.shu
* @since 2020/4/22 17:40
*/
@JSONType(serializeEnumAsJavaBean = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@AllArgsConstructor
@Getter
public enum ProjectRole {
PM("PM","项目经理", true),
PD("PD","产品设计", false),
UD("UD","UI设计", false),
FD("FD","前端开发", false),
BD("BD","后端开发", false),
TD("TD","测试经理", false),
QA("QA","质量管理", true),
;
@EnumValue
private String dbName;
private String label;
private boolean isManage;
public int getValue() {
return this.ordinal();
}
}
package cn.wise.sc.consume.business.exception;
/**
* 根据业务定制的具体异常类
* @author shulidong
* @since 2019/2/19/0019 16:45
*/
public class BizException extends BusinessException {
public BizException(String message) {
super(message);
}
}
package cn.wise.sc.consume.business.exception;
import org.springframework.http.HttpStatus;
/**
* @author shulidong
* @since 2019/2/19/0019 16:48
**/
public abstract class BusinessException extends RuntimeException {
protected HttpStatus statusCode = HttpStatus.INTERNAL_SERVER_ERROR;
private String errorCode;
public HttpStatus getStatusCode() {
return statusCode;
}
public void setStatusCode(HttpStatus statusCode) {
this.statusCode = statusCode;
}
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public BusinessException(String message, Throwable e) {
super(message,e);
}
public BusinessException(String message) {
super(message);
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
}
package cn.wise.sc.consume.business.exception;
/**
* 封装fastdfs的异常,使用运行时异常
*
* @author yuqih
* @author tobato
*
*/
public abstract class FdfsException extends RuntimeException {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
protected FdfsException(String message) {
super(message);
}
/**
* @param message
* @param cause
*/
protected FdfsException(String message, Throwable cause) {
super(message, cause);
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.exception;
/**
* 从Url解析StorePath文件路径对象错误
*
* @author wuyf
*
*/
public class FdfsUnsupportStorePathException extends FdfsException {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 8116336411011152869L;
public FdfsUnsupportStorePathException(String message) {
super(message);
}
}
\ No newline at end of file
package cn.wise.sc.consume.business.exception;
/**
* redis 操作异常
*/
public class RedisHandleException extends RuntimeException{
public RedisHandleException(String msg) {
super(msg);
}
public RedisHandleException(String message, Throwable throwable) {
super(message, throwable);
}
public RedisHandleException(Throwable throwable) {
super(throwable);
}
}
package cn.wise.sc.consume.business.filter;
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.handler.HandlerInterceptorAdapter;
import sun.misc.BASE64Decoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class SwaggerInterceptor extends HandlerInterceptorAdapter {
private String username;
private String password;
public SwaggerInterceptor(String username, String password) {
this.username = username;
this.password = password;
}
@Override
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 (authorization != null && authorization.split(" ").length == 2) {
String userAndPass = new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));
String username = userAndPass.split(":").length == 2 ? userAndPass.split(":")[0] : null;
String password = userAndPass.split(":").length == 2 ? userAndPass.split(":")[1] : null;
if (this.username.equals(username) && this.password.equals(password)) {
return true;
}
}
return false;
}
@Override
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 != null && resources.length > 0) {
FileCopyUtils.copy(resources[0].getInputStream(), response.getOutputStream());
} else {
response.setStatus(404);
}
}
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.RefEntityEnclosure;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-08-03
*/
public interface RefEntityEnclosureMapper extends BaseMapper<RefEntityEnclosure> {
int deleteByPrimaryKey(Long id);
int insert(RefEntityEnclosure record);
int insertSelective(RefEntityEnclosure record);
RefEntityEnclosure selectByPrimaryKey(Long id);
int updateByPrimaryKeySelective(RefEntityEnclosure record);
int updateByPrimaryKey(RefEntityEnclosure record);
@Select("select * from ref_entity_enclosure ree\n" +
"where ree.is_deleted=1 and ree.entity_type=#{entityType} and ree.entity_id=#{entityId}")
List<RefEntityEnclosure> getList(@Param("entityType")Integer entityType, @Param("entityId")Long entityId);
@Delete("delete from ref_entity_enclosure where enclosure_url = #{enclosureUrl} ")
int deleteByUrl(String enclosureUrl);
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SmsAuth;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import java.util.Date;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-30
*/
public interface SmsAuthMapper extends BaseMapper<SmsAuth> {
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into sms_auth(iphone, code, type, remark, create_time) values(#{iphone}, #{code}, #{type}, #{remark} ,now())")
Boolean save(SmsAuth smsAuth);
@Select("select * from sms_auth login_lable where login_lable.iphone = #{iphone} and login_lable.type = #{type} and login_lable.create_time > #{endDate} ")
List<SmsAuth> selectList(String iphone, String type, Date endDate);
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysCouponDetail;
import cn.wise.sc.consume.business.model.ReceivedAppListVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-31
*/
public interface SysCouponDetailMapper extends BaseMapper<SysCouponDetail> {
@Select("select count(*) from sys_coupon_detail where to_days(create_time) = to_days(now())")
int createNo();
List<ReceivedAppListVO> getReceivedList(@Param("coridc") String coridc, @Param("usridc") String usridc );
@Select("select * from sys_coupon_detail scd where scd.is_receive=0 and to_days(now()) - to_days(scd.end_date) >0")
List<SysCouponDetail> getVerdueList();
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysCoupon;
import cn.wise.sc.consume.business.model.CouponAppListVO;
import cn.wise.sc.consume.business.model.CouponDetailVO;
import cn.wise.sc.consume.business.model.CouponListVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-31
*/
public interface SysCouponMapper extends BaseMapper<SysCoupon> {
List<CouponListVO> getCouponPage(@Param("map") Map<String,Object> map);
CouponDetailVO getCouponDetail(Long id);
List<CouponAppListVO> getCouponAppList(@Param("coridc") String coridc, @Param("usridc") String usridc );
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysEnterprise;
import cn.wise.sc.consume.business.model.EnterpriseAppListVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-06-17
*/
public interface SysEnterpriseMapper extends BaseMapper<SysEnterprise> {
List<SysEnterprise> getPage(@Param("map") Map<String,Object> map);
List<EnterpriseAppListVO> getEnterpriseList(String usridc);
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysLogs;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-29
*/
public interface SysLogsMapper extends BaseMapper<SysLogs> {
@Insert("insert into sys_logs(userId, module, flag, remark, createTime, tenant_id) " +
"values(#{userId}, #{module}, #{flag}, #{remark}, now(), #{tenantId} )")
int save(SysLogs sysLogs);
@Delete("delete from sys_logs where createTime <= #{time}")
int deleteLogs(String time);
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysMember;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-08-03
*/
public interface SysMemberMapper extends BaseMapper<SysMember> {
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysPermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-27
*/
public interface SysPermissionMapper extends BaseMapper<SysPermission> {
@Select("select distinct login_lable.* from sys_permission login_lable " +
"inner join sys_role_permission rp on login_lable.id = rp.permissionId " +
"inner join sys_role_user ru on ru.roleId = rp.roleId " +
"where ru.userId = #{userId} order by login_lable.parentId,login_lable.sort")
List<SysPermission> listByUserId(Long userId);
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-27
*/
public interface SysRoleMapper extends BaseMapper<SysRole> {
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysCouponDetail;
import cn.wise.sc.consume.business.entity.SysUserCoupon;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-31
*/
public interface SysUserCouponMapper extends BaseMapper<SysUserCoupon> {
@Select("select suc.* from sys_user_coupon suc " +
"left join sys_coupon_detail scd on scd.id = suc.coupon_detail_id " +
"where scd.is_receive=1 and suc.is_use=0 and to_days(now()) - to_days(scd.end_date) >0")
List<SysUserCoupon> getVerdueList();
}
package cn.wise.sc.consume.business.mapper;
import cn.wise.sc.consume.business.entity.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* <p>
* Mapper 接口
* </p>
*
* @author ztw
* @since 2020-07-27
*/
public interface SysUserMapper extends BaseMapper<SysUser> {
@Select("select login_lable.* from sys_user login_lable where login_lable.username = #{username}")
SysUser getUser(String username);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.RefEntityEnclosureMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SmsAuthMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysCouponDetailMapper">
<select id="getReceivedList" resultType="cn.wise.sc.consume.business.model.ReceivedAppListVO">
select
scd.id as id, scd.coupon_code as couponCode,
sc.coupon_logo as couponLogo
from sys_coupon_detail scd
left join sys_user_coupon suc on suc.coupon_detail_id = scd.id
left join sys_coupon sc on sc.id = scd.coupon_id
where sc.enterprise_id = #{coridc} and sc.is_delete=1 and sc.status=1
and scd.is_delete=1 and scd.is_receive=1
and suc.user_id=#{usridc} and suc.is_use=0
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysCouponMapper">
<sql id="where">
<where>
and sc.is_delete=1
<if test="map.couponName != null and map.couponName != ''">
and sc.coupon_name like concat('%', #{map.couponName}, '%')
</if>
<if test="map.enterpriseId != null and map.enterpriseId != ''">
and sc.enterprise_id = #{map.enterpriseId}
</if>
<if test="map.status != null">
and sc.status = #{map.status}
</if>
</where>
</sql>
<select id="getCouponPage" resultType="cn.wise.sc.consume.business.model.CouponListVO">
select sc.*,se.enterprise_name as enterpriseName,
(select count(*) from sys_coupon_detail scd where scd.coupon_id =sc.id and scd.is_delete = 1) as couponNum
from sys_coupon sc
left join sys_enterprise se on se.id = sc.enterprise_id
<include refid="where" />
order by sc.create_time desc
</select>
<select id="getCouponDetail" resultType="cn.wise.sc.consume.business.model.CouponDetailVO">
select sc.*,se.enterprise_name as enterpriseName from sys_coupon sc
left join sys_enterprise se on se.id = sc.enterprise_id
where sc.id = #{id}
</select>
<select id="getCouponAppList" resultType="cn.wise.sc.consume.business.model.CouponAppListVO">
select sc.*,
EXISTS(select * from sys_user_coupon suc
left join sys_coupon_detail scd on scd.id = suc.coupon_detail_id
where scd.coupon_id = sc.id and suc.user_id = #{usridc} ) as isReceive
from sys_coupon sc
left join sys_enterprise se on se.id = sc.enterprise_id
where se.coridc = #{coridc}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysEnterpriseMapper">
<sql id="where">
<where>
<if test="map.enterpriseName != null and map.enterpriseName != ''">
and t.enterprise_name like concat('%', #{map.enterpriseName}, '%')
</if>
<if test="map.status != null">
and t.status = #{map.status}
</if>
</where>
</sql>
<select id="getPage" resultType="cn.wise.sc.consume.business.entity.SysEnterprise">
select t.* from sys_enterprise t
<include refid="where" />
order by t.create_time desc
</select>
<select id="getEnterpriseList" resultType="cn.wise.sc.consume.business.model.EnterpriseAppListVO">
select t.*,
EXISTS(select * from sys_member sm where sm.enterprise_id=t.id and sm.usridc = #{usridc}) as isBinding
from sys_enterprise t
where t.status=1
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysLogsMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysMemberMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysPermissionMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysRoleMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysUserCouponMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.SysUserMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wise.sc.consume.business.mapper.TokenModelMapper">
</mapper>
package cn.wise.sc.consume.business.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
public class CouponAppListVO {
private Long id;
@ApiModelProperty("优惠券名称")
private String couponName;
@ApiModelProperty("企业表id")
private Long enterpriseId;
@ApiModelProperty("优惠券图片")
private String couponLogo;
@ApiModelProperty("状态(0禁用,1启用)")
private Integer status;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("企业名称")
private String enterpriseName;
@ApiModelProperty("优惠券数量")
private Integer couponNum;
@ApiModelProperty("领取状态:0未领取,1已领取,2已过期")
private Integer isReceive;
}
package cn.wise.sc.consume.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
public class CouponDetailDTO {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("优惠券表id")
private Long couponId;
@ApiModelProperty("券码(第三方生成)")
private String couponCode;
@ApiModelProperty("活动开始时间")
private LocalDate startDate;
@ApiModelProperty("活动结束时间")
private LocalDate endDate;
@ApiModelProperty("备注")
private String remark;
}
package cn.wise.sc.consume.business.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
public class CouponDetailVO {
private Long id;
@ApiModelProperty("优惠券名称")
private String couponName;
@ApiModelProperty("企业表id")
private Long enterpriseId;
@ApiModelProperty("优惠券图片")
private String couponLogo;
@ApiModelProperty("状态(0禁用,1启用)")
private Integer status;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("企业名称")
private String enterpriseName;
}
package cn.wise.sc.consume.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author ztw
* @since 2020-07-31
*/
@Data
public class CouponListVO {
private Long id;
@ApiModelProperty("优惠券名称")
private String couponName;
@ApiModelProperty("企业表id")
private Long enterpriseId;
@ApiModelProperty("优惠券图片")
private String couponLogo;
@ApiModelProperty("状态(0禁用,1启用)")
private Integer status;
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@ApiModelProperty("是否删除(0删除,1存在)")
private Integer isDelete;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("企业名称")
private String enterpriseName;
@ApiModelProperty("优惠券数量")
private Integer couponNum;
}
/**
* @author neo.shu
* @since 2020/6/12 13:48
*/
package cn.wise.sc.consume.business;
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment