Commit df6660e0 by liangkaiping

lkp

parent 29059329
# cloud-mall
#未木云 积分商城
积分商城
\ No newline at end of file
1. service 包下只包装基本查询
1. xservice 编写业务逻辑,不允许返回BizResponse,返回需要的业务数据
1. controller 调用xservice或service,将返回值包装为BizResponse,然后return。
1. controller 只允许返回BizReponse,且必须加范型。
## 接口说明
项目中的金币变动只能从这个接口走
com.yizhi.mall.application.xservice.AccountTokenXService.saveOrUpdateTokenAccount
<?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>cloud-mall</artifactId>
<groupId>com.yizhi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-mall-api</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-common-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-core</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-util</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.yizhi.mall.application;
import lombok.Data;
import java.util.Arrays;
/**
* @Date 2021/1/11 3:14 下午
* @Author lvjianhui
**/
public enum ExchangeConditionType {
DAY ("DAY", "天"),
WEEK ("WEEK", "周"),
MONTH ("MONTH","月"),
QUARTER ("QUARTER","季度"),
HALFYEAR ("HALFYEAR","半年"),
YEAR ("YEAR","年"),
ALLTIME ("ALLTIME","每人历史限量兑换");
private String code;
private String msg;
ExchangeConditionType(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public String getMsg() {
return msg;
}
public static ExchangeConditionType getByCode(String code) {
return Arrays.stream(ExchangeConditionType.values()).filter(it -> it.code.equals(code)).findFirst().get();
}
}
package com.yizhi.mall.application;
/**
* @Date 2021/1/14 11:51 上午
* @Author lvjianhui
**/
public enum TokenLogType {
// 变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏
// 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品
// 小于200为金币增加 大于200为金币减少
POINT_EXCHANGE (100,"积分充值",1,"JF"),
PROJECT_APPLY (200,"付费项目兑换",-1,"XM"),
COURSE_APPLY (210,"付费课程兑换",-1,"KC"),
;
private Integer code;
private String msg;
// 增加为1 ,减少为-1
private Integer addOrsSub;
private String orderPre;
TokenLogType(Integer code, String msg,Integer addOrsSub,String orderPre) {
this.code = code;
this.msg = msg;
this.addOrsSub = addOrsSub;
this.orderPre = orderPre;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return msg;
}
public Integer getAddOrsSub() {
return addOrsSub;
}
public String getOrderPre() {
return orderPre;
}
}
package com.yizhi.mall.application;
/**
* @Date 2021/1/14 3:32 下午
* @Author lvjianhui
**/
public enum TokenSwitchType {
// 10:积分 20:人民币 30:第三方商城
POINT_EXCHANGE (10,"积分换金币入口"),
RMB_EXCHANGE (20,"人民币充值金币入口"),
THIRD_MALL (30,"第三方商城入口")
;
private Integer type;
private String msg;
TokenSwitchType(Integer type, String msg) {
this.type = type;
this.msg = msg;
}
public Integer getType() {
return type;
}
public String getMsg() {
return msg;
}
}
package com.yizhi.mall.application.feign;
import com.yizhi.mall.application.pojo.vo.TokenConfigVO;
import com.yizhi.util.application.domain.BizResponse;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@FeignClient(name = "mall",contextId = "TokenControllerClient")
public interface TokenControllerClient {
@GetMapping("/student/token/amount")
@ApiOperation("获取用户当前金币数量")
BizResponse<Integer> getTokenAmount();
@GetMapping("/manage/tokenExchangeRule/get")
@ApiOperation(value = "获取规则")
public BizResponse<TokenConfigVO> get();
}
package com.yizhi.mall.application.pojo.qo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Date 2021/1/15 5:30 下午
* @Author lvjianhui
**/
@Data
@ApiModel
public class ApplyProjectPO {
@ApiModelProperty("业务Id")
private Long relationtId;
@ApiModelProperty("业务类型 200:项目报名")
private Integer relationType;
}
package com.yizhi.mall.application.pojo.qo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @ClassName: ManageTokenLogQO
* @author: zjl
* @date: 2021/1/13 16:25
*/
@Data
@ApiModel(value = "管理端")
public class ManageTokenLogQO {
@ApiModelProperty(value = "关键字")
private String kwd;
@ApiModelProperty(value = "分页参数:每页条数,默认10条")
private Integer pageSize = 10;
@ApiModelProperty(value = "分页参数:跳转页,默认1")
private Integer pageNo = 1;
@ApiModelProperty(value = "变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品")
private Integer type;
@ApiModelProperty(value = "开始日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
private Date startAt;
@ApiModelProperty(value = "结束日期")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
private Date endAt;
}
package com.yizhi.mall.application.pojo.qo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Date 2021/1/14 2:38 下午
* @Author lvjianhui
**/
@Data
@ApiModel
public class TokenExchangePO {
@ApiModelProperty("需兑换金币数量")
private Integer tokenCount;
}
package com.yizhi.mall.application.pojo.qo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @ClassName: TokenExchangeRuleQO
* @author: zjl
* @date: 2021/1/11 16:18
*/
@Data
@ApiModel("新增积分兑换金币规则入参")
@NoArgsConstructor
@AllArgsConstructor
public class TokenExchangeRuleQO {
@ApiModelProperty(value = "虚拟币名称")
private String tokenName;
@ApiModelProperty(value = "兑换比例 100表示 100积分兑换 1金币")
private BigDecimal rate;
@ApiModelProperty(value = "false:无条件 true:有条件")
private Boolean exchangeCondition;
@ApiModelProperty(value = "DAY,WEEK,MONTH,QUARTER,HALFYEAR,YEAR,ALLTIME")
private String conditionRuleType;
@ApiModelProperty(value = "时间范围内兑换总量")
private Integer conditionRuleTokenCount;
}
package com.yizhi.mall.application.pojo.qo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: TokenSwitchQO
* @author: zjl
* @date: 2021/1/22 20:44
*/
@Data
@ApiModel("新增兑换开关入参")
@NoArgsConstructor
@AllArgsConstructor
public class TokenSwitchQO {
private Boolean tokenSwitchBol;
@ApiModelProperty("10:积分 20:人民币 30:第三方商城")
private Integer type;
}
package com.yizhi.mall.application.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @ClassName: ManageTokenLogVO
* @author: zjl
* @date: 2021/1/13 16:05
*/
@ApiModel(value = "管理端金币消费返回vo")
@Data
public class
ManageTokenLogVO {
@ApiModelProperty(value = "姓名")
private String fullName;
@ApiModelProperty(value = "用户名")
private String name;
@ApiModelProperty("时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
private Date createdAt;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("数量 +加 -减")
private Integer count;
@ApiModelProperty("业务类型 变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品")
private Integer type;
@ApiModelProperty("如股业务类型 属于平台业务,则为业务ID。如果有值,则更具该值跳相应业务的页面。如果无值则 更具订单ID跳订单详情页面")
private Long relationId;
@ApiModelProperty("订单ID")
private String orderId;
@ApiModelProperty("业务项目名 或考试名 或作品名称")
private String relationName;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @ClassName: ManageTokenSwitchVO
* @author: zjl
* @date: 2021/1/15 9:24
*/
@Data
@ApiModel(value = "管理端兑换开关返回vo")
public class ManageTokenSwitchVO {
private Long siteId;
private Long companyId;
@ApiModelProperty(value = "10:积分 20:人民币 30:第三方商城")
private Integer type;
@ApiModelProperty(value = "false则关闭。true:打开")
private Boolean tokenSwitchBol;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @Date 2021/1/13 10:48 上午
* @Author lvjianhui
**/
@Data
@ApiModel
public class OrderDetailVO {
@ApiModelProperty("花费数量")
private Integer costCount;
@ApiModelProperty("充值方式 100:积分兑换 110:微信充值 120:支付宝充值 ")
private Integer type;
@ApiModelProperty("订单Id")
private String orderId;
@ApiModelProperty("充值账户")
private String accountName;
@ApiModelProperty("金币数量")
private Integer tokenCount;
@ApiModelProperty("时间")
private Date createdAt;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @ClassName: QualityContentVO
* @author: zjl
* @date: 2021/1/12 9:38
*/
@Data
@ApiModel("精品内容返回vo")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class QualityContentVO implements Serializable {
private static final long serialVersionUID = 1L;
private Long accountId;
@ApiModelProperty(value = "姓名")
private String fullName;
@ApiModelProperty(value = "用户名")
private String name;
@ApiModelProperty(value = "头像")
private String headPortrait;
@ApiModelProperty(value = "金币数")
private Integer tokenCount;
@ApiModelProperty(value = "兑换记录数", hidden = true)
private Integer exchangeLogsCount;
}
package com.yizhi.mall.application.pojo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @ClassName: StudentTokenLogVO
* @author: zjl
* @date: 2021/1/18 9:48
*/
@Data
@ApiModel(value = "学员端金币消费返回vo")
public class StudentTokenLogVO {
@ApiModelProperty("时间")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8")
private Date createdAt;
@ApiModelProperty("数量 +加 -减")
private Integer count;
@ApiModelProperty("业务类型 变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品")
private Integer type;
@ApiModelProperty("如果业务类型 属于平台业务,则为业务ID。如果有值,则更具该值跳相应业务的页面。如果无值则 更具订单ID跳订单详情页面")
private Long relationId;
@ApiModelProperty("业务项目名 或考试名 或作品名称")
private String relationName;
@ApiModelProperty(value = "业务 icoc")
private String relationIconUrl;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* @Date 2021/1/6 4:04 下午
* @Author lvjianhui
**/
@Data
@ApiModel
public class TokenConfigVO {
@ApiModelProperty("token 名称")
private String tokenName;
@ApiModelProperty("false:无条件 true:有条件")
private Boolean exchangeCondition;
@ApiModelProperty("DAY,WEEK,MONTH,QUARTER,HALFYEAR,YEAR,ALLTIME")
private String ruleType;
@ApiModelProperty("时间范围内退换总量")
private Integer ruleTokenCount;
@ApiModelProperty("兑换比例 100积分兑换 1金币时 返回100")
private BigDecimal rate;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @ClassName: TokenExchangeRuleVO
* @author: zjl
* @date: 2021/1/11 15:20
*/
@Data
@ApiModel("积分兑换金币规则返回vo")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TokenExchangeRuleVO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty(value = "虚拟币名称")
private String tokenName;
@ApiModelProperty(value = "兑换比例 100表示 100积分兑换 1金币")
private BigDecimal rate;
@ApiModelProperty(value = "0:无条件 1:有条件")
private Boolean exchangeCondition;
@ApiModelProperty(value = "DAY,WEEK,MONTH,QUARTER,HALFYEAR,YEAR,ALLTIME")
private String conditionRuleType;
@ApiModelProperty(value = "时间范围内兑换总量")
private Integer conditionRuleTokenCount;
}
package com.yizhi.mall.application.pojo.vo;
import com.yizhi.util.application.page.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @Date 2021/1/6 5:17 下午
* @Author lvjianhui
**/
@ApiModel
@Data
public class TokenLogMonthTotalVO {
@ApiModelProperty("时间")
private Long timestamp;
@ApiModelProperty("获取数量")
private Integer receiveCount = 0;
@ApiModelProperty("使用数量")
private Integer useCount = 0;
@ApiModelProperty(value = "明细")
private PageInfo<TokenLogVO> items;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @Date 2021/1/7 10:23 上午
* @Author lvjianhui
**/
@ApiModel
@Data
public class TokenLogVO {
@ApiModelProperty("时间")
private Date createdAt;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("数量 +加 -减")
private Integer count;
@ApiModelProperty("业务类型 变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品")
private Integer type;
@ApiModelProperty("如股业务类型 属于平台业务,则为业务ID。如果有值,则更具该值跳相应业务的页面。如果无值则 更具订单ID跳订单详情页面")
private Long relationId;
@ApiModelProperty("订单ID")
private String orderId;
@ApiModelProperty("业务项目名 或考试名 或作品名称")
private String relationName;
}
package com.yizhi.mall.application.pojo.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Date 2021/1/14 2:51 下午
* @Author lvjianhui
**/
@ApiModel
@Data
public class TokenSwitchVO {
@ApiModelProperty("10:积分 20:人民币 30:第三方商城")
private Integer type;
@ApiModelProperty("true:开启,false: 关闭")
private Boolean tokenSwitch;
}
<?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>cloud-mall</artifactId>
<groupId>com.yizhi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-mall-service</artifactId>
<properties>
<kotlin.version>1.4.10</kotlin.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.13.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>1.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!-- JPA + QueryDsl-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-orm</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-mall-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-system-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-point-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-training-project-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.yizhi</groupId>
<artifactId>cloud-enroll-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.14.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- <plugin>-->
<!-- <groupId>com.mysema.maven</groupId>-->
<!-- <artifactId>apt-maven-plugin</artifactId>-->
<!-- <version>1.1.3</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <goals>-->
<!-- <goal>process</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <outputDirectory>src/test/resources</outputDirectory>-->
<!-- <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.yizhi.mall.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Date 2020/10/21 9:58 上午
* @Author lvjianhui
**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableJpaAuditing
@EnableSwagger2
@EnableCaching
@EnableFeignClients(basePackages = {"com.yizhi"})
@ComponentScan(basePackages = {"com.yizhi"})
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
package com.yizhi.mall.application
import com.yizhi.mall.application.config.FeignRequestIntercept
import feign.RequestInterceptor
import org.springframework.context.annotation.Configuration
/**
* @Date 2021/1/19 1:59 下午
* @Author lvjianhui
**/
@Configuration
open class FeignConfig {
fun requestIntercept():RequestInterceptor {
return FeignRequestIntercept()
}
}
\ No newline at end of file
package com.yizhi.mall.application.config
import com.yizhi.core.application.context.ContextHolder
import feign.RequestInterceptor
import feign.RequestTemplate
import org.apache.commons.beanutils.BeanUtils
import org.apache.commons.lang.StringUtils
import org.springframework.stereotype.Component
/**
* @Date 2021/1/19 1:48 下午
* @Author lvjianhui
**/
@Component
class FeignRequestIntercept:RequestInterceptor {
override fun apply(template: RequestTemplate?) {
val map = BeanUtils.describe(ContextHolder.get())
map.filter { StringUtils.isNotEmpty(it.value)}.forEach { (key, value) ->
template!!.header(key,value)
}
}
}
\ No newline at end of file
package com.yizhi.mall.application.config;
import com.alibaba.fastjson.JSONObject;
import com.yizhi.core.application.context.ContextHolder;
import com.yizhi.core.application.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.lang.reflect.Method;
/**
* @Date 2021/1/14 1:33 下午
* @Author lvjianhui
**/
public class JpaListener {
private Logger logger = LoggerFactory.getLogger(JpaListener.class);
@PrePersist
public void prePersist(Object sourse){
try{
logger.trace("JpaListener 保存前 ==== clazz.fields:" + JSONObject.toJSONString(sourse));
Class clazz = sourse.getClass();
RequestContext requestContext = ContextHolder.get();
try{
Method methodsetCompanyId = clazz.getMethod("setCompanyId",Long.class);
methodsetCompanyId.invoke(sourse,requestContext.getCompanyId());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodsetCompanyId");
}
try {
Method methodSetSiteId = clazz.getMethod("setSiteId",Long.class);
methodSetSiteId.invoke(sourse,requestContext.getSiteId());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodSetSiteId");
}
try {
Method methodSetOrgId = clazz.getMethod("setOrgId",Long.class);
methodSetOrgId.invoke(sourse,requestContext.getOrgId());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodSetOrgId");
}
try {
Method methodSetAccountId = clazz.getMethod("setAccountId",Long.class);
methodSetAccountId.invoke(sourse,requestContext.getAccountId());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodSetAccountId");
}
try {
Method setAccountName = clazz.getMethod("setAccountName",String.class);
setAccountName.invoke(sourse,requestContext.getAccountName());
}catch (Exception e) {
logger.warn("NoSuchMethodException setAccountName");
}
try {
Method setAccountFullName = clazz.getMethod("setAccountFullName",String.class);
setAccountFullName.invoke(sourse,requestContext.getAccountFullName());
}catch (Exception e) {
logger.warn("NoSuchMethodException setAccountFullName");
}
try {
Method methodSetCreatedUid = clazz.getMethod("setCreatedUid",Long.class);
methodSetCreatedUid.invoke(sourse,requestContext.getAccountId());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodSetCreatedUid");
}
try {
Method methodSetCreatedName = clazz.getMethod("setCreatedName",String.class);
methodSetCreatedName.invoke(sourse,requestContext.getAccountName());
}catch (Exception e) {
logger.warn("NoSuchMethodException methodSetCreatedName");
}
logger.trace("JpaListener 保存前 ==== clazz.fields:" + JSONObject.toJSONString(sourse));
}catch (Exception e) {
logger.warn("JpaListener 保存前 ERROE ==== clazz.fields:" + JSONObject.toJSONString(sourse),e);
}
}
@PreUpdate
public void preUpdate(Object sourse) {
logger.trace("JpaListener 更新前 ==== clazz.fields:" + JSONObject.toJSONString(sourse));
Class clazz = sourse.getClass();
RequestContext requestContext = ContextHolder.get();
try {
Method setUpdatedUid = clazz.getMethod("setUpdatedUid",Long.class);
setUpdatedUid.invoke(sourse,requestContext.getAccountId());
}catch (Exception e) {
logger.warn("NoSuchMethodException setUpdatedUid");
}
try {
Method setUpdatedName = clazz.getMethod("setUpdatedName",String.class);
setUpdatedName.invoke(sourse,requestContext.getAccountName());
}catch (Exception e) {
logger.warn("NoSuchMethodException setUpdatedName");
}
logger.trace("JpaListener 更新前 ==== clazz.fields:" + JSONObject.toJSONString(sourse));
}
}
package com.yizhi.mall.application.config
/**
* @Date 2021/1/14 3:45 下午
* @Author lvjianhui
**/
enum class MallMsgEnum(var code:String, var msg:String,var remark:String ) {
POINT_EXCHANGE_CLOSE ("POINT_EXCHANGE_CLOSE","POINT_EXCHANGE_CLOSE","积分兑换金币入口已关闭"),
POINT_RULE_ERROR ("POINT_RULE_ERROR","POINT_RULE_ERROR","积分规则配置异常"),
POINT_EXCHANGE_TOKEN_LIMIT ("POINT_EXCHANGE_TOKEN_LIMIT","POINT_EXCHANGE_TOKEN_LIMIT","积分兑换金币已达上限"),
POINT_AMOUNT_NOT_ENOUGH ("POINT_AMOUNT_NOT_ENOUGH","POINT_AMOUNT_NOT_ENOUGH","积分数量不足"),
EXCHANGE_TOKEN_AMOUNT_ERROR ("EXCHANGE_TOKEN_AMOUNT_ERROR","EXCHANGE_TOKEN_AMOUNT_ERROR","兑换金币数必须大于0"),
PROJECT_APPLYED ("PROJECT_APPLYED","PROJECT_APPLYED","项目已报名"),
TOKEN_AMOUNT_ERROR ("TOKEN_AMOUNT_ERROR","TOKEN_AMOUNT_ERROR","金币数量不足"),
ACCOUNT_TOKEN_PROCESSING ("ACCOUNT_TOKEN_PROCESSING","ACCOUNT_TOKEN_PROCESSING","账户处理中"),
PROJECT_NOT_EXIST ("PROJECT_NOT_EXIST","PROJECT_NOT_EXIST","项目不存在,或已下架"),
PROJECT_PARAMS_ERROR ("PROJECT_PARAMS_ERROR","PROJECT_PARAMS_ERROR","项目报名方式设置有误"),
PROJECT_ENROOL_TIME_ERROR ("PROJECT_ENROOL_TIME_ERROR","PROJECT_ENROOL_TIME_ERROR","不在报名时间"),
PROJECT_ENROLL_ACCOUNT_NUM_LIMIT("PROJECT_ENROLL_ACCOUNT_NUM_LIMIT","PROJECT_ENROLL_ACCOUNT_NUM_LIMIT","报名人数已满")
}
\ No newline at end of file
package com.yizhi.mall.application.config
/**
* @Date 2021/1/18 11:03 上午
* @Author lvjianhui
**/
object RedisLock {
/**
* 用户金币分布式锁
*/
var ACCOUNT_TOKEN_LOCK = "ACCOUNT_TOKEN_LOCK_%s"
}
\ No newline at end of file
package com.yizhi.mall.application.config;
import feign.RequestInterceptor;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Author: shengchenglong
* @Date: 2018/3/6 14:30
*/
@Configuration
@EnableSwagger2
public class WebMvcConfigure extends WebMvcConfigurerAdapter {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("未木云")
.apiInfo(new ApiInfoBuilder()
.title("金币商城")
.version("1.0")
.build())
.select()
.apis(RequestHandlerSelectors.basePackage("com.yizhi"))
.paths(PathSelectors.any())
.build();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("docs.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public RequestInterceptor requestInterceptor() {
return new FeignRequestIntercept();
}
}
package com.yizhi.mall.application.config.constant
/**
* @Date 2021/1/18 2:01 下午
* @Author lvjianhui
**/
class TokenLogRelationDto {
var relationId:Long ? = null
var relationName:String ? = null
var relationIconUrl:String ? = null
var relationType:Int ? = null
var needToken:Int = 0
}
\ No newline at end of file
package com.yizhi.mall.application.controller.manage;
import cn.hutool.core.date.DateUtil;
import com.yizhi.core.application.context.ContextHolder;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.mall.application.excel.export.TokenLogExport;
import com.yizhi.mall.application.pojo.qo.ManageTokenLogQO;
import com.yizhi.mall.application.pojo.vo.ManageTokenLogVO;
import com.yizhi.mall.application.service.ITokenLogService;
import com.yizhi.util.application.domain.BizResponse;
import com.yizhi.util.application.page.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName: ManageTokenLogController
* @author: zjl
* @date: 2021/1/13 16:03
*/
@Api(tags = "管理端-金币消费")
@RestController
@RequestMapping("/manage/tokenLog")
public class ManageTokenLogController {
@Autowired
private ITokenLogService tokenLogService;
@Autowired
private TokenLogExport tokenLogExport;
@PostMapping("/list")
@ApiOperation(value = "获取消费记录")
public BizResponse<PageInfo<ManageTokenLogVO>> get(@RequestBody ManageTokenLogQO qo) {
RequestContext context = ContextHolder.get();
return BizResponse.ok(tokenLogService.getLogListByCondition(context, qo));
}
@PostMapping("/export")
@ApiOperation(value = "导出消费记录")
public BizResponse<String> export(@RequestBody ManageTokenLogQO qo) {
Map<String,Object> map = new HashMap<>();
RequestContext context = ContextHolder.get();
map.put("qo", qo);
map.put("context", context);
tokenLogExport.execute(map, true);
String formatDate = DateUtil.format(new Date(), "yyyyMMddHHmmss");
String taskName = "导出消费记录-" + formatDate;
return BizResponse.ok(taskName);
}
}
package com.yizhi.mall.application.controller.manage;
import com.yizhi.mall.application.domain.TokenSwitch;
import com.yizhi.mall.application.pojo.qo.TokenSwitchQO;
import com.yizhi.mall.application.pojo.vo.ManageTokenSwitchVO;
import com.yizhi.mall.application.pojo.vo.TokenSwitchVO;
import com.yizhi.mall.application.service.ITokenSwitchService;
import com.yizhi.mall.application.xservice.TokenConfigXService;
import com.yizhi.mall.application.xservice.TokenSwitchXService;
import com.yizhi.util.application.domain.BizResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @ClassName: ManageTokenSwitchController
* @author: zjl
* @date: 2021/1/15 9:22
*/
@Api(tags = "管理端-兑换开关")
@RestController
@RequestMapping("/manage/tokenSwitch")
public class ManageTokenSwitchController {
@Autowired
private TokenSwitchXService tokenSwitchXService;
@Autowired
private ITokenSwitchService tokenSwitchService;
@Autowired
private TokenConfigXService tokenConfigXService;
@GetMapping("/type/get")
@ApiOperation(value = "获取已打开的兑换开关")
public BizResponse<List<TokenSwitchVO>> getByType(@ApiParam(value = "10:积分 20:人民币 30:第三方商城") @RequestParam(value = "type", required = false) Integer type) {
List<TokenSwitchVO> aSwitch = tokenConfigXService.getSwitch(type);
return BizResponse.ok(aSwitch);
}
@PostMapping("/save")
@ApiOperation(value = "新增/修改兑换开关")
public BizResponse<ManageTokenSwitchVO> saveOrUpdate(@RequestBody TokenSwitchQO qo) {
TokenSwitch tokenSwitch = tokenSwitchXService.saveOrUpdateTokenSwitch(qo.getType(), qo.getTokenSwitchBol());
ManageTokenSwitchVO vo = new ManageTokenSwitchVO();
BeanUtils.copyProperties(tokenSwitch, vo);
return BizResponse.ok(vo);
}
}
package com.yizhi.mall.application.controller.manage;
import com.yizhi.mall.application.pojo.qo.TokenExchangeRuleQO;
import com.yizhi.mall.application.pojo.vo.TokenConfigVO;
import com.yizhi.mall.application.pojo.vo.TokenExchangeRuleVO;
import com.yizhi.mall.application.service.IAccountTokenService;
import com.yizhi.mall.application.service.ITokenExchangeRuleService;
import com.yizhi.mall.application.xservice.TokenConfigXService;
import com.yizhi.util.application.domain.BizResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
/**
* @ClassName: TokenExchangeRuleController
* @author: zjl
* @date: 2021/1/11 15:03
*/
@RestController
@RequestMapping("/manage/tokenExchangeRule")
@Api(tags = "管理端-积分兑换金币规则")
public class TokenExchangeRuleController {
@Autowired
private ITokenExchangeRuleService tokenExchangeRuleService;
@Autowired
private TokenConfigXService tokenConfigXService;
@GetMapping("/get")
@ApiOperation(value = "获取规则")
public BizResponse<TokenConfigVO> get() {
TokenConfigVO config = tokenConfigXService.getRuleBySiteId();
return BizResponse.ok(config);
}
@PostMapping("/save")
@ApiOperation(value = "新增/修改规则")
public BizResponse<TokenExchangeRuleVO> saveOrUpdate(@RequestBody TokenExchangeRuleQO qo) {
tokenExchangeRuleService.saveOrUpdateTokenExchangeRule(qo);
return BizResponse.ok();
}
}
package com.yizhi.mall.application.controller.student;
import com.yizhi.mall.application.pojo.vo.QualityContentVO;
import com.yizhi.mall.application.xservice.QualityContentXService;
import com.yizhi.training.application.param.PaidTrainingProjectQO;
import com.yizhi.training.application.vo.api.PaidTrainingProjectVO;
import com.yizhi.util.application.domain.BizResponse;
import com.yizhi.util.application.page.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassName: QualityContentController
* @author: zjl
* @date: 2021/1/12 9:35
*/
@Api(tags = "学员端-精品内容")
@RestController
@RequestMapping("/student/qualityContent")
public class QualityContentController {
@Autowired
private QualityContentXService qualityContentXService;
@GetMapping("/get")
@ApiOperation(value = "获取精品内容个人信息")
public BizResponse<QualityContentVO> get() {
return BizResponse.ok(qualityContentXService.getQualityContent());
}
@PostMapping("/paidProject/get")
@ApiOperation(value = "获取精品内容付费项目")
public BizResponse<PageInfo<PaidTrainingProjectVO>> getPaidProject(@RequestBody PaidTrainingProjectQO qo) {
return BizResponse.ok(qualityContentXService.getPaidTrainingProject(qo));
}
}
package com.yizhi.mall.application.controller.student;
import com.yizhi.mall.application.pojo.vo.StudentTokenLogVO;
import com.yizhi.mall.application.service.ITokenLogService;
import com.yizhi.util.application.domain.BizResponse;
import com.yizhi.util.application.page.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: StudentTokenLogController
* @author: zjl
* @date: 2021/1/18 9:35
*/
@Api(tags = "学员端-金币消费")
@RestController
@RequestMapping("/student/tokenLog")
public class StudentTokenLogController {
@Autowired
private ITokenLogService tokenLogService;
@GetMapping("/list")
@ApiOperation(value = "获取消费记录")
public BizResponse<PageInfo<StudentTokenLogVO>> get(@RequestParam(value = "pageNo")Integer pageNo,
@RequestParam(value = "pageSize")Integer pageSize) {
return BizResponse.ok(tokenLogService.getLogPageByUserId(pageNo, pageSize));
}
}
package com.yizhi.mall.application.controller.student
import com.yizhi.mall.application.pojo.vo.TokenConfigVO
import com.yizhi.mall.application.pojo.vo.TokenSwitchVO
import com.yizhi.mall.application.xservice.TokenConfigXService
import com.yizhi.util.application.domain.BizResponse
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
/**
* @Date 2021/1/6 4:02 下午
* @Author lvjianhui
**/
@RestController
@RequestMapping("/student/token/config")
@Api(tags = arrayOf("金币配置规则"))
class TokenConfigController {
@Autowired
lateinit var tokenConfigXService: TokenConfigXService
@GetMapping("/rule")
@ApiOperation("兑换规则查询")
fun getTokenConfig(): BizResponse<TokenConfigVO> {
val vo = tokenConfigXService.getRuleBySiteId()
return BizResponse.ok(vo)
}
@GetMapping("/switch")
@ApiOperation("根据type 查询 指定开关 10:积分 20:人民币 30:第三方商城。如果返回数据为null,则为关闭")
fun getTokenSwitch(@RequestParam("") type:Int):BizResponse<List<TokenSwitchVO>> {
val vos = tokenConfigXService.getSwitch(type)
return BizResponse.ok(vos)
}
}
\ No newline at end of file
package com.yizhi.mall.application.controller.student
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.mall.application.pojo.qo.ApplyProjectPO
import com.yizhi.mall.application.pojo.qo.TokenExchangePO
import com.yizhi.mall.application.service.IAccountTokenService
import com.yizhi.mall.application.xservice.TokenXService
import com.yizhi.util.application.domain.BizResponse
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*
/**
* @Date 2021/1/11 12:01 下午
* @Author lvjianhui
**/
@RestController
@RequestMapping("/student/token")
@Api(tags = arrayOf("金币"))
class TokenController {
@Autowired
lateinit var iAccountTokenService:IAccountTokenService
@Autowired
lateinit var tokenXService : TokenXService
@GetMapping("/amount")
@ApiOperation("获取用户当前金币数量")
fun getTokenAmount():BizResponse<Int> {
val rc = ContextHolder.get()
val amount = iAccountTokenService.getTokenCountById(rc.companyId,rc.siteId,rc.accountId)
return BizResponse.ok(amount)
}
@GetMapping("/point/amount")
@ApiOperation("获取可用积分数量")
fun getPointCount():BizResponse<Int> {
val amount = tokenXService.getPointCount()
return BizResponse.ok(amount)
}
@PostMapping("/exchange/by/point")
@ApiOperation("积分换金币")
fun exchangeToken(@RequestBody po: TokenExchangePO):BizResponse<*> {
tokenXService.pointExchangeToken(po)
return BizResponse.ok("")
}
@PostMapping("/cost/to/project")
@ApiOperation("花费金币-项目报名")
fun costToProject(@RequestBody po: ApplyProjectPO):BizResponse<*> {
tokenXService.costToProject(po)
return BizResponse.ok("")
}
}
\ No newline at end of file
package com.yizhi.mall.application.controller.student
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.mall.application.pojo.vo.OrderDetailVO
import com.yizhi.mall.application.pojo.vo.TokenLogMonthTotalVO
import com.yizhi.mall.application.pojo.vo.TokenLogVO
import com.yizhi.mall.application.xservice.TokenLogXService
import com.yizhi.util.application.domain.BizResponse
import com.yizhi.util.application.page.PageInfo
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.annotations.ApiParam
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
/**
* @Date 2021/1/6 5:04 下午
* @Author lvjianhui
**/
@RestController
@RequestMapping("/student/token/log")
@Api(tags = arrayOf("金币明细"))
class TokenLogController {
@Autowired
lateinit var tokenLogXService : TokenLogXService
@GetMapping("/list")
@ApiOperation("按月获取金币明细")
fun getTokenLogList(
@RequestParam("type",required = false) @ApiParam("变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品") type:Int?,
@RequestParam("pageIndex",required = false,defaultValue = "1") pageIndex:Int?,
@RequestParam("pageSize",required = false,defaultValue = "10") pageSize:Int?,
@RequestParam("startAt",required = false) startAt:Long?):BizResponse<TokenLogMonthTotalVO> {
// val requestContext = ContextHolder.get()
val vo = tokenLogXService.getTokenTotal(startAt,type,pageIndex!!,pageSize!!) ?: return BizResponse.ok()
// val page = tokenLogXService.getLogByType(requestContext,startAt,type,pageIndex!!,pageSize!!)
// vo.items = page
return BizResponse.ok(vo)
}
@GetMapping("/order/detail")
@ApiOperation("获取订单详情")
fun getOrderDetail(@RequestParam("orderId") orderId:String):BizResponse<OrderDetailVO> {
val requestContext = ContextHolder.get()
val vo = tokenLogXService.getOrderDetail(requestContext.accountId,requestContext.companyId,requestContext.siteId,orderId)
return BizResponse.ok(vo)
}
}
\ No newline at end of file
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
* 用户兑换金币明细记录表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "AccountExchangeLog", description = "用户兑换金币明细记录表")
@TableName("account_exchange_log")
@Entity
@EntityListeners(value = {JpaListener.class})
public class AccountExchangeLog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "类型 10:积分 100:支付宝 110:微信")
private Integer type;
@ApiModelProperty(value = "花费总量 人名币单位为分")
private Integer count;
@ApiModelProperty(value = "兑换比例 100 表示 100:1 100积分兑换 1金币")
@TableField("exchange_rate")
private BigDecimal exchangeRate;
@ApiModelProperty(value = "获得金币数量")
@TableField("token_count")
private Integer tokenCount;
@TableField("company_id")
private Long companyId;
@TableField("site_id")
private Long siteId;
@TableField("org_id")
private Long orgId;
@TableField("created_at")
private Date createdAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
public BigDecimal getExchangeRate() {
return exchangeRate;
}
public void setExchangeRate(BigDecimal exchangeRate) {
this.exchangeRate = exchangeRate;
}
public Integer getTokenCount() {
return tokenCount;
}
public void setTokenCount(Integer tokenCount) {
this.tokenCount = tokenCount;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "AccountExchangeLog{" +
", id=" + id +
", accountId=" + accountId +
", type=" + type +
", count=" + count +
", exchangeRate=" + exchangeRate +
", tokenCount=" + tokenCount +
", companyId=" + companyId +
", siteId=" + siteId +
", orgId=" + orgId +
", createdAt=" + createdAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
* 用户金币兑换汇总表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "AccountExchangeSum", description = "用户金币兑换汇总表")
@TableName("account_exchange_sum")
@Entity
@EntityListeners(value = {JpaListener.class})
public class AccountExchangeSum implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "类型 10:积分 100:人名币")
private Integer type;
@ApiModelProperty(value = "已消耗总量 人名币单位为分")
private Integer total;
@ApiModelProperty(value = "兑换金币总量")
@TableField("token_total")
private Integer tokenTotal;
@TableField("company_id")
private Long companyId;
@TableField("site_id")
private Long siteId;
@TableField("created_at")
private Date createdAt;
@TableField("updated_at")
private Date updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
public Integer getTokenTotal() {
return tokenTotal;
}
public void setTokenTotal(Integer tokenTotal) {
this.tokenTotal = tokenTotal;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
@Override
public String toString() {
return "AccountExchangeSum{" +
", id=" + id +
", accountId=" + accountId +
", type=" + type +
", total=" + total +
", tokenTotal=" + tokenTotal +
", companyId=" + companyId +
", siteId=" + siteId +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
* 用户金币表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "AccountToken", description = "用户金币表")
@TableName("account_token")
@Entity
@EntityListeners(value = {JpaListener.class})
public class AccountToken implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@ApiModelProperty(value = "用户ID")
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "当前金币数量")
private Integer amount;
@TableField("company_id")
private Long companyId;
@TableField("site_id")
private Long siteId;
@TableField("org_id")
private Long orgId;
@TableField("created_at")
private Date createdAt;
@TableField("updated_at")
private Date updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
@Override
public String toString() {
return "AccountToken{" +
", id=" + id +
", accountId=" + accountId +
", amount=" + amount +
", companyId=" + companyId +
", siteId=" + siteId +
", orgId=" + orgId +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QAccountExchangeLog is a Querydsl query type for AccountExchangeLog
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QAccountExchangeLog extends EntityPathBase<AccountExchangeLog> {
private static final long serialVersionUID = -1452765066L;
public static final QAccountExchangeLog accountExchangeLog = new QAccountExchangeLog("accountExchangeLog");
public final NumberPath<Long> accountId = createNumber("accountId", Long.class);
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final NumberPath<Integer> count = createNumber("count", Integer.class);
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final NumberPath<java.math.BigDecimal> exchangeRate = createNumber("exchangeRate", java.math.BigDecimal.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<Long> orgId = createNumber("orgId", Long.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final NumberPath<Integer> tokenCount = createNumber("tokenCount", Integer.class);
public final NumberPath<Integer> type = createNumber("type", Integer.class);
public QAccountExchangeLog(String variable) {
super(AccountExchangeLog.class, forVariable(variable));
}
public QAccountExchangeLog(Path<? extends AccountExchangeLog> path) {
super(path.getType(), path.getMetadata());
}
public QAccountExchangeLog(PathMetadata metadata) {
super(AccountExchangeLog.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QAccountExchangeSum is a Querydsl query type for AccountExchangeSum
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QAccountExchangeSum extends EntityPathBase<AccountExchangeSum> {
private static final long serialVersionUID = -1452758147L;
public static final QAccountExchangeSum accountExchangeSum = new QAccountExchangeSum("accountExchangeSum");
public final NumberPath<Long> accountId = createNumber("accountId", Long.class);
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final NumberPath<Integer> tokenTotal = createNumber("tokenTotal", Integer.class);
public final NumberPath<Integer> total = createNumber("total", Integer.class);
public final NumberPath<Integer> type = createNumber("type", Integer.class);
public final DateTimePath<java.util.Date> updatedAt = createDateTime("updatedAt", java.util.Date.class);
public QAccountExchangeSum(String variable) {
super(AccountExchangeSum.class, forVariable(variable));
}
public QAccountExchangeSum(Path<? extends AccountExchangeSum> path) {
super(path.getType(), path.getMetadata());
}
public QAccountExchangeSum(PathMetadata metadata) {
super(AccountExchangeSum.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QAccountToken is a Querydsl query type for AccountToken
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QAccountToken extends EntityPathBase<AccountToken> {
private static final long serialVersionUID = 813836302L;
public static final QAccountToken accountToken = new QAccountToken("accountToken");
public final NumberPath<Long> accountId = createNumber("accountId", Long.class);
public final NumberPath<Integer> amount = createNumber("amount", Integer.class);
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<Long> orgId = createNumber("orgId", Long.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final DateTimePath<java.util.Date> updatedAt = createDateTime("updatedAt", java.util.Date.class);
public QAccountToken(String variable) {
super(AccountToken.class, forVariable(variable));
}
public QAccountToken(Path<? extends AccountToken> path) {
super(path.getType(), path.getMetadata());
}
public QAccountToken(PathMetadata metadata) {
super(AccountToken.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QTokenExchangeRule is a Querydsl query type for TokenExchangeRule
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QTokenExchangeRule extends EntityPathBase<TokenExchangeRule> {
private static final long serialVersionUID = 1378317654L;
public static final QTokenExchangeRule tokenExchangeRule = new QTokenExchangeRule("tokenExchangeRule");
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final NumberPath<Integer> conditionRuleTokenCount = createNumber("conditionRuleTokenCount", Integer.class);
public final StringPath conditionRuleType = createString("conditionRuleType");
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final StringPath createdName = createString("createdName");
public final NumberPath<Long> createdUid = createNumber("createdUid", Long.class);
public final BooleanPath exchangeCondition = createBoolean("exchangeCondition");
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<java.math.BigDecimal> rate = createNumber("rate", java.math.BigDecimal.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final StringPath tokenIconUrl = createString("tokenIconUrl");
public final StringPath tokenName = createString("tokenName");
public final DateTimePath<java.util.Date> updatedAt = createDateTime("updatedAt", java.util.Date.class);
public final StringPath updatedName = createString("updatedName");
public final NumberPath<Long> updatedUid = createNumber("updatedUid", Long.class);
public QTokenExchangeRule(String variable) {
super(TokenExchangeRule.class, forVariable(variable));
}
public QTokenExchangeRule(Path<? extends TokenExchangeRule> path) {
super(path.getType(), path.getMetadata());
}
public QTokenExchangeRule(PathMetadata metadata) {
super(TokenExchangeRule.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QTokenExchangeRuleLog is a Querydsl query type for TokenExchangeRuleLog
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QTokenExchangeRuleLog extends EntityPathBase<TokenExchangeRuleLog> {
private static final long serialVersionUID = 1573957134L;
public static final QTokenExchangeRuleLog tokenExchangeRuleLog = new QTokenExchangeRuleLog("tokenExchangeRuleLog");
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final NumberPath<Integer> conditionRuleTokenCount = createNumber("conditionRuleTokenCount", Integer.class);
public final StringPath conditionRuleType = createString("conditionRuleType");
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final StringPath createdName = createString("createdName");
public final NumberPath<Long> createdUid = createNumber("createdUid", Long.class);
public final NumberPath<Integer> exchangeCondition = createNumber("exchangeCondition", Integer.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<java.math.BigDecimal> rate = createNumber("rate", java.math.BigDecimal.class);
public final NumberPath<Long> ruleId = createNumber("ruleId", Long.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final StringPath tokenName = createString("tokenName");
public QTokenExchangeRuleLog(String variable) {
super(TokenExchangeRuleLog.class, forVariable(variable));
}
public QTokenExchangeRuleLog(Path<? extends TokenExchangeRuleLog> path) {
super(path.getType(), path.getMetadata());
}
public QTokenExchangeRuleLog(PathMetadata metadata) {
super(TokenExchangeRuleLog.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QTokenLog is a Querydsl query type for TokenLog
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QTokenLog extends EntityPathBase<TokenLog> {
private static final long serialVersionUID = 1898907597L;
public static final QTokenLog tokenLog = new QTokenLog("tokenLog");
public final StringPath accountFullName = createString("accountFullName");
public final NumberPath<Long> accountId = createNumber("accountId", Long.class);
public final StringPath accountName = createString("accountName");
public final NumberPath<Integer> afterCount = createNumber("afterCount", Integer.class);
public final NumberPath<Integer> beforeCount = createNumber("beforeCount", Integer.class);
public final NumberPath<Integer> changeType = createNumber("changeType", Integer.class);
public final NumberPath<Integer> changeCount = createNumber("changeCount", Integer.class);
public final NumberPath<Integer> costCount = createNumber("costCount", Integer.class);
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final StringPath msg = createString("msg");
public final StringPath orderId = createString("orderId");
public final NumberPath<Long> orgId = createNumber("orgId", Long.class);
public final NumberPath<Long> relationId = createNumber("relationId", Long.class);
public final NumberPath<Integer> relationType = createNumber("relationType", Integer.class);
public final StringPath remark = createString("remark");
public final StringPath relationName = createString("relationName");
public final StringPath relationIconUrl = createString("relationIconUrl");
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final NumberPath<Long> thirdOrderId = createNumber("thirdOrderId", Long.class);
public final NumberPath<Long> tokenId = createNumber("tokenId", Long.class);
public final NumberPath<Integer> type = createNumber("type", Integer.class);
public QTokenLog(String variable) {
super(TokenLog.class, forVariable(variable));
}
public QTokenLog(Path<? extends TokenLog> path) {
super(path.getType(), path.getMetadata());
}
public QTokenLog(PathMetadata metadata) {
super(TokenLog.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import static com.querydsl.core.types.PathMetadataFactory.*;
import com.querydsl.core.types.dsl.*;
import com.querydsl.core.types.PathMetadata;
import javax.annotation.Generated;
import com.querydsl.core.types.Path;
/**
* QTokenSwitch is a Querydsl query type for TokenSwitch
*/
@Generated("com.querydsl.codegen.EntitySerializer")
public class QTokenSwitch extends EntityPathBase<TokenSwitch> {
private static final long serialVersionUID = 1549933067L;
public static final QTokenSwitch tokenSwitch = new QTokenSwitch("tokenSwitch");
public final NumberPath<Long> companyId = createNumber("companyId", Long.class);
public final DateTimePath<java.util.Date> createdAt = createDateTime("createdAt", java.util.Date.class);
public final NumberPath<Long> createdUid = createNumber("createdUid", Long.class);
public final NumberPath<Long> id = createNumber("id", Long.class);
public final NumberPath<Long> siteId = createNumber("siteId", Long.class);
public final BooleanPath tokenSwitchBol = createBoolean("tokenSwitchBol");
public final NumberPath<Integer> type = createNumber("type", Integer.class);
public final DateTimePath<java.util.Date> updatedAt = createDateTime("updatedAt", java.util.Date.class);
public final NumberPath<Long> updatedUid = createNumber("updatedUid", Long.class);
public QTokenSwitch(String variable) {
super(TokenSwitch.class, forVariable(variable));
}
public QTokenSwitch(Path<? extends TokenSwitch> path) {
super(path.getType(), path.getMetadata());
}
public QTokenSwitch(PathMetadata metadata) {
super(TokenSwitch.class, metadata);
}
}
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
* 积分兑换金币规则表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "TokenExchangeRule", description = "积分兑换金币规则表")
@TableName("token_exchange_rule")
@Entity
@EntityListeners(value = {JpaListener.class})
public class TokenExchangeRule implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@ApiModelProperty(value = "虚拟币名称")
@TableField("token_name")
private String tokenName;
@TableField("token_icon_url")
private String tokenIconUrl;
@ApiModelProperty(value = "兑换比例 100表示 100积分兑换 1金币")
private BigDecimal rate;
@ApiModelProperty(value = "0:无条件 1:有条件")
@TableField("exchange_condition")
private Boolean exchangeCondition;
@ApiModelProperty(value = "DAY,WEEK,MONTH,QUARTER,HALFYEAR,YEAR")
@TableField("condition_rule_type")
private String conditionRuleType;
@ApiModelProperty(value = "时间范围内兑换总量")
@TableField("condition_rule_token_count")
private Integer conditionRuleTokenCount;
@TableField("company_id")
private Long companyId;
@TableField("site_Id")
private Long siteId;
@ApiModelProperty(value = "创建人ID")
@TableField("created_uid")
private Long createdUid;
@ApiModelProperty(value = "创建人name")
@TableField("created_name")
private String createdName;
@TableField("updated_uid")
private Long updatedUid;
@TableField("updated_name")
private String updatedName;
@TableField("created_at")
private Date createdAt;
@TableField("updated_at")
private Date updatedAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTokenName() {
return tokenName;
}
public void setTokenName(String tokenName) {
this.tokenName = tokenName;
}
public String getTokenIconUrl() {
return tokenIconUrl;
}
public void setTokenIconUrl(String tokenIconUrl) {
this.tokenIconUrl = tokenIconUrl;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
public Boolean getExchangeCondition() {
return exchangeCondition;
}
public void setExchangeCondition(Boolean exchangeCondition) {
this.exchangeCondition = exchangeCondition;
}
public String getConditionRuleType() {
return conditionRuleType;
}
public void setConditionRuleType(String conditionRuleType) {
this.conditionRuleType = conditionRuleType;
}
public Integer getConditionRuleTokenCount() {
return conditionRuleTokenCount;
}
public void setConditionRuleTokenCount(Integer conditionRuleTokenCount) {
this.conditionRuleTokenCount = conditionRuleTokenCount;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getCreatedUid() {
return createdUid;
}
public void setCreatedUid(Long createdUid) {
this.createdUid = createdUid;
}
public String getCreatedName() {
return createdName;
}
public void setCreatedName(String createdName) {
this.createdName = createdName;
}
public Long getUpdatedUid() {
return updatedUid;
}
public void setUpdatedUid(Long updatedUid) {
this.updatedUid = updatedUid;
}
public String getUpdatedName() {
return updatedName;
}
public void setUpdatedName(String updatedName) {
this.updatedName = updatedName;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
@Override
public String toString() {
return "TokenExchangeRule{" +
", id=" + id +
", tokenName=" + tokenName +
", tokenIconUrl=" + tokenIconUrl +
", rate=" + rate +
", exchangeCondition=" + exchangeCondition +
", conditionRuleType=" + conditionRuleType +
", conditionRuleTokenCount=" + conditionRuleTokenCount +
", companyId=" + companyId +
", siteId=" + siteId +
", createdUid=" + createdUid +
", createdName=" + createdName +
", updatedUid=" + updatedUid +
", updatedName=" + updatedName +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.yizhi.mall.application.config.JpaListener;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* <p>
* 积分兑换金币规则表日志表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "TokenExchangeRuleLog", description = "积分兑换金币规则表日志表")
@TableName("token_exchange_rule_log")
@Entity
@EntityListeners(value = {JpaListener.class})
public class TokenExchangeRuleLog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@TableField("rule_id")
private Long ruleId;
@ApiModelProperty(value = "虚拟币名称")
@TableField("token_name")
private String tokenName;
@ApiModelProperty(value = "兑换比例 100表示 100积分兑换 1金币")
private BigDecimal rate;
@ApiModelProperty(value = "0:无条件 1:有条件")
@TableField("exchange_condition")
private Boolean exchangeCondition;
@ApiModelProperty(value = "DAY,WEEK,MONTH,QUARTER,HALFYEAR,YEAR")
@TableField("condition_rule_type")
private String conditionRuleType;
@ApiModelProperty(value = "时间范围内退换总量")
@TableField("condition_rule_token_count")
private Integer conditionRuleTokenCount;
@TableField("company_id")
private Long companyId;
@TableField("site_Id")
private Long siteId;
@ApiModelProperty(value = "创建人ID")
@TableField("created_uid")
private Long createdUid;
@ApiModelProperty(value = "创建人name")
@TableField("created_name")
private String createdName;
@TableField("created_at")
private Date createdAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getRuleId() {
return ruleId;
}
public void setRuleId(Long ruleId) {
this.ruleId = ruleId;
}
public String getTokenName() {
return tokenName;
}
public void setTokenName(String tokenName) {
this.tokenName = tokenName;
}
public BigDecimal getRate() {
return rate;
}
public void setRate(BigDecimal rate) {
this.rate = rate;
}
public Boolean getExchangeCondition() {
return exchangeCondition;
}
public void setExchangeCondition(Boolean exchangeCondition) {
this.exchangeCondition = exchangeCondition;
}
public String getConditionRuleType() {
return conditionRuleType;
}
public void setConditionRuleType(String conditionRuleType) {
this.conditionRuleType = conditionRuleType;
}
public Integer getConditionRuleTokenCount() {
return conditionRuleTokenCount;
}
public void setConditionRuleTokenCount(Integer conditionRuleTokenCount) {
this.conditionRuleTokenCount = conditionRuleTokenCount;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getCreatedUid() {
return createdUid;
}
public void setCreatedUid(Long createdUid) {
this.createdUid = createdUid;
}
public String getCreatedName() {
return createdName;
}
public void setCreatedName(String createdName) {
this.createdName = createdName;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "TokenExchangeRuleLog{" +
", id=" + id +
", ruleId=" + ruleId +
", tokenName=" + tokenName +
", rate=" + rate +
", exchangeCondition=" + exchangeCondition +
", conditionRuleType=" + conditionRuleType +
", conditionRuleTokenCount=" + conditionRuleTokenCount +
", companyId=" + companyId +
", siteId=" + siteId +
", createdUid=" + createdUid +
", createdName=" + createdName +
", createdAt=" + createdAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
* 金币明细表
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-13
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "TokenLog", description = "金币明细表")
@TableName("token_log")
@Entity
@EntityListeners(value = {JpaListener.class})
public class TokenLog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
@ApiModelProperty(value = "金币账户ID")
@TableField("token_id")
private Long tokenId;
@ApiModelProperty(value = "用户ID")
@TableField("account_id")
private Long accountId;
@ApiModelProperty(value = "用户名")
@TableField("account_name")
private String accountName;
@ApiModelProperty(value = "用户姓名")
@TableField("account_full_name")
private String accountFullName;
@ApiModelProperty(value = "平台订单号 新增token_log是生成")
@TableField("order_id")
private String orderId;
@ApiModelProperty(value = "第三方订单号 如果是微信,支付宝 第三方商城 等需要填写")
@TableField("third_order_id")
private Long thirdOrderId;
@ApiModelProperty(value = "变动类型 -1减 ,1加")
@TableField("change_type")
private Integer changeType;
@ApiModelProperty(value = "变更前数量")
@TableField("before_count")
private Integer beforeCount;
@ApiModelProperty(value = "本次变更数量 + 加 -减")
@TableField("change_count")
private Integer changeCount;
@ApiModelProperty(value = "变更后数量")
@TableField("after_count")
private Integer afterCount;
@ApiModelProperty(value = "变更类型 100:积分兑换 110:微信充值 120:支付宝充值 180:帖子被打赏 181:回帖被打赏 182:作品被打赏 200:项目报名 210:课程报名 280:打赏帖子 281:打赏回帖 282:打赏作品 300:购买第三方产品")
private Integer type;
@ApiModelProperty(value = "兑换金币 消耗积分或人名币数量 ")
@TableField("cost_count")
private Integer costCount;
@ApiModelProperty(value = "业务 类型 消费购买仅在部分type下有效")
@TableField("relation_type")
private Integer relationType;
@ApiModelProperty(value = "业务 名 考试名 或项目名")
@TableField("relation_name")
private String relationName;
@ApiModelProperty(value = "业务 icoc")
@TableField("relation_icon_url")
private String relationIconUrl;
@ApiModelProperty(value = "业务ID 消费购买")
@TableField("relation_id")
private Long relationId;
@ApiModelProperty(value = "订单 提示")
private String msg;
@ApiModelProperty(value = "备注")
private String remark;
@TableField("company_id")
private Long companyId;
@TableField("site_id")
private Long siteId;
@TableField("org_id")
private Long orgId;
@TableField("created_at")
private Date createdAt;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getTokenId() {
return tokenId;
}
public void setTokenId(Long tokenId) {
this.tokenId = tokenId;
}
public Long getAccountId() {
return accountId;
}
public void setAccountId(Long accountId) {
this.accountId = accountId;
}
public String getAccountName() {
return accountName;
}
public void setAccountName(String accountName) {
this.accountName = accountName;
}
public String getAccountFullName() {
return accountFullName;
}
public void setAccountFullName(String accountFullName) {
this.accountFullName = accountFullName;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public Long getThirdOrderId() {
return thirdOrderId;
}
public void setThirdOrderId(Long thirdOrderId) {
this.thirdOrderId = thirdOrderId;
}
public Integer getChangeType() {
return changeType;
}
public void setChangeType(Integer changeType) {
this.changeType = changeType;
}
public Integer getBeforeCount() {
return beforeCount;
}
public void setBeforeCount(Integer beforeCount) {
this.beforeCount = beforeCount;
}
public Integer getChangeCount() {
return changeCount;
}
public void setChangeCount(Integer changeCount) {
this.changeCount = changeCount;
}
public Integer getAfterCount() {
return afterCount;
}
public void setAfterCount(Integer afterCount) {
this.afterCount = afterCount;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getCostCount() {
return costCount;
}
public void setCostCount(Integer costCount) {
this.costCount = costCount;
}
public Integer getRelationType() {
return relationType;
}
public void setRelationType(Integer relationType) {
this.relationType = relationType;
}
public String getRelationName() {
return relationName;
}
public void setRelationName(String relationName) {
this.relationName = relationName;
}
public String getRelationIconUrl() {
return relationIconUrl;
}
public void setRelationIconUrl(String relationIconUrl) {
this.relationIconUrl = relationIconUrl;
}
public Long getRelationId() {
return relationId;
}
public void setRelationId(Long relationId) {
this.relationId = relationId;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
@Override
public String toString() {
return "TokenLog{" +
", id=" + id +
", tokenId=" + tokenId +
", accountId=" + accountId +
", accountName=" + accountName +
", accountFullName=" + accountFullName +
", orderId=" + orderId +
", thirdOrderId=" + thirdOrderId +
", changeType=" + changeType +
", beforeCount=" + beforeCount +
", changeCount=" + changeCount +
", afterCount=" + afterCount +
", type=" + type +
", costCount=" + costCount +
", relationType=" + relationType +
", relationName=" + relationName +
", relationIconUrl=" + relationIconUrl +
", relationId=" + relationId +
", msg=" + msg +
", remark=" + remark +
", companyId=" + companyId +
", siteId=" + siteId +
", orgId=" + orgId +
", createdAt=" + createdAt +
"}";
}
}
package com.yizhi.mall.application.domain;
import java.io.Serializable;
import com.baomidou.mybatisplus.enums.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableName;
import java.io.Serializable;
import com.yizhi.mall.application.config.JpaListener;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
/**
* <p>
*
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-11
*/
@DynamicUpdate
@DynamicInsert
@Api(tags = "TokenSwitch", description = "")
@TableName("token_switch")
@Entity
@EntityListeners(value = {JpaListener.class})
public class TokenSwitch implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@TableId(value="id", type= IdType.AUTO)
private Long id;
@TableField("site_id")
private Long siteId;
@TableField("company_id")
private Long companyId;
@ApiModelProperty(value = "10:积分 20:人民币 30:第三方商城")
private Integer type;
@ApiModelProperty(value = "如果为0,则关闭。1:打开")
@TableField("token_switch")
private Boolean tokenSwitchBol;
@TableField("created_at")
private Date createdAt;
@TableField("created_uid")
private Long createdUid;
@TableField("updated_at")
private Date updatedAt;
@TableField("updated_uid")
private Long updatedUid;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getSiteId() {
return siteId;
}
public void setSiteId(Long siteId) {
this.siteId = siteId;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Boolean getTokenSwitchBol() {
return tokenSwitchBol;
}
public void setTokenSwitchBol(Boolean tokenSwitch) {
this.tokenSwitchBol = tokenSwitch;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Long getCreatedUid() {
return createdUid;
}
public void setCreatedUid(Long createdUid) {
this.createdUid = createdUid;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
public Long getUpdatedUid() {
return updatedUid;
}
public void setUpdatedUid(Long updatedUid) {
this.updatedUid = updatedUid;
}
@Override
public String toString() {
return "TokenSwitch{" +
", id=" + id +
", siteId=" + siteId +
", companyId=" + companyId +
", type=" + type +
", tokenSwitchBol=" + tokenSwitchBol +
", createdAt=" + createdAt +
", createdUid=" + createdUid +
", updatedAt=" + updatedAt +
", updatedUid=" + updatedUid +
"}";
}
}
package com.yizhi.mall.application.excel.convert;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.NumberUtils;
import java.text.ParseException;
public class CustomTokenLogTypeConverter implements Converter<Integer> {
@Override
public Class supportJavaTypeKey() {
return Integer.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 这里是读的时候会调用 不用管
*
* @param cellData NotNull
* @param contentProperty Nullable
* @param globalConfiguration NotNull
* @return
*/
@Override
public Integer convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws ParseException {
return NumberUtils.parseInteger(cellData.getStringValue(), contentProperty);
}
/**
* 这里是写的时候会调用 不用管
*
* @param value NotNull
* @param contentProperty Nullable
* @param globalConfiguration NotNull
* @return
*/
@Override
public CellData convertToExcelData(Integer value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
CellData finalValue = new CellData("默认");
switch (value) {
case 100:
finalValue = new CellData("积分兑换");
break;
case 110:
finalValue = new CellData("微信充值");
break;
case 120:
finalValue = new CellData("支付宝充值");
break;
case 180:
finalValue = new CellData("帖子被打赏");
break;
case 181:
finalValue = new CellData("回帖被打赏");
break;
case 182:
finalValue = new CellData("作品被打赏");
break;
case 200:
finalValue = new CellData("项目报名");
break;
case 210:
finalValue = new CellData("课程报名");
break;
case 280:
finalValue = new CellData("打赏帖子");
break;
case 281:
finalValue = new CellData("打赏回帖");
break;
case 282:
finalValue = new CellData("打赏作品");
break;
case 300:
finalValue = new CellData("购买第三方产品");
break;
default:
finalValue = new CellData("其他");
break;
}
return finalValue;
}
}
package com.yizhi.mall.application.excel.export;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.yizhi.application.orm.id.IdGenerator;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.core.application.context.TaskContext;
import com.yizhi.core.application.file.task.AbstractDefaultTask;
import com.yizhi.core.application.file.util.OssUpload;
import com.yizhi.mall.application.excel.model.TokenLogExcelModel;
import com.yizhi.mall.application.pojo.qo.ManageTokenLogQO;
import com.yizhi.mall.application.pojo.vo.ManageTokenLogVO;
import com.yizhi.mall.application.service.ITokenLogService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.*;
@Api(tags = "消费记录导出接口")
@Slf4j
@Component
public class TokenLogExport extends AbstractDefaultTask<String, Map<String,Object>> {
@Autowired
private IdGenerator idGenerator;
@Autowired
private ITokenLogService tokenLogService;
/**
* 获取自定义表头
*
* @return
*/
private List<List<String>> head() {
List<String> secondHead = Arrays.asList("用户名", "姓名",
"时间", "订单号", "类型", "备注", "消耗/充值数量");
List<List<String>> list = new ArrayList<List<String>>();
for (int i = 0; i < 7; i++) {
List<String> head = new ArrayList<String>();
head.add("兑换记录" + DateUtil.format(new Date(), "yyyyMMddHHmmss"));
head.add(secondHead.get(i));
list.add(head);
}
return list;
}
/**
* 组装数据
*
* @return
*/
private List<TokenLogExcelModel> getData(RequestContext context, ManageTokenLogQO qo) {
List<TokenLogExcelModel> records = new ArrayList<>();
try {
qo.setPageSize(Integer.MAX_VALUE);
List<ManageTokenLogVO> dataList = tokenLogService.getLogListByCondition(context, qo).getRecords();
TokenLogExcelModel data = null;
if (CollectionUtils.isNotEmpty(dataList)) {
for (ManageTokenLogVO tokenLogVO : dataList) {
data = new TokenLogExcelModel();
BeanUtils.copyProperties(tokenLogVO, data);
records.add(data);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return records;
}
@Override
protected String execute(Map<String,Object> map) {
Date now = new Date();
String formatDate = DateUtil.format(now, "yyyyMMddHHmmss");
String serialNo = "TOKEN-LOG-EXPORT-" + formatDate;
String taskName = "兑换记录明细-" + formatDate;
RequestContext context =(RequestContext) map.get("context");
Long accountId = context.getAccountId();
Long siteId = context.getSiteId();
Long companyId = context.getCompanyId();
TaskContext taskContext = new TaskContext(idGenerator.generate(), serialNo, taskName, accountId
, now, siteId, companyId);
//记录任务日志
working(taskContext);
ManageTokenLogQO qo = (ManageTokenLogQO)map.get("qo");
List<TokenLogExcelModel> excelModelList = getData(context, qo);
if (CollectionUtils.isEmpty(excelModelList)) {
log.info("没有当前需要导出的消费记录");
fail(taskContext,"没有当前需要导出的消费记录!");
return "fail";
}
log.info("开始组装消费记录");
try {
String fileName = "兑换记录" + formatDate + ".xlsx";
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//设置表头左对齐
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//设置内容左对齐
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
String requestPath = "/manage/upload";//OssUpload.SAVE_PATH;
File file = new File(requestPath);
if (!file.exists()) {
file.mkdirs();
}
String path = requestPath + File.separator + fileName;
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
EasyExcel.write(path, TokenLogExcelModel.class).registerWriteHandler(horizontalCellStyleStrategy).
head(head()).sheet("消费记录导出").doWrite(excelModelList);
String upLoadUrl = OssUpload.upload(path, fileName);
log.info("导出成功:upLoadUrl:"+upLoadUrl);
success(taskContext, "成功", upLoadUrl);
} catch (Exception e) {
fail(taskContext, "写入过程出现异常;");
log.error("写入阿里云出错,出错信息:{}", e);
}
return taskName;
}
}
package com.yizhi.mall.application.excel.model;
import com.alibaba.excel.annotation.ExcelProperty;
import com.yizhi.mall.application.excel.convert.CustomTokenLogTypeConverter;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 直播活动表
* </p>
*
* @author taoge
* @since 2020-11-17
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "TokenLog对象", description = "消费记录导出")
public class TokenLogExcelModel implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty(index = 0, value = "姓名")
private String name;
@ExcelProperty(index = 1, value = "用户名")
private String fullName;
@ExcelProperty(index = 2, value = "时间")
private Date createdAt;
@ExcelProperty(index = 3, value = "订单号")
private String orderId;
@ExcelProperty(index = 4, value = "类型", converter = CustomTokenLogTypeConverter.class)
private Integer type;
@ExcelProperty(index = 5, value = "备注")
private String remark;
@ExcelProperty(index = 6, value = "消耗/充值数量")
private Integer count;
}
package com.yizhi.mall.application.exception
import com.yizhi.core.application.exception.BizException
import com.yizhi.mall.application.exception.RequestParameter.ERROR_CODE
import com.yizhi.mall.application.exception.RequestParameter.EXCEPTION
import com.yizhi.util.application.domain.BizResponse
import com.yizhi.util.application.enums.i18n.Constants
import org.slf4j.LoggerFactory
import org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException
import org.springframework.validation.BeanPropertyBindingResult
import org.springframework.web.HttpRequestMethodNotSupportedException
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseBody
import javax.servlet.http.HttpServletRequest
/**
* @Author: Lvjh
* @Date 2020/02/19 18:32
*/
@ControllerAdvice
open class ApiResponseHandler {
private val logger = LoggerFactory.getLogger(javaClass)
@ExceptionHandler(HttpRequestMethodNotSupportedException::class)
@ResponseBody
fun requestMethodNotSupportException(e: HttpRequestMethodNotSupportedException, request: HttpServletRequest): BizResponse<Any> {
logger.error(" requestMethodNotSupportException uri[${request.requestURI}]", e)
return BizResponse.fail(Constants.MSG_BIZ_FAIL.code.toString(), Constants.MSG_BIZ_FAIL.name)
}
@ExceptionHandler(MethodArgumentNotValidException::class)
@ResponseBody
fun parameterInvalidException(e: MethodArgumentNotValidException, request: HttpServletRequest): BizResponse<Any> {
logger.error(" parameterInvalidException uri[${request.requestURI}]", e)
var msg = Constants.MSG_BIZ_FAIL.name
try {
val propertyBindResult: BeanPropertyBindingResult = e.bindingResult as BeanPropertyBindingResult
if (propertyBindResult.hasErrors()) {
val sbf = StringBuffer()
propertyBindResult.allErrors.forEach {
sbf.append(it.defaultMessage).append(";")
}
msg = sbf.toString()
}
return BizResponse.fail(Constants.MSG_BIZ_FAIL.code.toString(), msg)
} catch (e: Exception) {
logger.error(" parameterInvalidException url[${request.requestURL}]", e)
e.printStackTrace()
return BizResponse.fail(Constants.MSG_BIZ_FAIL.code.toString(), Constants.MSG_BIZ_FAIL.name)
}
}
@ExceptionHandler(Exception::class)
@ResponseBody
fun sysException(e: Exception, request: HttpServletRequest): BizResponse<Any> {
request.setAttribute(EXCEPTION, getStackTrace(e))
request.setAttribute(ERROR_CODE, Constants.MSG_BIZ_FAIL.code.toString())
val clientIp = request.getHeader("X-Real-IP")
logger.error("Exception requestUrl[${request.requestURI},clientIp:$clientIp] ", e)
e.printStackTrace()
return BizResponse.fail(Constants.MSG_BIZ_FAIL.code.toString(), Constants.MSG_BIZ_FAIL.name)
}
@ExceptionHandler(BizException::class)
@ResponseBody
fun bizException(e: BizException, request: HttpServletRequest): BizResponse<Any> {
request.setAttribute(ERROR_CODE, e.code)
request.setAttribute(EXCEPTION, getStackTrace(e))
logger.error("BizException requestUrl[${request.requestURL}] ${e.code}:${e.msg}")
return BizResponse.fail(e.code, e.msg)
}
private fun getStackTrace(e: Exception): String {
val stringBuffer = StringBuffer(e.toString() + "\n")
val messages = e.stackTrace
messages.forEach {
stringBuffer.append("\t $it \n")
}
return stringBuffer.toString()
}
}
\ No newline at end of file
package com.yizhi.mall.application.exception
/**
* @Author: Lvjh
* @Date 2020/02/19 18:32
*/
object RequestParameter {
const val CUSTOMER_MOBILE = "customer_mobile"
const val CUSTOMER_ID = "customer_id"
const val REQUEST_UUID = "request_uuid"
const val VERSION = "version"
const val PLATFORM = "channel_code"
const val DEVICE_UUID = "device_uuid"
const val TIMESTAMP = "timestamp"
const val EXCEPTION = "exception"
const val ERROR_CODE = "error_code"
const val TIME_ZONE = "user_timezone"
}
\ No newline at end of file
package com.yizhi.mall.application.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yizhi.core.application.cache.RedisCache;
import com.yizhi.system.application.feign.AuthFeignClient;
import com.yizhi.system.application.vo.practice.OrgAccountVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @ClassName: AccountManagerHandler
* @author: zjl
* @date: 2021/1/15 14:09
*/
@Component
public class AccountManagerHandler {
@Autowired
private AuthFeignClient authFeignClient;
@Autowired
private RedisCache redisCache;
private String REDIS_KEY_MANAGE = "MALL_ADMIN_MANAGE_ORG_OR_USER";
// 缓存两小时
private Long duration = 2 * 3600L;
private Logger logger = LoggerFactory.getLogger(AccountManagerHandler.class);
public OrgAccountVo getManageOrgAndUser(Long adminId, Long siteId) {
String key = REDIS_KEY_MANAGE + adminId;
Object cache = redisCache.get(key);
if (cache != null) {
logger.info("查询用户管辖区 缓存命中 :{}", adminId);
return JSON.parseObject(cache.toString(), OrgAccountVo.class);
} else {
logger.info("查询用户管辖区 未命中缓存 :{}", adminId);
OrgAccountVo vo = authFeignClient.getOrgAndUserOfAdmin(adminId, siteId);
redisCache.set(key, JSON.toJSONString(vo), duration);
return JSON.parseObject(JSONObject.toJSONString(vo), OrgAccountVo.class);
}
}
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.AccountExchangeLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
/**
* <p>
* Mapper 接口
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
public interface AccountExchangeLogRepository extends JpaRepository<AccountExchangeLog,Long>, QuerydslPredicateExecutor<AccountExchangeLog>{
/**
* 获取用户兑换记录数
* @param accountId
* @param siteId
* @return
*/
Integer countAccountExchangeLogsByAccountIdAndSiteId(Long accountId, Long siteId);
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.AccountExchangeSum;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.stereotype.Repository;
/**
* <p>
* Mapper 接口
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
public interface AccountExchangeSumRepository extends JpaRepository<AccountExchangeSum,Long>, QuerydslPredicateExecutor<AccountExchangeSum>{
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.AccountToken;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.stereotype.Repository;
/**
* <p>
* Mapper 接口
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
public interface AccountTokenRepository extends JpaRepository<AccountToken,Long>, QuerydslPredicateExecutor<AccountToken>{
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.TokenExchangeRule;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
/**
* @ClassName: TokenExchangeRuleRepository
* @author: zjl
* @date: 2021/1/11 15:46
*/
public interface TokenExchangeRuleRepository extends JpaRepository<TokenExchangeRule, Long>, QuerydslPredicateExecutor<TokenExchangeRule> {
TokenExchangeRule findByCompanyIdAndSiteId(Long companyId, Long siteId);
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.TokenLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
/**
* <p>
* Mapper 接口
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
public interface TokenLogRepository extends JpaRepository<TokenLog,Long>, QuerydslPredicateExecutor<TokenLog>{
Integer countAccountExchangeLogsByAccountIdAndSiteIdAndChangeType(Long accountId, Long siteId, Integer changeType);
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.TokenSwitch;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
/**
* @ClassName: TokenSwitchRepository
* @author: zjl
* @date: 2021/1/15 9:56
*/
public interface TokenSwitchRepository extends JpaRepository<TokenSwitch, Long>, QuerydslPredicateExecutor<TokenSwitch> {
TokenSwitch findByCompanyIdAndSiteIdAndType(Long companyId, Long siteId, Integer type);
}
package com.yizhi.mall.application.repository;
import com.yizhi.mall.application.domain.TokenExchangeRuleLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
/**
* @ClassName: TokenexchangeruleLogRepository
* @author: zjl
* @date: 2021/1/26 9:29
*/
public interface TokenexchangeruleLogRepository extends JpaRepository<TokenExchangeRuleLog, Long>, QuerydslPredicateExecutor<TokenExchangeRuleLog> {
}
package com.yizhi.mall.application.service
import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import javax.annotation.PostConstruct
import javax.persistence.EntityManager
/**
* @Date 2020/10/22 3:21 下午
* @Author lvjianhui
*/
@Service
open class BaseService {
@Autowired
lateinit var entityManager: EntityManager;
lateinit var jpaqueryFactory:JPAQueryFactory;
@PostConstruct
fun initFactory() {
jpaqueryFactory = JPAQueryFactory(entityManager)
}
}
\ No newline at end of file
package com.yizhi.mall.application.service
import java.util.*
/**
*
*
* 服务类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
interface IAccountExchangeLogService {
fun getPointExchangeTokenTotalByDate(startAt:Date?,endAt:Date?):Int
}
\ No newline at end of file
package com.yizhi.mall.application.service
import com.yizhi.mall.application.domain.AccountExchangeSum
/**
*
*
* 服务类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
interface IAccountExchangeSumService {
fun getCostPointTotal():Int
fun getSumByType(type:Int): AccountExchangeSum?
}
\ No newline at end of file
package com.yizhi.mall.application.service;
import com.yizhi.mall.application.domain.AccountToken;
/**
* <p>
* 服务类
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
public interface IAccountTokenService {
public Integer getTokenCountById(Long companyId,Long siteId,Long accountId);
public AccountToken getTokenAccount();
}
package com.yizhi.mall.application.service;
import com.yizhi.mall.application.domain.TokenExchangeRule;
import com.yizhi.mall.application.pojo.qo.TokenExchangeRuleQO;
import com.yizhi.mall.application.pojo.vo.TokenExchangeRuleVO;
/**
* @ClassName: ITokenExchangeRuleService
* @author: zjl
* @date: 2021/1/11 15:32
*/
public interface ITokenExchangeRuleService {
/**
* 获取规则
*
* @return
*/
TokenExchangeRule getTokenExchangeRule();
/**
* 新增/修改规则
*
* @param qo
* @return
*/
TokenExchangeRuleVO saveOrUpdateTokenExchangeRule(TokenExchangeRuleQO qo);
}
package com.yizhi.mall.application.service
import com.yizhi.core.application.context.RequestContext
import com.yizhi.mall.application.domain.TokenLog
import com.yizhi.mall.application.pojo.qo.ManageTokenLogQO
import com.yizhi.mall.application.pojo.vo.ManageTokenLogVO
import com.yizhi.mall.application.pojo.vo.StudentTokenLogVO
import com.yizhi.mall.application.pojo.vo.TokenLogMonthTotalVO
import com.yizhi.util.application.page.PageInfo
import org.springframework.data.domain.Page
import java.util.*
/**
*
*
* 服务类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
interface ITokenLogService {
fun getLogByAccountIdAndType(companyId: Long?, siteId: Long?, accountId: Long?, type: Int?, pageIndex: Int?, pageSize: Int?, startAt: Date?, endAt: Date?): Page<TokenLog>
fun getTokenTotal(startAt: Date, endAt: Date,type: Int?): TokenLogMonthTotalVO
fun getLastLog(type: Int?, companyId: Long?, siteId: Long?, accountId: Long?): TokenLog?
fun getOrderByOrderId(accountId: Long, companyId: Long, siteId: Long, orderId: String): TokenLog
fun getLogListByAccountIdAndType(companyId: Long?, siteId: Long?, accountId: Long?, type: Int?): List<TokenLog>?
fun getLogListByCondition(context: RequestContext?, qo: ManageTokenLogQO?): PageInfo<ManageTokenLogVO>?
fun getLogPageByUserId(pageNo: Int?, pageSize: Int?): PageInfo<StudentTokenLogVO>?
fun getLogByRelationIdAndType(relationId: Long?, logType: Int?): List<TokenLog>?
fun getEnrollCount(relationId: Long, logType: Int):Long
}
\ No newline at end of file
package com.yizhi.mall.application.service
import com.yizhi.mall.application.domain.TokenSwitch
/**
*
*
* 服务类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
interface ITokenSwitchService {
fun getSwitchList( companyId: Long, siteId: Long): List<TokenSwitch>?
fun getSwitchByType(type: Int?, companyId: Long, siteId: Long): List<TokenSwitch>?
}
package com.yizhi.mall.application.service.impl
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.mall.application.TokenLogType
import com.yizhi.mall.application.domain.QAccountExchangeLog
import com.yizhi.mall.application.domain.TokenExchangeRule
import com.yizhi.mall.application.service.BaseService
import com.yizhi.mall.application.service.IAccountExchangeLogService
import org.springframework.amqp.core.ExchangeTypes
import org.springframework.stereotype.Service
import java.util.*
/**
*
*
* 服务实现类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
@Service
class AccountExchangeLogServiceImpl : BaseService(), IAccountExchangeLogService {
override fun getPointExchangeTokenTotalByDate(startAt: Date?, endAt: Date?): Int {
val log = QAccountExchangeLog.accountExchangeLog
val rc = ContextHolder.get()
var condition = log.companyId.eq(rc.companyId)
.and(log.siteId.eq(rc.siteId))
.and(log.accountId.eq(rc.accountId))
.and(log.type.eq(TokenLogType.POINT_EXCHANGE.code))
if (startAt!= null && endAt != null) {
condition = condition.and(log.createdAt.goe(startAt))
.and(log.createdAt.lt(endAt))
}
return jpaqueryFactory.select(log.tokenCount.sum())
.from(log)
.where(condition)
.fetchOne() ?: 0
}
}
\ No newline at end of file
package com.yizhi.mall.application.service.impl
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.mall.application.TokenLogType
import com.yizhi.mall.application.domain.AccountExchangeSum
import com.yizhi.mall.application.domain.QAccountExchangeSum
import com.yizhi.mall.application.service.BaseService
import com.yizhi.mall.application.service.IAccountExchangeSumService
import org.springframework.stereotype.Service
/**
*
*
* 服务实现类
*
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
@Service
class AccountExchangeSumServiceImpl : BaseService(), IAccountExchangeSumService {
override fun getCostPointTotal():Int {
val rc = ContextHolder.get()
val exchangeSum = QAccountExchangeSum.accountExchangeSum
val condition = exchangeSum.companyId.eq(rc.companyId)
.and(exchangeSum.siteId.eq(rc.siteId))
.and(exchangeSum.accountId.eq(rc.accountId))
.and(exchangeSum.type.eq(TokenLogType.POINT_EXCHANGE.code))
val sum= jpaqueryFactory.select(exchangeSum)
.from(exchangeSum)
.where(condition)
.limit(1)
.fetchOne() ?: return 0
return sum.total ?: 0
}
override fun getSumByType(type: Int): AccountExchangeSum? {
val rc = ContextHolder.get()
val exchangeSum = QAccountExchangeSum.accountExchangeSum
val condition = exchangeSum.companyId.eq(rc.companyId)
.and(exchangeSum.siteId.eq(rc.siteId))
.and(exchangeSum.accountId.eq(rc.accountId))
.and(exchangeSum.type.eq(type))
return jpaqueryFactory.select(exchangeSum)
.from(exchangeSum)
.where(condition)
.limit(1)
.fetchOne()
}
}
\ No newline at end of file
package com.yizhi.mall.application.service.impl;
import com.querydsl.core.types.Predicate;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.yizhi.core.application.context.ContextHolder;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.mall.application.domain.AccountToken;
import com.yizhi.mall.application.domain.QAccountToken;
import com.yizhi.mall.application.service.IAccountTokenService;
import org.springframework.stereotype.Service;
import com.yizhi.mall.application.service.BaseService;
/**
* <p>
* 服务实现类
* </p>
*
* @author MybatisCodeGenerator123
* @since 2021-01-07
*/
@Service
public class AccountTokenServiceImpl extends BaseService implements IAccountTokenService {
@Override
public Integer getTokenCountById(Long companyId, Long siteId, Long accountId) {
QAccountToken accountToken = QAccountToken.accountToken;
Predicate condition = accountToken.accountId.eq(accountId).and(accountToken.companyId.eq(companyId)).and(accountToken.siteId.eq(siteId));
AccountToken at = jpaqueryFactory.select(accountToken).from(accountToken).where(condition).fetchOne();
if (at == null) return 0;
if (at.getAmount() == null) return 0;
return at.getAmount();
}
@Override
public AccountToken getTokenAccount() {
RequestContext rc = ContextHolder.get();
QAccountToken accountToken = QAccountToken.accountToken;
Predicate condition = accountToken.accountId.eq(rc.getAccountId())
.and(accountToken.companyId.eq(rc.getCompanyId()))
.and(accountToken.siteId.eq(rc.getSiteId()));
return jpaqueryFactory.select(accountToken).from(accountToken).where(condition).limit(1).fetchOne();
}
}
package com.yizhi.mall.application.service.impl;
import com.yizhi.application.orm.id.IdGenerator;
import com.yizhi.core.application.context.ContextHolder;
import com.yizhi.core.application.context.RequestContext;
import com.yizhi.mall.application.domain.TokenExchangeRule;
import com.yizhi.mall.application.domain.TokenExchangeRuleLog;
import com.yizhi.mall.application.pojo.qo.TokenExchangeRuleQO;
import com.yizhi.mall.application.pojo.vo.TokenExchangeRuleVO;
import com.yizhi.mall.application.repository.TokenExchangeRuleRepository;
import com.yizhi.mall.application.repository.TokenexchangeruleLogRepository;
import com.yizhi.mall.application.service.BaseService;
import com.yizhi.mall.application.service.ITokenExchangeRuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
/**
* @ClassName: ITokenExchangeRuleServiceImpl
* @author: zjl
* @date: 2021/1/11 15:33
*/
@Service
public class ITokenExchangeRuleServiceImpl extends BaseService implements ITokenExchangeRuleService {
@Autowired
private TokenExchangeRuleRepository repository;
@Autowired
private TokenexchangeruleLogRepository logRepository;
@Autowired
private IdGenerator idGenerator;
/**
* 获取站点积分兑换金币规则
* @return
*/
@Override
public TokenExchangeRule getTokenExchangeRule() {
TokenExchangeRuleVO vo = new TokenExchangeRuleVO();
RequestContext context = ContextHolder.get();
Long companyId = context.getCompanyId();
Long siteId = context.getSiteId();
TokenExchangeRule rule = repository.findByCompanyIdAndSiteId(companyId, siteId);
if (Objects.isNull(rule)) {
return null;
}
return rule;
}
/**
* 新增/修改站点积分兑换金币规则
* @return
* @param qo
*/
@Override
@Transactional
public TokenExchangeRuleVO saveOrUpdateTokenExchangeRule(TokenExchangeRuleQO qo) {
TokenExchangeRuleVO vo = new TokenExchangeRuleVO();
RequestContext context = ContextHolder.get();
Long companyId = context.getCompanyId();
Long siteId = context.getSiteId();
TokenExchangeRule get = repository.findByCompanyIdAndSiteId(companyId, siteId);
if (Objects.isNull(get)) {
//站点无兑换规则 新增
get = new TokenExchangeRule();
get.setId(idGenerator.generate());
}
get.setExchangeCondition(qo.getExchangeCondition());
if (qo.getExchangeCondition()) {//条件限制
get.setConditionRuleTokenCount(qo.getConditionRuleTokenCount());
get.setConditionRuleType(qo.getConditionRuleType().toUpperCase());
}
get.setRate(qo.getRate());
get.setTokenName(qo.getTokenName());
TokenExchangeRule save = repository.save(get);
synchronousToLog(save);
return vo;
}
/**
* 同步记录到log表
* @param rule
* @return
*/
public void synchronousToLog(TokenExchangeRule rule) {
//新增规则后 再新增记录到兑换规则log表
TokenExchangeRuleLog log = new TokenExchangeRuleLog();
log.setId(idGenerator.generate());
log.setRuleId(rule.getId());
log.setTokenName(rule.getTokenName());
log.setRate(rule.getRate());
log.setExchangeCondition(rule.getExchangeCondition());
if (rule.getExchangeCondition()) {
log.setConditionRuleTokenCount(rule.getConditionRuleTokenCount());
log.setConditionRuleType(rule.getConditionRuleType().toUpperCase());
}
log = logRepository.save(log);
}
}
package com.yizhi.mall.application.service.impl
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.mall.application.domain.QTokenSwitch
import com.yizhi.mall.application.domain.TokenSwitch
import com.yizhi.mall.application.service.BaseService
import com.yizhi.mall.application.service.ITokenSwitchService
import org.springframework.stereotype.Service
/**
* @Date 2021/1/14 2:59 下午
* @Author lvjianhui
**/
@Service
class TokenSwitchServiceImpl : BaseService(), ITokenSwitchService {
override fun getSwitchList(companyId: Long, siteId: Long): List<TokenSwitch>? {
val tokenSwitch = QTokenSwitch.tokenSwitch
var condition = tokenSwitch.companyId.eq(companyId).and(tokenSwitch.siteId.eq(siteId))
return jpaqueryFactory
.select(tokenSwitch)
.from(tokenSwitch)
.where(condition)
.fetch()
}
override fun getSwitchByType(type: Int?, companyId: Long, siteId: Long): List<TokenSwitch>? {
val tokenSwitch = QTokenSwitch.tokenSwitch
var condition = tokenSwitch.companyId.eq(companyId).and(tokenSwitch.siteId.eq(siteId))
if (type != null) {
condition = condition.and(tokenSwitch.type.eq(type))
}
return jpaqueryFactory
.select(tokenSwitch)
.from(tokenSwitch)
.where(condition)
.fetch()
}
}
\ No newline at end of file
//package com.yizhi.mall.application.utils
//
//import cn.hutool.core.map.MapUtil
//import com.yizhi.core.application.context.RequestContext
//import org.apache.commons.beanutils.BeanUtils
//import org.springframework.web.bind.annotation.GetMapping
//import org.springframework.web.bind.annotation.RequestMapping
//import java.lang.reflect.Method
//import java.lang.reflect.Proxy
//
//
///**
// * @Date 2021/1/19 9:54 上午
// * @Author lvjianhui
// **/
//fun Any.setFeignHeadInvoke(
// clazz: Any?,
// method: Method,
// params: Array<*>,
// requestContext: RequestContext?) {
// try {
// var annotation:Any = method.getAnnotation(RequestMapping::class.java)
// val annotationGet = method.getAnnotation(GetMapping::class.java)
// val annotationPost = method.getAnnotation(GetMapping::class.java)
// if (annotation == null && null != annotationGet) {
// annotation = annotationGet
// }
// if (annotation == null && null != annotationPost) {
// annotation = annotationPost
// }
// val invocationHandler = Proxy.getInvocationHandler(annotation)
// val declaredField = invocationHandler.javaClass.getDeclaredField("memberValues")
// declaredField.isAccessible = true
// val memberValues = declaredField[invocationHandler] as MutableMap<String, Any>
// val map = BeanUtils.describe(requestContext)
// val headers = MapUtil.join(map, ",", "=", true)
// val list = headers.split(",")
// memberValues["headers"] = list
// method.invoke(clazz, params[0])
// } catch (e: Exception) {
// e.printStackTrace()
// throw e
// }
//}
\ No newline at end of file
package com.yizhi.mall.application.utils
import cn.hutool.core.date.DateUtil
import com.yizhi.mall.application.ExchangeConditionType
import java.util.*
object MallDateUtils {
/**
* @param conditionType 时间段枚举
* @param date 时间点
* @return 返回指定时间 默认的时间范围的开始 结束时间
*/
fun getSAtAndEAtByConditionCode(conditionType: ExchangeConditionType, date: Date): Pair<Date, Date> {
var calendar = Calendar.getInstance()
calendar.time = date
calendar.set(Calendar.HOUR_OF_DAY,0)
calendar.set(Calendar.MINUTE,0)
calendar.set(Calendar.SECOND,0)
var startAt:Date ? = null
var endAt :Date ? = null
when(conditionType.code) {
// 年
ExchangeConditionType.YEAR.code -> {
calendar.set(Calendar.MONTH,Calendar.JANUARY)
calendar.set(Calendar.DAY_OF_MONTH,1)
startAt = calendar.time
calendar.add(Calendar.YEAR ,1)
endAt = calendar.time
}
// 半年
ExchangeConditionType.HALFYEAR.code -> {
calendar.set(Calendar.MONTH,Calendar.JULY)
calendar.set(Calendar.DAY_OF_MONTH,1)
// 下半年
if (date.time >= calendar.time.time) {
startAt = calendar.time
calendar.add(Calendar.MONTH ,6)
endAt = calendar.time
}else {
endAt = calendar.time
calendar.set(Calendar.MONTH,Calendar.JANUARY)
startAt = calendar.time
}
}
// 季度
ExchangeConditionType.QUARTER.code -> {
val quarter = DateUtil.quarter(calendar.time) - 1
calendar.set(Calendar.MONTH,Calendar.JANUARY)
calendar.set(Calendar.DAY_OF_MONTH,1)
calendar.add(Calendar.MONTH,quarter*3)
startAt = calendar.time
calendar.add(Calendar.MONTH ,3)
endAt = calendar.time
}
// 月
ExchangeConditionType.MONTH.code -> {
calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH))
calendar.set(Calendar.DAY_OF_MONTH,1)
startAt = calendar.time
calendar.add(Calendar.MONTH ,1)
endAt = calendar.time
}
// 周
ExchangeConditionType.WEEK.code -> {
calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY)
calendar.set(Calendar.WEEK_OF_YEAR,calendar.get(Calendar.WEEK_OF_YEAR))
startAt = calendar.time
calendar.add(Calendar.WEEK_OF_YEAR ,1)
endAt = calendar.time
}
// 天
ExchangeConditionType.DAY.code -> {
startAt = calendar.time
calendar.add(Calendar.DAY_OF_YEAR ,1)
endAt = calendar.time
}
}
return Pair(startAt!!,endAt!!);
}
}
\ No newline at end of file
package com.yizhi.mall.application.utils
import cn.hutool.core.date.DateUtil
import cn.hutool.core.util.RandomUtil
import com.yizhi.core.application.context.ContextHolder
import java.util.*
/**
* @Date 2021/1/15 3:09 下午
* @Author lvjianhui
**/
object MallOrderIdUtils {
fun generateorderIdByUserAndLog(tokenLog: Long): String {
val accountId = ContextHolder.get().accountId
val currentDate = Date()
val sn = StringBuffer().append(currentDate.time).append(tokenLog).append(accountId)
val randomStr = RandomUtil.randomString(sn.toString(), 8)
val currentDateStr = DateUtil.format(currentDate, "yyMMddHHmmssSSS")
return currentDateStr + randomStr
}
}
\ No newline at end of file
//package com.yizhi.mall.application.utils
//
//import org.redisson.Redisson
//import org.redisson.api.RedissonClient
//import org.redisson.config.Config
//import org.springframework.beans.factory.annotation.Value
//import org.springframework.stereotype.Component
//import javax.annotation.PostConstruct
//
//@Component
//class RedissonUtils {
//
// companion object {
// var address = ""
// var password = ""
// var redissonClient : RedissonClient? = null
// }
//
// @PostConstruct
// fun setAddress(@Value("\${spring.redis.host}") address: String,
// @Value("\${spring.redis.port}") port: Int) {
// RedissonUtils.address = "$address:$port"
// }
//
// @PostConstruct
// fun setPasswords(@Value("\${spring.redis.password}") password: String) {
// RedissonUtils.password = password
// }
//
//
// @PostConstruct
// fun get() {
// val config = Config()
// config.useSingleServer()
// .setAddress(address).password = password
// redissonClient = Redisson.create(config)
// }
//
//
//}
\ No newline at end of file
package com.yizhi.mall.application.xservice
import com.yizhi.mall.application.TokenLogType
import com.yizhi.mall.application.config.constant.TokenLogRelationDto
import com.yizhi.mall.application.domain.TokenExchangeRule
/**
* @Date 2021/1/18 1:32 下午
* @Author lvjianhui
**/
interface AccountTokenXService {
/**
* 全局唯一金币变动入口
*/
fun updateTokenAccount(changeTokenAbs: Int, logType: TokenLogType, rule: TokenExchangeRule?, relationMsg: TokenLogRelationDto?)
}
\ No newline at end of file
package com.yizhi.mall.application.xservice;
import com.yizhi.mall.application.pojo.vo.QualityContentVO;
import com.yizhi.training.application.param.PaidTrainingProjectQO;
import com.yizhi.training.application.vo.api.PaidTrainingProjectVO;
import com.yizhi.util.application.page.PageInfo;
/**
* @ClassName: QualityContentXService
* @author: zjl
* @date: 2021/1/12 9:51
*/
public interface QualityContentXService {
/**
* 获取精品内容个人信息
* @return
*/
QualityContentVO getQualityContent();
/**
* 获取付费项目并排序筛选
* @param qo
* @return
*/
PageInfo<PaidTrainingProjectVO> getPaidTrainingProject(PaidTrainingProjectQO qo);
}
package com.yizhi.mall.application.xservice
import com.yizhi.mall.application.pojo.vo.TokenConfigVO
import com.yizhi.mall.application.pojo.vo.TokenSwitchVO
/**
* @Date 2021/1/6 4:51 下午
* @Author lvjianhui
**/
interface TokenConfigXService {
fun getRuleBySiteId(): TokenConfigVO?
fun getSwitch(type: Int?): List<TokenSwitchVO>?
}
\ No newline at end of file
package com.yizhi.mall.application.xservice
import com.yizhi.core.application.context.RequestContext
import com.yizhi.mall.application.pojo.vo.OrderDetailVO
import com.yizhi.mall.application.pojo.vo.TokenLogMonthTotalVO
import com.yizhi.mall.application.pojo.vo.TokenLogVO
import com.yizhi.util.application.page.PageInfo
import java.util.*
/**
* @Date 2021/1/7 10:54 上午
* @Author lvjianhui
**/
interface TokenLogXService {
fun getLogByType(startAt: Date, endAt: Date, type: Int?, pageIndex: Int, pageSize: Int): PageInfo<TokenLogVO>
fun getTokenTotal(startAt:Long?, type: Int?, pageIndex: Int, pageSize: Int): TokenLogMonthTotalVO?
fun getOrderDetail(accountId: Long, companyId: Long, siteId: Long, orderId: String): OrderDetailVO
}
\ No newline at end of file
package com.yizhi.mall.application.xservice;
import com.yizhi.mall.application.domain.TokenSwitch;
/**
* @ClassName: TokenSwitchXService
* @author: zjl
* @date: 2021/1/15 9:53
*/
public interface TokenSwitchXService {
/**
* 新增/修改开关
* @param type
* @param tokenSwitchBol
* @return
*/
TokenSwitch saveOrUpdateTokenSwitch(Integer type, Boolean tokenSwitchBol);
}
package com.yizhi.mall.application.xservice
import com.yizhi.mall.application.pojo.qo.ApplyProjectPO
import com.yizhi.mall.application.pojo.qo.TokenExchangePO
/**
* @Date 2021/1/13 2:34 下午
* @Author lvjianhui
**/
interface TokenXService {
/**
* 查看可用积分数量
*/
fun getPointCount(): Int
/**
* 积分兑换金币
*/
fun pointExchangeToken(po: TokenExchangePO)
/**
* 项目报名
*/
fun costToProject(po: ApplyProjectPO)
}
\ No newline at end of file
package com.yizhi.mall.application.xservice
import com.yizhi.mall.application.TokenLogType
import com.yizhi.mall.application.config.constant.TokenLogRelationDto
import com.yizhi.mall.application.domain.TokenExchangeRule
/**
* @Date 2021/1/18 3:05 下午
* @Author lvjianhui
**/
interface TrXService {
fun trApplyCostToken(changeToken: Int, logType: TokenLogType, rule: TokenExchangeRule?, relationMsg: TokenLogRelationDto)
}
\ No newline at end of file
package com.yizhi.mall.application.xservice.impl
import com.yizhi.application.orm.id.IdGenerator
import com.yizhi.core.application.cache.RedisCache
import com.yizhi.core.application.context.ContextHolder
import com.yizhi.core.application.exception.BizException
import com.yizhi.mall.application.TokenLogType
import com.yizhi.mall.application.config.MallMsgEnum
import com.yizhi.mall.application.config.RedisLock
import com.yizhi.mall.application.config.constant.TokenLogRelationDto
import com.yizhi.mall.application.domain.*
import com.yizhi.mall.application.repository.AccountExchangeLogRepository
import com.yizhi.mall.application.repository.AccountExchangeSumRepository
import com.yizhi.mall.application.repository.AccountTokenRepository
import com.yizhi.mall.application.repository.TokenLogRepository
import com.yizhi.mall.application.service.*
import com.yizhi.mall.application.utils.MallOrderIdUtils
import com.yizhi.mall.application.xservice.AccountTokenXService
import com.yizhi.mall.application.xservice.TokenConfigXService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import javax.transaction.Transactional
/**
* @Date 2021/1/18 1:32 下午
* @Author lvjianhui
**/
@Service
open class AccountTokenXServiceImpl : AccountTokenXService {
@Autowired
lateinit var iAccountExchangeSumService: IAccountExchangeSumService
@Autowired
lateinit var tokenConfigXService: TokenConfigXService
@Autowired
lateinit var accountTokenService: IAccountTokenService
@Autowired
lateinit var accountTokenRepository: AccountTokenRepository
@Autowired
lateinit var tokenLogRepository: TokenLogRepository
@Autowired
lateinit var accountExchangeLogRepository: AccountExchangeLogRepository
@Autowired
lateinit var idGenerator: IdGenerator
@Autowired
lateinit var accountExchangeSunRepository: AccountExchangeSumRepository
@Autowired
lateinit var redisCache: RedisCache
@Transactional
override fun updateTokenAccount(changeTokenAbs: Int, logType: TokenLogType, rule: TokenExchangeRule?, relationMsg: TokenLogRelationDto?) {
val changeToken = changeTokenAbs * logType.addOrsSub
val rc = ContextHolder.get()
val redisAccountKey = RedisLock.ACCOUNT_TOKEN_LOCK.format(rc.accountId)
val timeout = 10L
try {
// 增加分布式锁。如果set完成,没有执行 expire 和 delete方法,则会出现key永不过期的问题
val lock = redisCache.setIfAbsent(redisAccountKey, "1")
redisCache.expire(redisAccountKey, timeout)
if (!lock) {
throw BizException(MallMsgEnum.ACCOUNT_TOKEN_PROCESSING.code, MallMsgEnum.ACCOUNT_TOKEN_PROCESSING.msg)
}
// 增加金币
var accountToken = accountTokenService.tokenAccount
val beforToken = accountToken?.amount ?: 0
if (null == accountToken) {
accountToken = AccountToken()
accountToken.id = idGenerator.generate()
accountToken.amount = changeToken
} else {
accountToken.amount = accountToken.amount + changeToken
}
accountTokenRepository.save(accountToken)
val log = TokenLog()
log.id = idGenerator.generate()
log.changeType = logType.addOrsSub
log.changeCount = changeToken
log.beforeCount = beforToken
log.afterCount = log.changeCount + log.beforeCount
log.type = logType.code
log.relationIconUrl = relationMsg?.relationIconUrl
log.relationName = relationMsg?.relationName
log.relationId = relationMsg?.relationId
log.relationType = logType.code
if (logType.code == TokenLogType.POINT_EXCHANGE.code) {
log.costCount = rule!!.rate.toInt() * changeToken
log.relationName = "-${log.costCount}积分"
}
log.msg = logType.msg
log.orderId = logType.orderPre + MallOrderIdUtils.generateorderIdByUserAndLog(log.id)
tokenLogRepository.save(log)
if (logType.addOrsSub == -1 || null == rule) {
return
}
val type = TokenLogType.POINT_EXCHANGE
var sum = iAccountExchangeSumService.getSumByType(type.code)
if (sum == null) {
sum = AccountExchangeSum()
sum.id = idGenerator.generate()
sum.type = type.code
sum.total = rule.rate.toInt() * changeToken
sum.tokenTotal = changeToken
} else {
sum.total = sum.total + rule.rate.toInt() * changeToken
sum.tokenTotal = sum.tokenTotal + changeToken
}
accountExchangeSunRepository.save(sum)
val exchangeLog = AccountExchangeLog()
exchangeLog.id = idGenerator.generate()
exchangeLog.count = rule.rate.toInt() * changeToken
exchangeLog.exchangeRate = rule.rate
exchangeLog.tokenCount = changeToken
exchangeLog.type = TokenLogType.POINT_EXCHANGE.code
accountExchangeLogRepository.save(exchangeLog)
redisCache.delete(redisAccountKey)
} catch (e: Exception) {
redisCache.delete(redisAccountKey)
} finally {
redisCache.delete(redisAccountKey)
}
}
}
\ No newline at end of file
This diff is collapsed. Click to expand it.
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