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

Commit db014985 authored by 洪全海's avatar 洪全海

提交代码,会员下单接口

parent 31e2b788
package com.liquidnet.service.adam.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@ApiModel(value = "AdamMemberOrderCallbackResult", description = "购买会员或会员码的支付回调")
@Data
public class AdamMemberOrderCallbackResult implements Serializable {
private static final long serialVersionUID = 3219448286221952517L;
@ApiModelProperty(position = 0, required = true, value = "订单状态")
private Integer status;
@ApiModelProperty(position = 1, required = true, value = "订单号")
private String orderCode;
@ApiModelProperty(position = 2, required = true, value = "支付单号")
private String code;
@ApiModelProperty(position = 3, required = true, value = "购买类型")
private String type;
@ApiModelProperty(position = 4, required = true, value = "金额")
private BigDecimal price;
@ApiModelProperty(position = 5, required = true, value = "支付类型")
private String paymentType;
@ApiModelProperty(position = 6, required = true, value = "支付时间")
private LocalDateTime paymentAt;
}
......@@ -44,5 +44,7 @@ public class AdamMemberOrderParam implements Serializable {
private String productId;
@ApiModelProperty(position = 10, required = true, value = "支付用的openId")
private String openId;
@ApiModelProperty(position = 11, required = false, value = "ip地址")
private String clientIp;
}
......@@ -73,16 +73,4 @@ public class AdamMemberPriceParam implements Serializable {
*/
@ApiModelProperty(position = 8, required = false, value = "会员包须知", example = "会员包须知")
private String detail;
/**
* 创建时间
*/
@ApiModelProperty(position = 9, required = false, value = "创建时间", example = "2021-05-10 13:13:13")
private LocalDateTime createdAt;
/**
* 更新时间
*/
@ApiModelProperty(position = 10, required = false, value = "更新时间", example = "2021-05-10 13:13:13")
private LocalDateTime updatedAt;
}
......@@ -61,8 +61,13 @@ public class AdamMemberCodeVo implements Serializable, Cloneable {
/**
* 使用时间
*/
@ApiModelProperty(position = 1, value = "使用时间")
@ApiModelProperty(position = 11, value = "使用时间")
private String useAt;
/**
* 会员码id
*/
@ApiModelProperty(position = 12, value = "会员码id")
private String memberCodeId;
private String createdAt;
private String updatedAt;
......
package com.liquidnet.service.adam.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.security.core.parameters.P;
import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "AdamMemberOrderVo", description = "订单详情展示")
@Data
public class AdamMemberOrderVo implements Serializable {
private static final long serialVersionUID = 5258094625450569125L;
@ApiModelProperty(position = 0, value = "订单号")
private String orderNo;
@ApiModelProperty(position = 1, value = "用户uid")
private String uid;
@ApiModelProperty(position = 2, value = "购买方式:0-购买会员 1-购买会员码,2-使用会员码")
private Integer mode;
@ApiModelProperty(position = 3, value = "会员id")
private String memberId;
@ApiModelProperty(position = 4, value = "会员名")
private String memberName;
@ApiModelProperty(position = 5, value = "会员价格id")
private String memberPriceId;
@ApiModelProperty(position = 6, value = "购买天数")
private Integer days;
@ApiModelProperty(position = 7, value = "订单状态:0未支付 1已支付 2已超时 5已退款")
private Integer state;
@ApiModelProperty(position = 8, value = "会员号")
private String memberNo;
@ApiModelProperty(position = 9, value = "支付类型")
private String payChannel;
@ApiModelProperty(position = 10, value = "支付单号")
private String payNo;
@ApiModelProperty(position = 11, value = "支付时间")
private String paymentAt;
@ApiModelProperty(position = 12, value = "生日")
private String birthday;
@ApiModelProperty(position = 13, value = "创建时间")
private String createdAt;
@ApiModelProperty(position = 14, value = "兑换码")
private String memberCode;
@ApiModelProperty(position = 15, value = "兑换码")
private BigDecimal price;
public static final AdamMemberOrderVo obj = new AdamMemberOrderVo();
private static AdamMemberOrderVo getNew(){
private static AdamMemberOrderVo getNew() {
try {
return (AdamMemberOrderVo) obj.clone();
} catch (CloneNotSupportedException e) {
......
......@@ -3,11 +3,13 @@ package com.liquidnet.service.adam.dto.vo;
import com.liquidnet.service.adam.entity.AdamUserMember;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@ApiModel(value = "AdamUserMemberVo", description = "会员用户信息")
@Data
public class AdamUserMemberVo implements Serializable, Cloneable {
private static final long serialVersionUID = 5258094625450569125L;
......@@ -16,7 +18,7 @@ public class AdamUserMemberVo implements Serializable, Cloneable {
@ApiModelProperty(position = 1, value = "会员类型id", example = "0")
private String memberId;
@ApiModelProperty(position = 2, value = "会员号", example = "0")
private Integer memberNo;
private String memberNo;
@ApiModelProperty(position = 3, value = "用户会员状态", example = "1")
private Integer state;
@ApiModelProperty(position = 4, value = "会员过期时间")
......@@ -25,6 +27,8 @@ public class AdamUserMemberVo implements Serializable, Cloneable {
private String createdAt;
@ApiModelProperty(position = 6, value = "更新时间")
private String updatedAt;
@ApiModelProperty(position = 7, value = "会员用户id")
private String memberUserId;
private static final AdamUserMemberVo obj = new AdamUserMemberVo();
......
package com.liquidnet.service.adam.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.AdamMemberOrderCallbackResult;
import com.liquidnet.service.adam.dto.AdamMemberOrderCodeParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderResult;
......@@ -32,4 +33,11 @@ public interface IAdamMemberOrderService extends IService<AdamMemberOrder> {
* @return
*/
AdamMemberOrderVo getMemberOrderInfo(String orderNo);
/**
* 支付回调
* @return
*/
boolean memberNotifyCallBack(AdamMemberOrderCallbackResult result);
}
package com.liquidnet.service.adam.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamUserMember;
/**
......@@ -10,4 +11,21 @@ public interface IAdamUserMemberService extends IService<AdamUserMember> {
void createUserMemberInfo(String memberId);
String getMaxMemberNo(String memberId);
// 获取用户会员信息
AdamUserMemberVo getUserMemberInfo(String uid);
/**
* 获取会员库存
* @param memberId
* @return
*/
boolean getOneFromRepertory(String memberId);
/**
* 限购数量
* @param memberId
* @return
*/
Integer getRepertoryCount(String memberId);
}
package com.liquidnet.service.adam.constant;
/**
* 订单
*/
public class AdamMemberOrderConst {
// 订单状态
public static final Integer STATUS_UNPAID = 0; // 待支付
public static final Integer STATUS_PAID = 1; // 已支付
public static final Integer STATUS_EXPIRED = 2; // 已过期(限时10分钟支付,20分钟回滚卡号,变更为已过期)
public static final Integer STATUS_LATE = 3; // 超时付(超过20分钟支付,此时卡号已回滚)
public static final Integer STATUS_REFUNDING = 4; // 退款中
public static final Integer STATUS_REFUND = 5; // 退款完成
public static final String TYPE_BUY = "buy"; // 购买会员、会员码
public static final String TYPE_CODE = "code"; // 使用会员码
public static final String TYPE_VIP = "VIP";
public static final String TYPE_CLUB = "CLUB";
public static final Integer TIME_LIMIT = 5;
public static final Integer TIME_OUT = 10;
public static final Integer SUB_TYPE_BUY_VIP = 0;
public static final Integer SUB_TYPE_BUY_VIP_CODE = 1; // 购买会员码(不需要填写地址)
public static final Integer SUB_TYPE_USE_VIP_CODE = 2; // 使用会员码(购买的)(仅限从未购买过会员的用户使用,需要填写地址)
public static final Integer SUB_TYPE_USE_GIFT_CODE = 3; // 使用会员码(赠送的)(仅限从未购买过会员的用户使用,不需要填写地址)
// 用户会员状态
public static final Integer STATE_VALID = 1; // 正常
public static final Integer STATE_EXPIRED = 2; // 已失效
}
......@@ -26,6 +26,11 @@ public class AdamRedisConst {
public static final String MEMBER_MEMBER_NO_MAX_KEY = ADAM.concat(":members:member_no_max:");
public static final String INFO_MEMBERS_USER_INFO = ADAM.concat(":list:members:user:info:");
public static final String INFO_MEMBERS_REPERTORY_INFO = ADAM.concat(":list:members:repertory:");
public static final String INFO_MEMBERS_ORDER_INFO = ADAM.concat(":list:members:order:");
// public static final String USER_CONFIRM_SMS_CODE_KEY = ADAM + ":user:sms_confirm:";
//
......
......@@ -2,6 +2,9 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.liquidnet.service.adam.dto.AdamMemberOrderParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderResult;
import com.liquidnet.service.adam.service.IAdamMemberOrderService;
import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
......@@ -11,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -23,6 +27,8 @@ public class AdamMemberController {
@Autowired
IAdamMemberService adamMemberService;
@Autowired
IAdamMemberOrderService adamMemberOrderService;
@ApiOperationSupport(order = 0)
@ApiOperation(value = "会员信息")
......@@ -31,4 +37,18 @@ public class AdamMemberController {
AdamMemberVo info = adamMemberService.queryMemberInfo();
return ResponseDto.success(info);
}
@ApiOperationSupport(order = 1)
@ApiOperation(value = "购买会员或会员码")
@PostMapping("buy/member")
public ResponseDto<AdamMemberOrderResult> buyMemberOrCode(AdamMemberOrderParam param) {
AdamMemberOrderResult adamMemberOrderResult = null;
try {
adamMemberOrderResult = adamMemberOrderService.buyMemberOrMemberCode(param);
} catch (Exception e) {
e.printStackTrace();
return ResponseDto.failure();
}
return ResponseDto.success(adamMemberOrderResult);
}
}
......@@ -62,7 +62,7 @@ public class AdamMemberServiceImpl extends ServiceImpl<AdamMemberMapper, AdamMem
memberPrice = mongoTemplate.find(Query.query(Criteria.where("memberId").is(memberId)),
AdamMemberPriceVo.class, AdamMemberPriceVo.class.getSimpleName());
}
if (memberPrice.size() > 0) {
if (null != info && memberPrice.size() > 0) {
info.setAdamMemberPrice(memberPrice);
}
return info;
......
......@@ -3,6 +3,8 @@ package com.liquidnet.service.adam.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamUserMember;
import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper;
import com.liquidnet.service.adam.mapper.AdamUserMemberMapper;
......@@ -12,6 +14,8 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.regex.Pattern;
......@@ -47,7 +51,7 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper,
String memberNoMaxKey = AdamRedisConst.MEMBER_MEMBER_NO_MAX_KEY.concat(memberId);
Object maxNumber = redisUtil.get(memberNoMaxKey);
if (null !=maxNumber) {
if (null != maxNumber) {
maxNumber = maxNumber.toString();
String newNumber = String.valueOf(redisUtil.incr(memberNoMaxKey, 1));
Integer newNumberInt = newNumber.length() - 1;
......@@ -65,4 +69,47 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper,
return redisUtil.get(memberNoMaxKey).toString();
}
}
@Override
public AdamUserMemberVo getUserMemberInfo(String uid) {
AdamUserMemberVo adamUserMemberVo = (AdamUserMemberVo) redisUtil.hget(AdamRedisConst.INFO_MEMBERS_USER_INFO.concat(uid), uid);
if (null == adamUserMemberVo) {
adamUserMemberVo = mongoTemplate.findOne(Query.query(Criteria.where("uid").is(uid)), AdamUserMemberVo.class, AdamUserMemberVo.class.getSimpleName());
}
return adamUserMemberVo;
}
@Override
public boolean getOneFromRepertory(String memberId) {
AdamMemberVo adamMemberVo = (AdamMemberVo) redisUtil.hget(AdamRedisConst.INFO_MEMBERS_INFO.concat(memberId), memberId);
if (null == adamMemberVo) {
adamMemberVo = mongoTemplate.findOne(Query.query(Criteria.where("memberId").is(memberId)), AdamMemberVo.class, AdamMemberVo.class.getSimpleName());
}
if (0 == adamMemberVo.getLimitation()) {
return true;
}
String repertoryKey = AdamRedisConst.INFO_MEMBERS_REPERTORY_INFO.concat(memberId);
Object repertory = redisUtil.get(repertoryKey);
// 判断,如果没有从redis中拿到库存数量,则把MongoDB中查出的库存插入redis
if (null == repertory) {
redisUtil.set(repertoryKey, adamMemberVo.getLimitation());
repertory = adamMemberVo.getLimitation();
}
Long limitation = Long.parseLong(repertory.toString());
limitation = redisUtil.decr(repertoryKey, limitation);
// 库存大于0 正常返回,否则回滚一位库存
if (limitation >= 0) {
return true;
} else {
redisUtil.incr(repertoryKey, 1);
return false;
}
}
@Override
public Integer getRepertoryCount(String memberId) {
return 0;
}
}
......@@ -68,9 +68,7 @@ public class AdamMemberPriceServiceImpl extends ServiceImpl<AdamMemberPriceMappe
mongoTemplate.insert(vo, AdamMemberPriceVo.class.getSimpleName());
// redis
Map<String, Object> redisMap = new HashMap<>();
redisMap.put(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberPriceId()), vo);
redisUtil.hmset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), redisMap);
redisUtil.hset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), vo.getMemberPriceId(), vo);
}
@Override
......@@ -96,9 +94,7 @@ public class AdamMemberPriceServiceImpl extends ServiceImpl<AdamMemberPriceMappe
new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
);
// reids
Map<String, Object> redisMap = new HashMap<>();
redisMap.put(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberPriceId()), info);
redisUtil.hmset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), redisMap);
redisUtil.hset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), info.getMemberPriceId(), info);
} catch (Exception e){
return false;
}
......
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