记得上下班打卡 | 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 { ...@@ -44,5 +44,7 @@ public class AdamMemberOrderParam implements Serializable {
private String productId; private String productId;
@ApiModelProperty(position = 10, required = true, value = "支付用的openId") @ApiModelProperty(position = 10, required = true, value = "支付用的openId")
private String openId; private String openId;
@ApiModelProperty(position = 11, required = false, value = "ip地址")
private String clientIp;
} }
...@@ -73,16 +73,4 @@ public class AdamMemberPriceParam implements Serializable { ...@@ -73,16 +73,4 @@ public class AdamMemberPriceParam implements Serializable {
*/ */
@ApiModelProperty(position = 8, required = false, value = "会员包须知", example = "会员包须知") @ApiModelProperty(position = 8, required = false, value = "会员包须知", example = "会员包须知")
private String detail; 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 { ...@@ -61,8 +61,13 @@ public class AdamMemberCodeVo implements Serializable, Cloneable {
/** /**
* 使用时间 * 使用时间
*/ */
@ApiModelProperty(position = 1, value = "使用时间") @ApiModelProperty(position = 11, value = "使用时间")
private String useAt; private String useAt;
/**
* 会员码id
*/
@ApiModelProperty(position = 12, value = "会员码id")
private String memberCodeId;
private String createdAt; private String createdAt;
private String updatedAt; private String updatedAt;
......
package com.liquidnet.service.adam.dto.vo; package com.liquidnet.service.adam.dto.vo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import org.springframework.security.core.parameters.P;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal;
@ApiModel(value = "AdamMemberOrderVo", description = "订单详情展示") @ApiModel(value = "AdamMemberOrderVo", description = "订单详情展示")
@Data @Data
public class AdamMemberOrderVo implements Serializable { public class AdamMemberOrderVo implements Serializable {
private static final long serialVersionUID = 5258094625450569125L; 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(); public static final AdamMemberOrderVo obj = new AdamMemberOrderVo();
private static AdamMemberOrderVo getNew(){ private static AdamMemberOrderVo getNew() {
try { try {
return (AdamMemberOrderVo) obj.clone(); return (AdamMemberOrderVo) obj.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
......
...@@ -3,11 +3,13 @@ package com.liquidnet.service.adam.dto.vo; ...@@ -3,11 +3,13 @@ package com.liquidnet.service.adam.dto.vo;
import com.liquidnet.service.adam.entity.AdamUserMember; import com.liquidnet.service.adam.entity.AdamUserMember;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ApiModel(value = "AdamUserMemberVo", description = "会员用户信息") @ApiModel(value = "AdamUserMemberVo", description = "会员用户信息")
@Data
public class AdamUserMemberVo implements Serializable, Cloneable { public class AdamUserMemberVo implements Serializable, Cloneable {
private static final long serialVersionUID = 5258094625450569125L; private static final long serialVersionUID = 5258094625450569125L;
...@@ -16,7 +18,7 @@ public class AdamUserMemberVo implements Serializable, Cloneable { ...@@ -16,7 +18,7 @@ public class AdamUserMemberVo implements Serializable, Cloneable {
@ApiModelProperty(position = 1, value = "会员类型id", example = "0") @ApiModelProperty(position = 1, value = "会员类型id", example = "0")
private String memberId; private String memberId;
@ApiModelProperty(position = 2, value = "会员号", example = "0") @ApiModelProperty(position = 2, value = "会员号", example = "0")
private Integer memberNo; private String memberNo;
@ApiModelProperty(position = 3, value = "用户会员状态", example = "1") @ApiModelProperty(position = 3, value = "用户会员状态", example = "1")
private Integer state; private Integer state;
@ApiModelProperty(position = 4, value = "会员过期时间") @ApiModelProperty(position = 4, value = "会员过期时间")
...@@ -25,6 +27,8 @@ public class AdamUserMemberVo implements Serializable, Cloneable { ...@@ -25,6 +27,8 @@ public class AdamUserMemberVo implements Serializable, Cloneable {
private String createdAt; private String createdAt;
@ApiModelProperty(position = 6, value = "更新时间") @ApiModelProperty(position = 6, value = "更新时间")
private String updatedAt; private String updatedAt;
@ApiModelProperty(position = 7, value = "会员用户id")
private String memberUserId;
private static final AdamUserMemberVo obj = new AdamUserMemberVo(); private static final AdamUserMemberVo obj = new AdamUserMemberVo();
......
package com.liquidnet.service.adam.service; package com.liquidnet.service.adam.service;
import com.baomidou.mybatisplus.extension.service.IService; 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.AdamMemberOrderCodeParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderParam; import com.liquidnet.service.adam.dto.AdamMemberOrderParam;
import com.liquidnet.service.adam.dto.AdamMemberOrderResult; import com.liquidnet.service.adam.dto.AdamMemberOrderResult;
...@@ -32,4 +33,11 @@ public interface IAdamMemberOrderService extends IService<AdamMemberOrder> { ...@@ -32,4 +33,11 @@ public interface IAdamMemberOrderService extends IService<AdamMemberOrder> {
* @return * @return
*/ */
AdamMemberOrderVo getMemberOrderInfo(String orderNo); AdamMemberOrderVo getMemberOrderInfo(String orderNo);
/**
* 支付回调
* @return
*/
boolean memberNotifyCallBack(AdamMemberOrderCallbackResult result);
} }
package com.liquidnet.service.adam.service; package com.liquidnet.service.adam.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.liquidnet.service.adam.dto.vo.AdamUserMemberVo;
import com.liquidnet.service.adam.entity.AdamUserMember; import com.liquidnet.service.adam.entity.AdamUserMember;
/** /**
...@@ -10,4 +11,21 @@ public interface IAdamUserMemberService extends IService<AdamUserMember> { ...@@ -10,4 +11,21 @@ public interface IAdamUserMemberService extends IService<AdamUserMember> {
void createUserMemberInfo(String memberId); void createUserMemberInfo(String memberId);
String getMaxMemberNo(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 { ...@@ -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 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:"; // public static final String USER_CONFIRM_SMS_CODE_KEY = ADAM + ":user:sms_confirm:";
// //
......
...@@ -2,6 +2,9 @@ package com.liquidnet.service.adam.controller; ...@@ -2,6 +2,9 @@ package com.liquidnet.service.adam.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport; 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.ErrorMapping;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo; import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
...@@ -11,6 +14,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -11,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; 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.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -23,6 +27,8 @@ public class AdamMemberController { ...@@ -23,6 +27,8 @@ public class AdamMemberController {
@Autowired @Autowired
IAdamMemberService adamMemberService; IAdamMemberService adamMemberService;
@Autowired
IAdamMemberOrderService adamMemberOrderService;
@ApiOperationSupport(order = 0) @ApiOperationSupport(order = 0)
@ApiOperation(value = "会员信息") @ApiOperation(value = "会员信息")
...@@ -31,4 +37,18 @@ public class AdamMemberController { ...@@ -31,4 +37,18 @@ public class AdamMemberController {
AdamMemberVo info = adamMemberService.queryMemberInfo(); AdamMemberVo info = adamMemberService.queryMemberInfo();
return ResponseDto.success(info); 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 ...@@ -62,7 +62,7 @@ public class AdamMemberServiceImpl extends ServiceImpl<AdamMemberMapper, AdamMem
memberPrice = mongoTemplate.find(Query.query(Criteria.where("memberId").is(memberId)), memberPrice = mongoTemplate.find(Query.query(Criteria.where("memberId").is(memberId)),
AdamMemberPriceVo.class, AdamMemberPriceVo.class.getSimpleName()); AdamMemberPriceVo.class, AdamMemberPriceVo.class.getSimpleName());
} }
if (memberPrice.size() > 0) { if (null != info && memberPrice.size() > 0) {
info.setAdamMemberPrice(memberPrice); info.setAdamMemberPrice(memberPrice);
} }
return info; return info;
......
...@@ -3,6 +3,8 @@ package com.liquidnet.service.adam.service.impl; ...@@ -3,6 +3,8 @@ package com.liquidnet.service.adam.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.service.adam.constant.AdamRedisConst; 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.entity.AdamUserMember;
import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper; import com.liquidnet.service.adam.mapper.AdamMemberCodeMapper;
import com.liquidnet.service.adam.mapper.AdamUserMemberMapper; import com.liquidnet.service.adam.mapper.AdamUserMemberMapper;
...@@ -12,6 +14,8 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate; ...@@ -12,6 +14,8 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter; 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 org.springframework.stereotype.Service;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -47,7 +51,7 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper, ...@@ -47,7 +51,7 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper,
String memberNoMaxKey = AdamRedisConst.MEMBER_MEMBER_NO_MAX_KEY.concat(memberId); String memberNoMaxKey = AdamRedisConst.MEMBER_MEMBER_NO_MAX_KEY.concat(memberId);
Object maxNumber = redisUtil.get(memberNoMaxKey); Object maxNumber = redisUtil.get(memberNoMaxKey);
if (null !=maxNumber) { if (null != maxNumber) {
maxNumber = maxNumber.toString(); maxNumber = maxNumber.toString();
String newNumber = String.valueOf(redisUtil.incr(memberNoMaxKey, 1)); String newNumber = String.valueOf(redisUtil.incr(memberNoMaxKey, 1));
Integer newNumberInt = newNumber.length() - 1; Integer newNumberInt = newNumber.length() - 1;
...@@ -65,4 +69,47 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper, ...@@ -65,4 +69,47 @@ public class AdamUserMemberServiceImpl extends ServiceImpl<AdamUserMemberMapper,
return redisUtil.get(memberNoMaxKey).toString(); 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 ...@@ -68,9 +68,7 @@ public class AdamMemberPriceServiceImpl extends ServiceImpl<AdamMemberPriceMappe
mongoTemplate.insert(vo, AdamMemberPriceVo.class.getSimpleName()); mongoTemplate.insert(vo, AdamMemberPriceVo.class.getSimpleName());
// redis // redis
Map<String, Object> redisMap = new HashMap<>(); redisUtil.hset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), vo.getMemberPriceId(), vo);
redisMap.put(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberPriceId()), vo);
redisUtil.hmset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), redisMap);
} }
@Override @Override
...@@ -96,9 +94,7 @@ public class AdamMemberPriceServiceImpl extends ServiceImpl<AdamMemberPriceMappe ...@@ -96,9 +94,7 @@ public class AdamMemberPriceServiceImpl extends ServiceImpl<AdamMemberPriceMappe
new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER) new FindOneAndUpdateOptions().returnDocument(ReturnDocument.AFTER)
); );
// reids // reids
Map<String, Object> redisMap = new HashMap<>(); redisUtil.hset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), info.getMemberPriceId(), info);
redisMap.put(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberPriceId()), info);
redisUtil.hmset(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(info.getMemberId()), redisMap);
} catch (Exception e){ } catch (Exception e){
return false; 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