记得上下班打卡 | 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
......@@ -17,13 +17,3 @@ liquidnet:
mongodb:
sslEnabled: false
database: test_ln_scene
\ No newline at end of file
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各环境个性配置
......@@ -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 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.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.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