记得上下班打卡 | git大法好,push需谨慎

Commit d3d5a035 authored by Tice's avatar Tice

完善merchant

parent 57d69834
<?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>liquidnet-bus-api</artifactId>
<groupId>com.liquidnet</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>liquidnet-service-merchant-api</artifactId>
<dependencies>
<dependency>
<groupId>com.liquidnet</groupId>
<artifactId>liquidnet-service-merchant-do</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
......@@ -20,6 +20,7 @@
<module>liquidnet-service-sweet-api</module>
<module>liquidnet-service-chime-api</module>
<module>liquidnet-service-candy-api</module>
<module>liquidnet-service-merchant-api</module>
</modules>
<dependencies>
<dependency>
......
......@@ -4,11 +4,11 @@ liquidnet:
switch: false
info:
port: 9013
context: /candy
name: liquidnet-service-candy
context: /merchant
name: liquidnet-service-merchant
logfile:
path: /data/logs
name: service-candy
name: service-merchant
config: classpath:logback-spring.xml
file-max-size: 200MB
pattern-file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [ %-5level] %thread [%logger{96}:%line] - %msg%n'
......
......@@ -4,11 +4,11 @@ liquidnet:
switch: false
info:
port: 9013
context: /adam
name: liquidnet-service-adam
context: /merchant
name: liquidnet-service-merchant
logfile:
path: /data/logs
name: service-adam
name: service-merchant
config: classpath:logback-spring.xml
file-max-size: 200MB
level: debug
......@@ -16,14 +16,4 @@ liquidnet:
database-name: test_ln_scene
mongodb:
sslEnabled: false
database: test_ln_scene
url-pay:
pay: ${liquidnet.service.adam.url-pay.pay}
check: ${liquidnet.service.adam.url-pay.check}
callback: ${liquidnet.service.adam.url-pay.callback}
reviewer:
app-login:
mobile: 13724286255
user-info: false
#以下为spring各环境个性配置
database: test_ln_scene
\ No newline at end of file
......@@ -99,5 +99,3 @@ global-auth:
- ${liquidnet.info.context}/webjars/**
- ${liquidnet.info.context}/swagger-resources/**
- ${liquidnet.info.context}/v2/api-docs*
- ${liquidnet.info.context}/candy-coupon/useBack
- ${liquidnet.info.context}/candy-coupon/useBackJxl
\ No newline at end of file
<?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>liquidnet-bus-do</artifactId>
<groupId>com.liquidnet</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>liquidnet-service-merchant-do</artifactId>
</project>
\ No newline at end of file
......@@ -21,6 +21,7 @@
<module>liquidnet-service-dragon-do</module>
<module>liquidnet-service-sweet-do</module>
<module>liquidnet-service-candy-do</module>
<module>liquidnet-service-merchant-do</module>
</modules>
<dependencies>
......
# create database if not exists ln_scene character set utf8mb4 collate utf8mb4_unicode_ci;
# use ln_scene;
# -- >>------------------------------------------------------------------------------------ |20210817会员与券改版
# 券发放管理
drop table if exists candy_mgt_coupon;
create table candy_mgt_coupon
(
mid bigint unsigned auto_increment primary key,
mcoupon_id varchar(64) not null,
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '发放状态[0-未发放|1-已发放|2-无效|3-已取消|9-发放中|10-会员礼包初始模版]',
# bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户]',
event_amt int comment '发放量',
event_type tinyint comment '发放类型[0-保留|1-会员|2-手机号|10-全体用户]',
event_limit text comment '`发放类型`为2-手机号时发放手机号以,分隔',
event_at datetime(3) comment '发放时间(立即-当前时间+3分钟|预约-点选时间)',
operator varchar(64) not null comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment text
) engine InnoDB comment '券发放管理';
create index idx_candy_mgt_coupon_id on candy_mgt_coupon (mcoupon_id);
# 券基础信息
drop table if exists candy_coupon;
create table candy_coupon
(
mid bigint unsigned auto_increment primary key,
coupon_id varchar(64) not null,
state tinyint comment '券状态[0-INIT|1-NORMAL|2-INVALID]',
title varchar(50) not null comment '券标题',
label varchar(50) comment '标注',
notice varchar(200) comment '注意/须知',
exclusive smallint comment '专享标识[0-常规|1-会员礼包]',
busi_type smallint comment '业务类别[0-全场|1-演出|2-商品|3-优先购]',
cou_type smallint comment '券类型[1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]',
bind_type smallint comment '领取方式[0-用户输入兑换|1-发放至用户]',
discount decimal(8, 2) comment '折扣[8折即0.8]',
val_face decimal(8, 2) comment '面值',
val_over decimal(8, 2) comment '满减~满',
val_minus decimal(8, 2) comment '满减~减',
overlay tinyint default 0 comment '叠加限制[0-限制|1-叠加]',
overlay_level tinyint default 0 comment '#同类别券叠加适用',
validity int comment '有效期(单位天)',
redeem_validity int comment '兑换有效期(单位天)',
redeem_start datetime(3) comment '兑换开放时间',
redeem_stop datetime(3) comment '兑换停止时间',
effect_at datetime(3) comment '生效时间',
expire_at datetime(3) comment '过期时间',
operator varchar(64) not null comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment varchar(255)
) engine = InnoDB comment '券基础信息';
create unique index uidx_candy_coupon_id on candy_coupon (coupon_id);
# 券适用规则
drop table if exists candy_coupon_rule;
create table candy_coupon_rule
(
mid bigint unsigned auto_increment primary key,
crule_id varchar(64) not null,
coupon_id varchar(64) not null,
use_scope smallint comment '适用范围[100-全场|90-演出|80-商品]',
busi_name varchar(64) comment '适用名称',
busi_id varchar(64) comment '适用ID',
state tinyint comment '0-INIT,1-NORMAL,2-INVALID',
comment varchar(255)
) engine = InnoDB comment '券适用规则';
create unique index uidx_candy_coupon_rule_id on candy_coupon_rule (crule_id);
# 券码信息
drop table if exists candy_coupon_code;
create table candy_coupon_code
(
mid bigint unsigned auto_increment primary key,
ccode varchar(64) not null comment '券码',
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '状态[0-可用|1-已用|2-无效|3-过期|4-失效|5-退回]',
ucoupon_id varchar(64) comment '~candy_user_coupon.ucoupon_id',
redeem_uid varchar(64) comment '兑换用户UID',
redeem_mobile varchar(64) comment '兑换用户手机号',
redeem_at datetime(3) comment '兑换时间',
redeem_start datetime(3) comment '兑换开放时间',
redeem_stop datetime(3) comment '兑换停止时间',
operator varchar(64) comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment varchar(255)
) engine = InnoDB comment '券码信息';
create unique index uidx_candy_coupon_code_id on candy_coupon_code (ccode, coupon_id);
# 用户券信息
drop table if exists candy_user_coupon;
create table candy_user_coupon
(
mid bigint unsigned auto_increment primary key,
ucoupon_id varchar(64) not null,
mcoupon_id varchar(64) comment '~candy_mgt_coupon.mcoupon_id',
uid varchar(64) not null comment '~adam_user.uid',
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '用户券状态[1-可用|2-无效|3-已过期|5-已使用]',
ccode varchar(64) comment '券码~candy_coupon_code.ccode',
bind_at datetime(3) comment '激活时间',
dued_at datetime(3) comment '到期时间',
used_at datetime(3) comment '使用时间',
used_for varchar(255) comment '用于记录购买的内容',
operator varchar(64) comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment varchar(255)
) engine = InnoDB comment '用户券信息';
create unique index uidx_candy_user_coupon_id on candy_user_coupon (ucoupon_id);
create index idx_candy_ucoupon_uid_state on candy_user_coupon (uid, state);
# 公有券信息
drop table if exists candy_common_coupon;
create table candy_common_coupon
(
mid bigint unsigned auto_increment primary key,
ccoupon_id varchar(64) not null,
mcoupon_id varchar(64) not null comment '~candy_mgt_coupon.mcoupon_id',
coupon_id varchar(64) not null comment '~candy_coupon.coupon_id',
state tinyint comment '公有券状态[1-可用|2-无效|3-已过期]',
ranged tinyint comment '公有券范围(~candy_mgt_coupon.event_type)',
operator varchar(64) not null comment '操作人',
created_at datetime(3) not null,
updated_at datetime(3),
comment varchar(255)
) engine = InnoDB comment '公有券信息';
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
-- >>------------------------------------------------------------------------------------
\ No newline at end of file
-- 使用 --
XADD merchant:stream:rk.coupon.use * 0 0
XGROUP CREATE merchant:stream:rk.coupon.use group.coupon.use 0
-- 回退 --
XADD merchant:stream:rk.coupon.back * 0 0
XGROUP CREATE merchant:stream:rk.coupon.back group.coupon.back 0
-- 领取 --
XADD merchant:stream:rk.coupon.receive * 0 0
XGROUP CREATE merchant:stream:rk.coupon.receive group.coupon.receive 0
-- 票务订单回退 --
XADD merchant:stream:rk.coupon.order.back * 0 0
XGROUP CREATE merchant:stream:rk.coupon.order.back group.coupon.order.back 0
......@@ -14,12 +14,12 @@ import java.util.Arrays;
@Slf4j
@EnableFeignClients
@SpringBootApplication(scanBasePackages = {"com.liquidnet"})
public class ServiceCandyApplication implements CommandLineRunner {
public class ServiceMerchantApplication implements CommandLineRunner {
@Autowired
private Environment environment;
public static void main(String[] args) {
SpringApplication.run(ServiceCandyApplication.class, args);
SpringApplication.run(ServiceMerchantApplication.class, args);
}
@Override
......
package com.liquidnet.service.merchant.config;
import com.liquidnet.common.web.config.WebMvcConfig;
import com.liquidnet.common.web.filter.GlobalAuthorityInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@Configuration
public class CandyWebMvcConfig extends WebMvcConfig {
@Autowired
GlobalAuthorityInterceptor globalAuthorityInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(globalAuthorityInterceptor).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
package com.liquidnet.service.merchant.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 券码信息 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@RestController
@RequestMapping("/merchant-coupon-code")
public class CandyCouponCodeController {
}
package com.liquidnet.service.merchant.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.merchant.param.BackCouponParam;
import com.liquidnet.service.merchant.service.ICandyCouponService;
import com.liquidnet.service.merchant.util.ObjectUtil;
import com.liquidnet.service.merchant.vo.CandyCouponPreVo;
import com.liquidnet.service.merchant.vo.CandyCouponVo;
import com.liquidnet.service.merchant.vo.CandyMyCouponListVo;
import com.liquidnet.service.merchant.vo.CandyUseResultVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* <p>
* 券基础信息 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Api(tags = "券相关接口")
@RestController
@Validated
@RequestMapping("/merchant-coupon")
public class CandyCouponController {
@Autowired
private ICandyCouponService candyCouponService;
//我的券列表
@GetMapping("my")
@ApiOperation("我的券列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "Integer", name = "type", value = "类型 1可用 2过期/已使用 ", required = true),
})
public ResponseDto<CandyMyCouponListVo> myCoupon(@RequestParam("type") @NotNull Integer type, @RequestParam(required = false, name = "page") Integer page) {
CandyMyCouponListVo vo = candyCouponService.myCoupon(type);
// List<CandyCouponVo> list = vo.getMyCoupon();
// List<CandyCouponVo> listVo = ObjectUtil.getCandyCouponVoArrayList();
// if (page == null || page == 0) {
// page = 1;
// }
// int size = 40;
// int initSize = (page - 1) * size;
// int forSize = page * size;
// if (forSize >= list.size()) {
// forSize = list.size();
// }
// for (int i = initSize; i < forSize; i++) {
// listVo.add(list.get(i));
// }
// vo.setMyCoupon(listVo);
return ResponseDto.success(vo);
}
//我的会员权益券统计
@GetMapping("member-pre")
@ApiOperation("会员权益券统计")
public ResponseDto<List<CandyCouponPreVo>> myCouponPre() {
return ResponseDto.success(candyCouponService.memberCouponPre(CurrentUtil.getCurrentUid()));
}
//我的会员权益券列表
@GetMapping("member")
@ApiOperation("会员权益券列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "mCouponId", value = "mCouponId", required = true),
})
public ResponseDto<List<CandyCouponVo>> myCoupon(@RequestParam("mCouponId") @NotNull @NotBlank String mCouponId) {
return ResponseDto.success(candyCouponService.memberCoupon(mCouponId));
}
//要使用券列表 - 演出
@GetMapping("preUse/performance")
@ApiOperation("要使用券列表 - 演出")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "BigDecimal", name = "priceTotal", value = "待支付总金额", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "performanceId", value = "演出id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "timeId", value = "场次id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "ticketId", value = "票id", required = true),
@ApiImplicitParam(type = "form", dataType = "Integer", name = "type", value = "类型 1可用 2过期/已使用 ", required = true),
})
public ResponseDto<CandyMyCouponListVo> preUsePerformanceCoupon(@RequestParam("priceTotal") @NotNull BigDecimal priceTotal,
@RequestParam("performanceId") @NotNull @NotBlank String performanceId,
@RequestParam("timeId") @NotNull @NotBlank String timeId,
@RequestParam("ticketId") @NotNull @NotBlank String ticketId,
@RequestParam("type") @NotNull Integer type,
@RequestParam(required = false, name = "page") Integer page) {
CandyMyCouponListVo vo = candyCouponService.preUsePerformanceCoupon(priceTotal, performanceId, timeId, ticketId, type);
List<CandyCouponVo> list = vo.getMyCoupon();
List<CandyCouponVo> listVo = ObjectUtil.getCandyCouponVoArrayList();
if (page == null || page == 0) {
page = 1;
}
int size = 10;
int initSize = (page - 1) * size;
int forSize = page * size;
if (forSize >= list.size()) {
forSize = list.size();
}
for (int i = initSize; i < forSize; i++) {
listVo.add(list.get(i));
}
vo.setMyCoupon(listVo);
return ResponseDto.success(vo);
}
// 是否可用券演出
@GetMapping("preCanUse/performance")
@ApiOperation("是否可用券 - 演出")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "BigDecimal", name = "priceTotal", value = "待支付总金额", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "performanceId", value = "演出id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "timeId", value = "场次id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "ticketId", value = "票id", required = true),
})
public ResponseDto<HashMap<String, Integer>> preCanUsePerformanceCoupon(@RequestParam("priceTotal") @NotNull BigDecimal priceTotal,
@RequestParam("performanceId") @NotNull @NotBlank String performanceId,
@RequestParam("timeId") @NotNull @NotBlank String timeId,
@RequestParam("ticketId") @NotNull @NotBlank String ticketId) {
HashMap<String, Integer> hashMap = CollectionUtil.mapStringInteger();
hashMap.put("canUse", candyCouponService.preCanUsePerformanceCoupon(priceTotal, performanceId, timeId, ticketId));
return ResponseDto.success(hashMap);
}
//要使用券列表 - 商品
@PostMapping("preUse/goods")
@ApiOperation("要使用券列表 - 商品")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "BigDecimal", name = "priceTotal", value = "待支付总金额", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "goodId", value = "商品id(逗号隔开的字符串)", required = true),
@ApiImplicitParam(type = "form", dataType = "Integer", name = "type", value = "类型 1可用 2过期/已使用 ", required = true),
})
public ResponseDto<CandyMyCouponListVo> preUseGoodCoupon(@RequestParam("priceTotal") @NotNull BigDecimal priceTotal,
@RequestParam("goodId") @NotNull @NotBlank String goodId,
@RequestParam("type") @NotNull Integer type,
@RequestParam(required = false, name = "page") Integer page) {
CandyMyCouponListVo vo = candyCouponService.preUseGoodCoupon(priceTotal, goodId, type);
List<CandyCouponVo> list = vo.getMyCoupon();
List<CandyCouponVo> listVo = ObjectUtil.getCandyCouponVoArrayList();
if (page == null || page == 0) {
page = 1;
}
int size = 10;
int initSize = (page - 1) * size;
int forSize = page * size;
if (forSize >= list.size()) {
forSize = list.size();
}
for (int i = initSize; i < forSize; i++) {
listVo.add(list.get(i));
}
vo.setMyCoupon(listVo);
return ResponseDto.success(vo);
}
//是否可用券 - 商品
@PostMapping("preCanUse/goods")
@ApiOperation("是否可用券 - 商品")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "BigDecimal", name = "priceTotal", value = "待支付总金额", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "goodId", value = "商品id(逗号隔开的字符串)", required = true)
})
public ResponseDto<HashMap<String, Integer>> preCanUseGoodCoupon(@RequestParam("priceTotal") @NotNull BigDecimal priceTotal,
@RequestParam("goodId") @NotNull @NotBlank String goodId) {
HashMap<String, Integer> hashMap = CollectionUtil.mapStringInteger();
hashMap.put("canUse", candyCouponService.preCanUseGoodCoupon(priceTotal, goodId));
return ResponseDto.success(hashMap);
}
//要使用券列表 - 演出提前
@GetMapping("my/advance")
@ApiOperation("提前券列表")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "performanceId", value = "演出id", required = true)
})
public ResponseDto<List<CandyCouponVo>> myAdvanceCoupon(@RequestParam("performanceId") @NotNull @NotBlank String performanceId,
@RequestParam(required = false, name = "page") Integer page) {
List<CandyCouponVo> list = candyCouponService.myAdvanceCoupon(performanceId);
List<CandyCouponVo> listVo = ObjectUtil.getCandyCouponVoArrayList();
if (page == null || page == 0) {
page = 1;
}
int size = 10;
int initSize = (page - 1) * size;
int forSize = page * size;
if (forSize >= list.size()) {
forSize = list.size();
}
for (int i = initSize; i < forSize; i++) {
listVo.add(list.get(i));
}
return ResponseDto.success(listVo);
}
// //判断券是否可用
// @GetMapping("state")
// @ApiOperation("券是否可用")
// @ApiImplicitParams({
// @ApiImplicitParam(type = "form", dataType = "String", name = "uCouponId", value = "券唯一表示id", required = true),
// })
// public ResponseDto<HashMap<String, Integer>> stateCoupon(@RequestParam("uCouponId") @NotNull @NotBlank String uCouponId) {
// Integer result = candyCouponService.stateCoupon(uCouponId);
// if (result == null) {
// return ResponseDto.failure();
// }
// HashMap<String, Integer> hashMap = CollectionUtil.mapStringInteger();
// hashMap.put("state", result);
// return ResponseDto.success(hashMap);
// }
//判断券是否可用并使用
@PostMapping("use")
@ApiOperation("券使用")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "uCouponId", value = "券唯一表示id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "content", value = "消费内容", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "totalPrice", value = "消费价格", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "goodId", value = "商品id(逗号隔开的字符串) 没有传-1", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "performanceId", value = "演出id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "timeId", value = "场次id", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "ticketId", value = "票id", required = true),
})
public ResponseDto<CandyUseResultVo> useCoupon(@RequestParam("uCouponId") @NotNull @NotBlank String uCouponId,
@RequestParam("content") @NotNull @NotBlank String content,
@RequestParam("totalPrice") @NotNull String totalPrice,
@RequestParam("goodId") @NotNull @NotBlank String goodId,
@RequestParam("performanceId") @NotNull @NotBlank String performanceId,
@RequestParam("timeId") @NotNull @NotBlank String timeId,
@RequestParam("ticketId") @NotNull @NotBlank String ticketId
) {
CandyUseResultVo result = candyCouponService.useCoupon(uCouponId, content, totalPrice, performanceId, timeId, ticketId, goodId);
if (result == null) {
return ResponseDto.failure();
}
result.setValue(result.getValue().setScale(2, BigDecimal.ROUND_HALF_UP));
return ResponseDto.success(result);
}
//回退券
@PostMapping("useBack")
@ApiOperation("回退券")
public ResponseDto<Boolean> useBackCoupon(@RequestBody @Valid List<BackCouponParam> backCouponParam) {
if (backCouponParam.size() > 100) {
return ResponseDto.failure("数据量不得大于100");
}
candyCouponService.useBackCoupon(backCouponParam);
return ResponseDto.success();
}
@PostMapping("useBackJxl")
@ApiOperation("回退券jxl")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "uCouponIds", value = "uCouponIds", required = true),
@ApiImplicitParam(type = "form", dataType = "String", name = "uid", value = "uid", required = true),
})
public ResponseDto<Boolean> useBackCoupon(
@RequestParam("uCouponIds") @NotNull @NotBlank String uCouponIds,
@RequestParam("uid") @NotNull @NotBlank String uid
) {
BackCouponParam aNew = BackCouponParam.getNew();
aNew.setuCouponIds(uCouponIds);
aNew.setUid(uid);
List<BackCouponParam> backCouponParam = new ArrayList<>();
backCouponParam.add(aNew);
if (backCouponParam.size() > 100) {
return ResponseDto.failure("数据量不得大于100");
}
candyCouponService.useBackCoupon(backCouponParam);
return ResponseDto.success();
}
//兑换券
@PostMapping("receive")
@ApiOperation("领取券")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "ccode", value = "兑换码", required = true),
})
public ResponseDto<String> receiveCoupon(@RequestParam("ccode") @NotNull @NotBlank String ccode) {
return candyCouponService.receiveCoupon(ccode);
// if (result) {
// return ResponseDto.success();
// } else {
// return ResponseDto.failure();
// }
}
//兑换券详情
@PostMapping("receive/details")
@ApiOperation("领取券详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "ccode", value = "兑换码", required = true),
})
public ResponseDto<CandyCouponVo> receiveCouponDetails(@RequestParam("ccode") @NotNull @NotBlank String ccode) {
return candyCouponService.receiveCouponDetails(ccode);
// if (result != null) {
// return ResponseDto.success(result);
// } else {
// return ResponseDto.failure();
// }
}
//根据券id获取券详情
@PostMapping("receive/ListById")
@ApiOperation("根据券id获取券详情")
@ApiImplicitParams({
@ApiImplicitParam(type = "form", dataType = "String", name = "uCouponIds", value = "券id(逗号隔开的字符串)", required = true),
})
public ResponseDto<List<CandyCouponVo>> couponListById(@RequestParam("uCouponIds") @NotNull @NotBlank String uCouponIds) {
return candyCouponService.couponListById(uCouponIds);
// if (result != null) {
// return ResponseDto.success(result);
// } else {
// return ResponseDto.failure();
// }
}
}
package com.liquidnet.service.merchant.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 券适用规则 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@RestController
@RequestMapping("/merchant-coupon-rule")
public class CandyCouponRuleController {
}
package com.liquidnet.service.merchant.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 券发放管理 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@RestController
@RequestMapping("/merchant-mgt-coupon")
public class CandyMgtCouponController {
}
package com.liquidnet.service.merchant.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 用户券信息 前端控制器
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@RestController
@RequestMapping("/merchant-user-coupon")
public class CandyUserCouponController {
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.service.merchant.service.ICandyCouponCodeService;
import org.springframework.stereotype.Service;
/**
* <p>
* 券码信息 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Service
public class CandyCouponCodeServiceImpl implements ICandyCouponCodeService {
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.service.merchant.service.ICandyCouponRuleService;
import org.springframework.stereotype.Service;
/**
* <p>
* 券适用规则 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Service
public class CandyCouponRuleServiceImpl implements ICandyCouponRuleService {
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.merchant.dto.CandyCouponCodeDto;
import com.liquidnet.service.merchant.dto.CandyCouponInfoDto;
import com.liquidnet.service.merchant.dto.CandyCouponRuleDto;
import com.liquidnet.service.merchant.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.merchant.param.BackCouponParam;
import com.liquidnet.service.merchant.service.ICandyCouponService;
import com.liquidnet.service.merchant.util.CouponBaseUtil;
import com.liquidnet.service.merchant.util.ObjectUtil;
import com.liquidnet.service.merchant.util.QueueUtils;
import com.liquidnet.service.merchant.util.RedisDataUtils;
import com.liquidnet.service.merchant.vo.CandyCouponPreVo;
import com.liquidnet.service.merchant.vo.CandyCouponVo;
import com.liquidnet.service.merchant.vo.CandyMyCouponListVo;
import com.liquidnet.service.merchant.vo.CandyUseResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* 券基础信息 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Service
public class CandyCouponServiceImpl implements ICandyCouponService {
@Autowired
private RedisDataUtils redisDataUtils;
@Autowired
private QueueUtils queueUtils;
@Override
public CandyMyCouponListVo myCoupon(Integer type) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
CandyMyCouponListVo vo = CandyMyCouponListVo.getNew();
List<CandyCouponVo> memberCoupon = ObjectUtil.getCandyCouponVoArrayList();
List<CandyCouponVo> myCoupon = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getBaseCouponUserVo(dtoItem);
if (type == 1) {
if (baseVo.getState().equals(3) || dtoItem.getState().equals(5)) {
continue;
}
} else if (type == 2) {
if (baseVo.getState().equals(1)) {
continue;
}
}
if (dtoItem.getExclusive().equals(1)) { //会员券
memberCoupon.add(baseVo);
} else {//非会员券
myCoupon.add(baseVo);
}
}
//排序 可用->金额->类型->过期时间
memberCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
myCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
vo.setMemberCoupon(memberCoupon);
vo.setMyCoupon(myCoupon);
return vo;
}
@Override
public List<CandyCouponPreVo> memberCouponPre(String uid) {
ArrayList<CandyCouponPreVo> voArrayList = ObjectUtil.getCandyCouponPreVoArrayList();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
if (!CollectionUtil.isEmpty(dtoList)) {
Map<String, Long> mCouponCountMap = dtoList.stream()
.filter(r -> (r.getExclusive() == 1 && r.getState() == 1))
.collect(Collectors.groupingBy(CandyUserCouponBasicDto::getMcouponId, Collectors.counting()));
mCouponCountMap.forEach((mCouponId, ct) -> voArrayList.add(CandyCouponPreVo.getNew().setMcouponId(mCouponId).setAvailableCt(ct)));
}
return voArrayList;
}
@Override
public List<CandyCouponVo> memberCoupon(String mCouponId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
List<CandyCouponVo> memberCoupon = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (!mCouponId.equals(dtoItem.getMcouponId())) {
continue;
}
CandyCouponVo baseVo = CouponBaseUtil.getBaseCouponUserVo(dtoItem);
if (dtoItem.getExclusive().equals(1)) { //会员券
memberCoupon.add(baseVo);
}
}
//排序 可用->金额->类型->过期时间
memberCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
return memberCoupon;
}
@Override
public CandyMyCouponListVo preUsePerformanceCoupon(BigDecimal priceTotal, String performanceId, String timeId, String ticketId, Integer type) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
CandyMyCouponListVo vo = CandyMyCouponListVo.getNew();
List<CandyCouponVo> memberCoupon = ObjectUtil.getCandyCouponVoArrayList();
List<CandyCouponVo> myCoupon = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getPerformanceCouponUserVo(dtoItem, priceTotal, performanceId, timeId, ticketId);
if (type == 1) {
if (baseVo.getState().equals(3) || dtoItem.getState().equals(5)) {
continue;
}
} else if (type == 2) {
if (baseVo.getState().equals(1)) {
continue;
}
}
if (baseVo.getCouType().equals(101)) {
continue;
}
if (dtoItem.getExclusive().equals(1)) { //会员券
memberCoupon.add(baseVo);
} else {//非会员券
myCoupon.add(baseVo);
}
}
//排序
memberCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
myCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
vo.setMemberCoupon(memberCoupon);
vo.setMyCoupon(myCoupon);
return vo;
}
@Override
public Integer preCanUsePerformanceCoupon(BigDecimal priceTotal, String performanceId, String timeId, String ticketId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
int canUse = 0;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getPerformanceCouponUserVo(dtoItem, priceTotal, performanceId, timeId, ticketId);
if (baseVo.getCouType().equals(101) || baseVo.getBusiType() == 2) {
continue;
}
if (baseVo.getState().equals(1)) { //可用
canUse = 1;
break;
} else {//不可用
continue;
}
}
return canUse;
}
@Override
public CandyMyCouponListVo preUseGoodCoupon(BigDecimal priceTotal, String goodId, Integer type) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
CandyMyCouponListVo vo = CandyMyCouponListVo.getNew();
List<CandyCouponVo> memberCoupon = ObjectUtil.getCandyCouponVoArrayList();
List<CandyCouponVo> myCoupon = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getGoodCouponUserVo(dtoItem, priceTotal, goodId, dtoList.size());
if (type == 1) {
if (baseVo.getState().equals(3) || dtoItem.getState().equals(5)) {
continue;
}
} else if (type == 2) {
if (baseVo.getState().equals(1)) {
continue;
}
}
if (baseVo.getCouType().equals(101)) {
continue;
}
if (dtoItem.getExclusive().equals(1)) { //会员券
memberCoupon.add(baseVo);
} else {//非会员券
myCoupon.add(baseVo);
}
}
//排序
memberCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
myCoupon.sort(Comparator.comparing(CandyCouponVo::getState));
vo.setMemberCoupon(memberCoupon);
vo.setMyCoupon(myCoupon);
return vo;
}
@Override
public Integer preCanUseGoodCoupon(BigDecimal priceTotal, String goodId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
int canUse = 0;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
CandyCouponVo baseVo = CouponBaseUtil.getGoodCouponUserVo(dtoItem, priceTotal, goodId, dtoList.size());
if (baseVo.getCouType().equals(101) || baseVo.getBusiType() == 1 || baseVo.getBusiType() == 3) {
continue;
}
if (baseVo.getState().equals(1)) { //可用
canUse = 1;
break;
} else {//不可用
continue;
}
}
return canUse;
}
@Override
public List<CandyCouponVo> myAdvanceCoupon(String performanceId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
List<CandyCouponVo> advanceCoupon = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (dtoItem.getBusiType().equals(3)) {
CandyCouponVo baseVo = CouponBaseUtil.getPerformanceCouponUserVo(dtoItem, BigDecimal.ZERO, performanceId, "-1", "-1");
if (baseVo.getState().equals(1)) {
advanceCoupon.add(baseVo);
} else {
continue;
}
} else {
continue;
}
}
return advanceCoupon;
}
@Override
public Integer stateCoupon(String uCouponId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
CandyUserCouponBasicDto dto = CouponBaseUtil.getSingleDtoByUCouponId(redisDataUtils.getCouponByUid(uid, userCreateTime), uCouponId);
if (dto == null) {
return null;//券不存在
}
return CouponBaseUtil.getCouponState(LocalDateTime.now(), dto.getDuedAt(), dto.getBindAt(), dto.getState());
}
@Override
public CandyUseResultVo useCoupon(String uCouponId, String content, String totalPrice, String performanceId, String timesId, String ticketId, String goodId) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
CandyUseResultVo vo = CandyUseResultVo.getNew();
List<CandyUserCouponBasicDto> dtoList = CouponBaseUtil.useCoupon(redisDataUtils.getCouponByUid(uid, userCreateTime), uCouponId, content);
if (dtoList == null) {
vo.setCouType(-1);
vo.setValue(BigDecimal.ZERO);
} else {
CandyUserCouponBasicDto dto = CouponBaseUtil.getSingleDtoByUCouponId(redisDataUtils.getCouponByUid(uid, userCreateTime), uCouponId);
if (dto.getBusiType().equals(3)) {
dto.setCouType(101);
} else {
dto.setCouType(dto.getCouType());
}
vo.setCouType(dto.getCouType());
switch (dto.getCouType()) {//券类型[1-代金券|2-满减券|3-兑换券|4-折扣券|101-优先券]
case 1:
vo.setValue(dto.getValFace());
break;
case 2:
if (dto.getValOver().compareTo(new BigDecimal(totalPrice)) <= 0) {
vo.setValue(dto.getValMinus());
} else {
vo.setCouType(-1);
vo.setValue(BigDecimal.ZERO);
}
break;
case 3:
vo.setValue(new BigDecimal(totalPrice));
break;
case 4:
vo.setValue(dto.getDiscount());
break;
default:
vo.setValue(BigDecimal.valueOf(0));
break;
}
Boolean isTarget = false;
for (CandyCouponRuleDto ruleItem : dto.getUseRules()) {
switch (ruleItem.getUseScope()) {
case 80://商品
isTarget = CouponBaseUtil.isTargetCoupon(ruleItem.getBusiId(), dto.getCouType(), goodId, new BigDecimal(totalPrice), dto.getValOver());
break;
case 90://演出
isTarget = CouponBaseUtil.isTargetCoupon(ruleItem.getBusiId(), dto.getCouType(), performanceId, new BigDecimal(totalPrice), dto.getValOver());
break;
case 91://场次
isTarget = CouponBaseUtil.isTargetCoupon(ruleItem.getBusiId(), dto.getCouType(), timesId, new BigDecimal(totalPrice), dto.getValOver());
break;
case 92://票
isTarget = CouponBaseUtil.isTargetCoupon(ruleItem.getBusiId(), dto.getCouType(), ticketId, new BigDecimal(totalPrice), dto.getValOver());
break;
case 100://票
isTarget = true;
break;
default:
isTarget = false;
break;
}
if (dto.getUseRules().size() > 1 && dto.getCouType().equals(4)) {
isTarget = false;
}
}
if (dto.getBusiType().equals(0)) {
isTarget = true;
}
if (!isTarget) {
vo.setCouType(-1);
vo.setValue(BigDecimal.ZERO);
}
if (vo.getCouType() != -1) {
redisDataUtils.setCouponByUid(uid, dtoList);
LocalDateTime now = LocalDateTime.now();
//入库
if (dto.getCcouponId() == null || (null != dto.getCcouponId() && dto.getUsedAt() != null)) {// 是公有券且为使用后退回的券,则更新
queueUtils.sendMsgByRedis(
MQConst.CandyQueue.COUPON_USE.getKey(),
SqlMapping.get("candy_coupon.use",
now, content, uid, uCouponId
)
);
} else {
queueUtils.sendMsgByRedis(
MQConst.CandyQueue.COUPON_USE.getKey(),
SqlMapping.get("candy_coupon.use_insert",
uCouponId, uid, dto.getCouponId(), dto.getBindAt(), dto.getDuedAt(), now, content, now
)
);
}
}
}
return vo;
}
@Override
public Boolean useBackCoupon(List<BackCouponParam> backCouponParams) {
for (BackCouponParam item : backCouponParams) {
String uid = item.getUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
ArrayList<String> uCouponIdList = new ArrayList(Arrays.asList(item.getuCouponIds().split(",")));
List<CandyUserCouponBasicDto> dtoList = CouponBaseUtil.backCoupon(redisDataUtils.getCouponByUid(uid, userCreateTime), uCouponIdList);
if (dtoList == null) {
return false;
} else {
redisDataUtils.setCouponByUid(uid, dtoList);
//入库
LinkedList<String> sqls = CollectionUtil.linkedListString();
sqls.add(SqlMapping.get("candy_coupon.back"));
LinkedList<Object[]> sqlsDataA = CollectionUtil.linkedListObjectArr();
for (String uCouponId : uCouponIdList) {
sqlsDataA.add(new Object[]{
uid, uCouponId
});
}
String sqlData = SqlMapping.gets(sqls, sqlsDataA);
queueUtils.sendMsgByRedis(
MQConst.CandyQueue.COUPON_BACK.getKey(),
sqlData
);
}
}
return true;
}
@Override
public ResponseDto<String> receiveCoupon(String ccode) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
String mobile = (String) CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_MOBILE);
CandyCouponCodeDto dto = redisDataUtils.getCouponByCode(ccode);
LocalDateTime now = LocalDateTime.now();
if (dto == null) {
return ResponseDto.failure("兑换码有误,请重新输入");
} else if (dto.getState().equals(0)) {//判断可领
CandyCouponInfoDto infoDto = redisDataUtils.getCouponInfo(dto.getCouponId());
if (!CouponBaseUtil.CandyCanReceive(infoDto)) {
return ResponseDto.failure("兑换码不可用");
}
String uCouponId = IDGenerator.get32UUID();
//构建baseDto
CandyUserCouponBasicDto baseDto = CandyUserCouponBasicDto.getNew().copyToRedisBaseCoupon(uCouponId, uid, ccode, infoDto, infoDto.getExpireAt());
//删除code redis
redisDataUtils.delCouponByCode(ccode);
//添加baseDto -> baseDtoList
redisDataUtils.addCouponByUid(uid, baseDto, userCreateTime);
//入库
LinkedList<String> toMqSqls = CollectionUtil.linkedListString();
LinkedList<Object[]> objsUserCoupon = CollectionUtil.linkedListObjectArr(),
objsCouponCode = CollectionUtil.linkedListObjectArr();
toMqSqls.add(SqlMapping.get("candy_coupon.receive"));
objsUserCoupon.add(new Object[]{uCouponId, uid, 1, infoDto.getCouponId(), ccode, infoDto.getEffectAt(), now, infoDto.getExpireAt()});
toMqSqls.add(SqlMapping.get("candy_coupon_code.receive"));// state:状态[0-可用|1-已用]
objsCouponCode.add(new Object[]{1, uCouponId, uid, mobile, now, now, dto.getCouponId(), ccode});
queueUtils.sendMsgByRedis(
MQConst.CandyQueue.COUPON_RECEIVE.getKey(),
SqlMapping.gets(toMqSqls, objsUserCoupon, objsCouponCode)
);
return ResponseDto.success(uCouponId);
} else if (dto.getState().equals(1)) {
return ResponseDto.failure("兑换已使用");
} else {
return ResponseDto.failure("兑换失败,请稍后再试");
}
}
@Override
public ResponseDto<CandyCouponVo> receiveCouponDetails(String ccode) {
String uid = CurrentUtil.getCurrentUid();
CandyCouponCodeDto dto = redisDataUtils.getCouponByCode(ccode);
if (dto == null) {
return ResponseDto.failure("兑换码有误,请重新输入");
} else if (dto.getState().equals(0)) {//判断可领
CandyCouponInfoDto infoDto = redisDataUtils.getCouponInfo(dto.getCouponId());
if (!CouponBaseUtil.CandyCanReceive(infoDto)) {
return ResponseDto.failure("兑换码不可用");
}
String uCouponId = IDGenerator.get32UUID();
//构建baseDto
CandyUserCouponBasicDto baseDto = CandyUserCouponBasicDto.getNew().copyToRedisBaseCoupon(uCouponId, uid, ccode, infoDto, LocalDateTime.now().plusDays(infoDto.getRedeemValidity()));
return ResponseDto.success(CouponBaseUtil.getBaseCouponUserVo(baseDto));
} else {
return ResponseDto.failure("兑换失败,请稍后再试");
}
}
@Override
public ResponseDto<List<CandyCouponVo>> couponListById(String uCouponIds) {
String uid = CurrentUtil.getCurrentUid();
LocalDateTime userCreateTime;
try {
userCreateTime = DateUtil.Formatter.yyyyMMddHHmmssTrim.parse(CurrentUtil.getTokenClaims().get(CurrentUtil.TOKEN_UCREATED).toString());
} catch (Exception e) {
userCreateTime = null;
}
ArrayList<String> uCouponIdList = new ArrayList(Arrays.asList(uCouponIds.split(",")));
List<CandyUserCouponBasicDto> dtoList = redisDataUtils.getCouponByUid(uid, userCreateTime);
List<CandyCouponVo> vo = ObjectUtil.getCandyCouponVoArrayList();
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (uCouponIdList.contains(dtoItem.getUcouponId())) {
CandyCouponVo baseVo = CouponBaseUtil.getBaseCouponUserVo(dtoItem);
vo.add(baseVo);
} else {
continue;
}
}
return ResponseDto.success(vo);
}
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.service.merchant.service.ICandyMgtCouponService;
import org.springframework.stereotype.Service;
/**
* <p>
* 券发放管理 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Service
public class CandyMgtCouponServiceImpl implements ICandyMgtCouponService {
}
package com.liquidnet.service.merchant.service.impl;
import com.liquidnet.service.merchant.service.ICandyUserCouponService;
import org.springframework.stereotype.Service;
/**
* <p>
* 用户券信息 服务实现类
* </p>
*
* @author liquidnet
* @since 2021-08-18
*/
@Service
public class CandyUserCouponServiceImpl implements ICandyUserCouponService {
}
package com.liquidnet.service.merchant.util;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.merchant.dto.CandyCouponInfoDto;
import com.liquidnet.service.merchant.dto.CandyCouponRuleDto;
import com.liquidnet.service.merchant.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.merchant.vo.CandyCouponRulesVo;
import com.liquidnet.service.merchant.vo.CandyCouponVo;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CouponBaseUtil {
/**
* 获取 基础券vo
*
* @param dtoItem CandyUserCouponBasicDto
* @return
*/
public static CandyCouponVo getBaseCouponUserVo(CandyUserCouponBasicDto dtoItem) {
LocalDateTime now = LocalDateTime.now();
CandyCouponVo vo = CandyCouponVo.getNew();
List<CandyCouponRulesVo> rulesVoList = ObjectUtil.getCandyCouponRulesVos();
vo.setTitle(dtoItem.getTitle());
vo.setExpireAt(DateUtil.format(dtoItem.getDuedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setDiscount(dtoItem.getDiscount());
vo.setValFace(dtoItem.getValFace());
vo.setBusiType(dtoItem.getBusiType());
vo.setValOver(dtoItem.getValOver());
vo.setValMinus(dtoItem.getValMinus());
vo.setBindType(dtoItem.getBindType());
vo.setLabel(dtoItem.getLabel());
vo.setNotice(dtoItem.getNotice());
vo.setUcouponId(dtoItem.getUcouponId());
vo.setUsedAt(DateUtil.format(dtoItem.getUsedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setUsedFor(dtoItem.getUsedFor());
//适用范围 规则
if (dtoItem.getUseRules() != null) {
for (CandyCouponRuleDto ruleItem : dtoItem.getUseRules()) {
CandyCouponRulesVo voRules = CandyCouponRulesVo.getNew();
voRules.setUseScope(ruleItem.getUseScope());
voRules.setBusiId(ruleItem.getBusiId());
voRules.setBusiName(ruleItem.getBusiName());
rulesVoList.add(voRules);
}
}
//券类别
if (dtoItem.getBusiType().equals(3)) {
vo.setCouType(101);
} else {
vo.setCouType(dtoItem.getCouType());
}
vo.setState(getCouponState(now, dtoItem.getDuedAt(), dtoItem.getBindAt(), dtoItem.getState()));
vo.setUseRules(rulesVoList);
return vo;
}
/**
* 获取 演出维度 券列表
*
* @param dtoItem CandyUserCouponBasicDto
* @return
*/
public static CandyCouponVo getPerformanceCouponUserVo(CandyUserCouponBasicDto dtoItem,
BigDecimal priceTotal,
String performanceId,
String timeId,
String ticketId) {
boolean isTarget = false;
LocalDateTime now = LocalDateTime.now();
CandyCouponVo vo = CandyCouponVo.getNew();
List<CandyCouponRulesVo> rulesVoList = ObjectUtil.getCandyCouponRulesVos();
vo.setTitle(dtoItem.getTitle());
vo.setExpireAt(DateUtil.format(dtoItem.getDuedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setValFace(dtoItem.getValFace());
vo.setDiscount(dtoItem.getDiscount());
vo.setValOver(dtoItem.getValOver());
vo.setValMinus(dtoItem.getValMinus());
vo.setBindType(dtoItem.getBindType());
vo.setLabel(dtoItem.getLabel());
vo.setNotice(dtoItem.getNotice());
vo.setUcouponId(dtoItem.getUcouponId());
vo.setUsedAt(DateUtil.format(dtoItem.getUsedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setUsedFor(dtoItem.getUsedFor());
vo.setBusiType(dtoItem.getBusiType());
//适用范围 规则
if (dtoItem.getBusiType().equals(0)) {
isTarget = true;
} else if (dtoItem.getBusiType().equals(2)) {
isTarget = false;
} else {
for (CandyCouponRuleDto ruleItem : dtoItem.getUseRules()) {
CandyCouponRulesVo voRules = CandyCouponRulesVo.getNew();
voRules.setUseScope(ruleItem.getUseScope());
voRules.setBusiId(ruleItem.getBusiId());
voRules.setBusiName(ruleItem.getBusiName());
rulesVoList.add(voRules);
switch (ruleItem.getUseScope()) {
case 90://演出
isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), performanceId, priceTotal, dtoItem.getValOver());
break;
case 91://场次
isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), timeId, priceTotal, dtoItem.getValOver());
break;
case 92://票
isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), ticketId, priceTotal, dtoItem.getValOver());
break;
case 100://全场
if (dtoItem.getCouType().equals(2)) {
if (priceTotal.compareTo(dtoItem.getValOver()) >= 0) {
isTarget = true;
} else {
isTarget = false;
}
} else {
isTarget = true;
}
break;
default:
isTarget = false;
break;
}
if (dtoItem.getUseRules().size() > 1 && dtoItem.getCouType().equals(4)) {
isTarget = false;
}
}
if (dtoItem.getUseRules().size() == 0 && !dtoItem.getBusiType().equals(0)) {
isTarget = false;
}
}
//券类别
if (dtoItem.getBusiType().equals(3)) {
vo.setCouType(101);
} else {
vo.setCouType(dtoItem.getCouType());
}
int state = getCouponState(now, dtoItem.getDuedAt(), dtoItem.getBindAt(), dtoItem.getState());
if (isTarget) {
vo.setState(state);
} else {
vo.setState(state == 1 ? 21 : state);//不在目标范围 如果可用改为不可用21
}
vo.setUseRules(rulesVoList);
return vo;
}
/**
* 获取 商品维度 券列表
*
* @param dtoItem CandyUserCouponBasicDto
* @return
*/
public static CandyCouponVo getGoodCouponUserVo(CandyUserCouponBasicDto dtoItem,
BigDecimal priceTotal,
String goodId,
Integer size) {
boolean isTarget = false;
LocalDateTime now = LocalDateTime.now();
CandyCouponVo vo = CandyCouponVo.getNew();
List<CandyCouponRulesVo> rulesVoList = ObjectUtil.getCandyCouponRulesVos();
vo.setTitle(dtoItem.getTitle());
vo.setExpireAt(DateUtil.format(dtoItem.getDuedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setValFace(dtoItem.getValFace());
vo.setValOver(dtoItem.getValOver());
vo.setDiscount(dtoItem.getDiscount());
vo.setValMinus(dtoItem.getValMinus());
vo.setBindType(dtoItem.getBindType());
vo.setLabel(dtoItem.getLabel());
vo.setNotice(dtoItem.getNotice());
vo.setUcouponId(dtoItem.getUcouponId());
vo.setUsedAt(DateUtil.format(dtoItem.getUsedAt(), DateUtil.Formatter.yyyy_MM_dd));
vo.setUsedFor(dtoItem.getUsedFor());
vo.setBusiType(dtoItem.getBusiType());
//适用范围 规则
if (dtoItem.getBusiType().equals(0)) {
isTarget = true;
} else if (dtoItem.getBusiType().equals(1) || dtoItem.getBusiType().equals(3)) {
isTarget = false;
} else {
for (CandyCouponRuleDto ruleItem : dtoItem.getUseRules()) {
CandyCouponRulesVo voRules = CandyCouponRulesVo.getNew();
voRules.setUseScope(ruleItem.getUseScope());
voRules.setBusiId(ruleItem.getBusiId());
voRules.setBusiName(ruleItem.getBusiName());
rulesVoList.add(voRules);
switch (ruleItem.getUseScope()) {
case 80://商品
isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), goodId, priceTotal, dtoItem.getValOver());
break;
case 81://款式
// isTarget = isTargetCoupon(ruleItem.getBusiId(), dtoItem.getCouType(), produceId, priceTotal, dtoItem.getValOver());
break;
case 100://全场
if (dtoItem.getCouType().equals(2)) {
if (priceTotal.compareTo(dtoItem.getValOver()) >= 0) {
isTarget = true;
} else {
isTarget = false;
}
} else {
isTarget = true;
}
break;
default:
isTarget = false;
break;
}
}
if (dtoItem.getUseRules().size() == 0 && !dtoItem.getBusiType().equals(0)) {
isTarget = false;
}
}
//券类别
if (dtoItem.getBusiType().equals(3)) {
vo.setCouType(101);
} else {
vo.setCouType(dtoItem.getCouType());
}
int state = getCouponState(now, dtoItem.getDuedAt(), dtoItem.getBindAt(), dtoItem.getState());
if (isTarget) {
vo.setState(state);
} else {
vo.setState(state == 1 ? 21 : state);//不在目标范围 如果可用改为不可用21
}
vo.setUseRules(rulesVoList);
return vo;
}
/**
* @param busiId 适用id
* @param targetId 目标id(例如 演出id,场次id,票种id)
* @param priceTotal 待支付总金额
* @param valOver 满减~满
* @return
*/
public static Boolean isTargetCoupon(String busiId,
Integer couType,
String targetId,
BigDecimal priceTotal,
BigDecimal valOver) {
boolean isTarget = false;
ArrayList<String> targetIdList = new ArrayList(Arrays.asList(targetId.split(",")));
if (targetIdList.contains(busiId)) {//判断id 对应
if (couType.equals(2)) {
if (priceTotal.compareTo(valOver) >= 0) {
isTarget = true;
}
} else {
isTarget = true;
}
}
return isTarget;
}
/**
* 获取券状态
*
* @param currentTime 当前服务器时间
* @param expireAt 券过期时间
* @param state 券状态
* @return 判断过后的券状态
*/
public static Integer getCouponState(LocalDateTime currentTime, LocalDateTime expireAt, LocalDateTime effectAt, Integer state) {
//券状态
Integer data;
if (state.equals(1)) {
if (currentTime.isAfter(expireAt)) {
data = 3;
} else if (currentTime.isBefore(effectAt)) {
data = 31;
} else {
data = state;
}
} else {
data = state;
}
return data;
}
/**
* 根据券id获取Dto
*
* @param dtoList CouponBaseDtoList
* @param uCouponId 券唯一id
* @return CandyUserCouponBasicDto
*/
public static CandyUserCouponBasicDto getSingleDtoByUCouponId(List<CandyUserCouponBasicDto> dtoList, String uCouponId) {
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (dtoItem.getUcouponId().equals(uCouponId)) {
return dtoItem;
}
}
return null;
}
/**
* 使用券
*
* @param dtoList CouponBaseDtoList
* @param uCouponId 券唯一id
* @return List<CandyUserCouponBasicDto>
*/
public static List<CandyUserCouponBasicDto> useCoupon(List<CandyUserCouponBasicDto> dtoList, String uCouponId, String content) {
boolean isHas = false;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (dtoItem.getUcouponId().equals(uCouponId)) {
if (dtoItem.getState().equals(1)) {
dtoItem.setState(5);
dtoItem.setUsedAt(LocalDateTime.now());
dtoItem.setUsedFor(content);
isHas = true;//券存在
} else {
return null;//券不可用
}
break;
}
}
if (!isHas) {
return null;//券不存在
}
return dtoList;
}
/**
* 回退券
*
* @param dtoList CouponBaseDtoList
* @param uCouponIdList 券唯一id list
* @return List<CandyUserCouponBasicDto>
*/
public static List<CandyUserCouponBasicDto> backCoupon(List<CandyUserCouponBasicDto> dtoList, ArrayList<String> uCouponIdList) {
boolean isHas = false;
for (CandyUserCouponBasicDto dtoItem : dtoList) {
if (uCouponIdList.contains(dtoItem.getUcouponId())) {
if (dtoItem.getState().equals(5)) {
dtoItem.setState(1);
dtoItem.setUsedFor("");
dtoItem.setUsedAt(null);
isHas = true;//券存在
} else {
}
}
}
if (!isHas) {
return null;//券不存在
}
return dtoList;
}
/**
* 判断券是否在可兑换时间范围
*
* @param dto
* @return
*/
public static boolean CandyCanReceive(CandyCouponInfoDto dto) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime startTime = dto.getRedeemStart();
LocalDateTime endTime = dto.getRedeemStop();
if (now.isAfter(startTime) && now.isBefore(endTime)) {
return true;
} else {
return false;
}
}
}
package com.liquidnet.service.merchant.util;
import com.liquidnet.service.merchant.dto.CandyCommonCouponBasicDto;
import com.liquidnet.service.merchant.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.merchant.vo.CandyCouponPreVo;
import com.liquidnet.service.merchant.vo.CandyCouponRulesVo;
import com.liquidnet.service.merchant.vo.CandyCouponVo;
import java.util.ArrayList;
public class ObjectUtil {
private static final ArrayList<CandyUserCouponBasicDto> candyUserCouponBasicDtoArrayList = new ArrayList<>();
private static final ArrayList<CandyCommonCouponBasicDto> candyCommonCouponBasicDtoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponVo> candyCouponVoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponPreVo> candyCouponPreVoArrayList = new ArrayList<>();
private static final ArrayList<CandyCouponRulesVo> candyCouponRulesVos = new ArrayList<>();
public static ArrayList<CandyUserCouponBasicDto> getCandyUserCouponBasicDtoArrayList() {
return (ArrayList<CandyUserCouponBasicDto>) candyUserCouponBasicDtoArrayList.clone();
}
public static ArrayList<CandyCommonCouponBasicDto> getCandyCommonCouponBasicDtoArrayList() {
return (ArrayList<CandyCommonCouponBasicDto>) candyCommonCouponBasicDtoArrayList.clone();
}
public static ArrayList<CandyCouponVo> getCandyCouponVoArrayList() {
return (ArrayList<CandyCouponVo>) candyCouponVoArrayList.clone();
}
public static ArrayList<CandyCouponPreVo> getCandyCouponPreVoArrayList() {
return (ArrayList<CandyCouponPreVo>) candyCouponPreVoArrayList.clone();
}
public static ArrayList<CandyCouponRulesVo> getCandyCouponRulesVos() {
return (ArrayList<CandyCouponRulesVo>) candyCouponRulesVos.clone();
}
}
package com.liquidnet.service.merchant.util;
import com.liquidnet.commons.lang.util.CollectionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Component
public class QueueUtils {
@Autowired
StringRedisTemplate stringRedisTemplate;
/**
* 发送消息 - REDIS
*
* @param streamKey Redis消费Key
* @param jsonMsg Json字符串
*/
public void sendMsgByRedis(String streamKey, String jsonMsg) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put("message", jsonMsg);
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(streamKey));
}
}
package com.liquidnet.service.merchant.util;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.merchant.constant.CandyRedisConst;
import com.liquidnet.service.merchant.dto.CandyCommonCouponBasicDto;
import com.liquidnet.service.merchant.dto.CandyCouponCodeDto;
import com.liquidnet.service.merchant.dto.CandyCouponInfoDto;
import com.liquidnet.service.merchant.dto.CandyUserCouponBasicDto;
import com.liquidnet.service.feign.platform.api.FeignPlatformCandyDemoteClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class RedisDataUtils {
@Autowired
RedisUtil redisUtil;
@Autowired
FeignPlatformCandyDemoteClient feignPlatformCandyDemoteClient;
// 获取 CandyUserCouponBasicDto数组 根据用户id
public List<CandyUserCouponBasicDto> getCouponByUid(String uid, LocalDateTime userCreateTime) {
String redisKey = CandyRedisConst.BASIC_USER_COUPON.concat(uid);
String publicRedisKey = CandyRedisConst.BASIC_COMMON_COUPON;
Object obj = redisUtil.get(redisKey);
Object obj2 = redisUtil.get(publicRedisKey);
List<CandyUserCouponBasicDto> userDto;
List<CandyCommonCouponBasicDto> pubDto;
if (obj == null) {
//降级
// userDto = new ArrayList();
// ResponseDto<Object> responseDto = feignPlatformCandyDemoteClient.queryForUserCouponBasicDto(uid);
// if (responseDto.isSuccess()) {
// userDto = (List<CandyUserCouponBasicDto>) responseDto.getData();
// } else {
userDto = ObjectUtil.getCandyUserCouponBasicDtoArrayList();
// }
} else {
userDto = (List<CandyUserCouponBasicDto>) obj;
}
if (obj2 == null) {
//降级
// ResponseDto<Object> responseDto = feignPlatformCandyDemoteClient.queryForCommonCouponBasicDto(DateUtil.Formatter.yyyyMMddHHmmss.format(userCreateTime));
// if (responseDto.isSuccess()) {
// pubDto = (List<CandyCommonCouponBasicDto>) responseDto.getData();
// } else {
pubDto = ObjectUtil.getCandyCommonCouponBasicDtoArrayList();
// }
} else {
pubDto = (List<CandyCommonCouponBasicDto>) obj2;
}
boolean needSet = false;
if (userCreateTime == null) {
userCreateTime = LocalDateTime.MIN;
}
List<String> userIds = userDto.stream().map(CandyUserCouponBasicDto::getCcouponId).collect(Collectors.toList());
if (userIds!=null && userIds.size() > 0) {
for (CandyCommonCouponBasicDto item : pubDto) {
if (userIds.contains(item.getCcouponId()) || userCreateTime.isAfter(item.getCreatedAt())) {
continue;
} else {
CandyUserCouponBasicDto userCouponBasicDto = CandyUserCouponBasicDto.getNew().copyToRedisCommonBaseCoupon(IDGenerator.get32UUID(), uid, item);
userDto.add(userCouponBasicDto);
needSet = true;
}
}
}
if (needSet) {
setCouponByUid(uid, userDto);
}
return userDto;
}
// 覆盖 CandyUserCouponBasicDto数组 根据用户id
public void setCouponByUid(String uid, List<CandyUserCouponBasicDto> dtoList) {
String redisKey = CandyRedisConst.BASIC_USER_COUPON.concat(uid);
redisUtil.set(redisKey, dtoList);
}
// 添加 CandyUserCouponBasicDto数组 item
public void addCouponByUid(String uid, CandyUserCouponBasicDto dto, LocalDateTime userCreateTime) {
List<CandyUserCouponBasicDto> dtoList = getCouponByUid(uid, userCreateTime);
dtoList.add(dto);
setCouponByUid(uid, dtoList);
}
//获取 CandyCouponCodeDto 根据 ccode
public CandyCouponCodeDto getCouponByCode(String ccode) {
String redisKey = CandyRedisConst.BASIC_COUPON_CODE.concat(ccode);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
//降级
return null;
} else {
return (CandyCouponCodeDto) obj;
}
}
//删除 CandyCouponCodeDto 根据 ccode
public void delCouponByCode(String ccode) {
String redisKey = CandyRedisConst.BASIC_COUPON_CODE.concat(ccode);
redisUtil.del(redisKey);
}
//获取 CandyCouponInfoDto 根据 couponId
public CandyCouponInfoDto getCouponInfo(String couponId) {
String redisKey = CandyRedisConst.BASIC_COUPON_INFO.concat(couponId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
//降级
return null;
} else {
return (CandyCouponInfoDto) obj;
}
}
}
......@@ -18,8 +18,9 @@ liquidnet:
username: admin
password: admin
config:
# location: /Users/color/company_project/java/liquidnet-bus-v1-1/liquidnet-bus-config/liquidnet-config
# location: /Users/color/company_project/java/liquidnet-bus-v1-1/liquidnet-bus-config/liquidnet-config
# location: /Users/hujiachen/IdeaProjects/liquidnet-bus-v1/liquidnet-bus-config/liquidnet-config
# location: /Users/Tice/Company/Liquidnet/Liquidnet_Bus/liquidnet-bus-config/liquidnet-config
location: /app/support-config
# end-dev-这里是配置信息基本值
......
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