记得上下班打卡 | 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);
}
}
package com.liquidnet.service.adam.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.adam.constant.AdamMemberOrderConst;
import com.liquidnet.service.adam.constant.AdamRedisConst;
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;
import com.liquidnet.service.adam.dto.vo.AdamMemberOrderVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberPriceVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.dto.vo.*;
import com.liquidnet.service.adam.entity.AdamMemberOrder;
import com.liquidnet.service.adam.entity.AdamMemberPrice;
import com.liquidnet.service.adam.mapper.AdamMemberOrderMapper;
import com.liquidnet.service.adam.mapper.AdamMemberPriceMapper;
import com.liquidnet.service.adam.service.IAdamMemberOrderService;
import com.liquidnet.service.adam.service.IAdamMemberService;
import com.liquidnet.service.adam.service.IAdamUserMemberService;
import com.liquidnet.service.adam.service.admin.IAdamMemberPriceService;
import com.liquidnet.service.adam.util.MemberUtil;
import com.mongodb.BasicDBObject;
import lombok.extern.slf4j.Slf4j;
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 org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.List;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Slf4j
@Service
......@@ -31,6 +50,10 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
@Autowired
AdamMemberPriceMapper adamMemberPriceMapper;
@Autowired
IAdamUserMemberService adamUserMemberService;
@Autowired
IAdamMemberPriceService adamMemberPriceService;
@Autowired
MongoTemplate mongoTemplate;
@Autowired
MongoConverter mongoConverter;
......@@ -43,42 +66,101 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
@Override
public AdamMemberOrderResult buyMemberOrMemberCode(AdamMemberOrderParam param) throws Exception {
String memberId = param.getMemberId();
String memberPriceId = param.getMemberPriceId();
AdamMemberOrderResult result = new AdamMemberOrderResult();
// 判断黑名单,待定(暂不做)
// 验证会员是否有效
AdamMemberVo adamMemberVo = adamMemberService.queryMemberInfo();
if (adamMemberVo.getMemberId() != param.getMemberId()) {
if (adamMemberVo.getMemberId() != memberId) {
result.setState(0);
return result;
}
// 验证价格是否有效
List<AdamMemberPriceVo> adamMemberPrice = adamMemberVo.getAdamMemberPrice();
AdamMemberPriceVo priceVo = null;
for (int i = 0; i < adamMemberPrice.size(); i++) {
AdamMemberPriceVo adamMemberPriceVo = adamMemberPrice.get(i);
if (adamMemberPriceVo.getMemberPriceId().equals(param.getMemberPriceId())) {
priceVo = adamMemberPriceVo;
break;
}
}
// 获取会员编号
if (null == priceVo) {
result.setState(0);
return result;
}
String cardNumber = "";
// 查询用户是否是会员 获取会员编号
AdamUserMemberVo userMemberInfo = adamUserMemberService.getUserMemberInfo(param.getUid());
AdamMemberPriceVo memberPrice = (AdamMemberPriceVo) redisUtil.hget(AdamRedisConst.INFO_MEMBERS_PRICE_INFO.concat(memberId), memberPriceId);
if (null == memberPrice) {
memberPrice = (AdamMemberPriceVo) mongoTemplate.find(Query.query(Criteria.where("memberPriceId").is(memberPriceId)),
AdamMemberPriceVo.class, AdamMemberPriceVo.class.getSimpleName());
}
String createdAt = DateUtil.format(LocalDateTime.now(), DateUtil.Formatter.yyyyMMddHHmmss);
// 生成订单信息
AdamMemberOrderVo orderVo = new AdamMemberOrderVo();
String orderNo = IDGenerator.nextSnowId().toString().concat("V");
orderVo.setOrderNo(orderNo);
orderVo.setMemberNo(cardNumber);
orderVo.setMemberId(memberId);
orderVo.setBirthday(DateUtil.format(param.getBirthday(), DateUtil.Formatter.yyyyMMddHHmmss));
orderVo.setDays(memberPrice.getDays());
orderVo.setMemberPriceId(memberPriceId);
orderVo.setCreatedAt(createdAt);
orderVo.setMemberName(adamMemberVo.getName());
orderVo.setMode(param.getMode());
orderVo.setPayChannel(param.getPayChannel());
orderVo.setState(AdamMemberOrderConst.STATUS_UNPAID);
orderVo.setUid(param.getUid());
orderVo.setPrice(param.getPrice());
// todo 此处调用MQ通知mysql
// List<Object> mqList = new ArrayList<>();
mongoTemplate.insert(orderVo);
redisUtil.hset(AdamRedisConst.INFO_MEMBERS_ORDER_INFO.concat(param.getUid()), orderNo, orderVo);
// 创建订单
int buyType = param.getMode();
// 判断购买情况
// 调取对应支付接口
String a = "";
LinkedMultiValueMap<String, String> payParam = new LinkedMultiValueMap<>();
payParam.add("type", AdamMemberOrderConst.TYPE_VIP);
payParam.add("price", String.valueOf(priceVo.getPrice()));
payParam.add("name", orderVo.getMemberName());
payParam.add("order_code", orderVo.getOrderNo());
payParam.add("client_ip", param.getClientIp());
payParam.add("notify_url", "回调地址");
payParam.add("create_date", createdAt);
payParam.add("expire_time", AdamMemberOrderConst.TIME_LIMIT.toString());
if (null != param.getAuthCode()) {
payParam.add("auth_code", param.getAuthCode());
}
if (null != param.getOpenId()) {
payParam.add("open_id", param.getOpenId());
}
if (null != param.getProductId()) {
payParam.add("product_id", param.getProductId());
}
Map<String, String> payResult = null;
switch (buyType) {
case 0:
a = "1";
payParam.add("detail", "正在现场 - 购买会员");
payResult = this.callPayServer(param.getPayChannel(), payParam);
result.setOrderId(payResult.get("order_id"));
break;
case 1:
a = "2";
break;
default:
a = "3";
payParam.add("detail", "正在现场 - 购买会员码");
payResult = this.callPayServer(param.getPayChannel(), payParam);
result.setOrderId(payResult.get("order_id"));
break;
}
result.setPayObject(payResult);
return result;
}
......@@ -96,25 +178,170 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
}
/**
* 购买会员
* 调用支付中心接口,获取支付信息
*
* @param payType 支付类型
* @param payParam 支付参数
* @return
*/
private Object buyMember() {
private Map<String, String> callPayServer(String payType, LinkedMultiValueMap<String, String> payParam) {
String url = "http://testpay.zhengzai.tv";
switch (payType) {
case "APPALIPAY":
url += "/app/alipay";
break;
case "APPWEPAY":
url += "/app/wepay";
break;
case "WAPALIPAY":
url += "/wap/alipay";
break;
case "WAPWEPAY":
url += "/wap/wepay";
break;
case "JSWEPAY":
url += "/js/wepay";
break;
case "APPLETWEPAY":
url += "/applet/wepay";
break;
}
String json = HttpUtil.post(url, payParam);
HashMap<String, String> result = (HashMap<String, String>) JSONObject.parse(json);
return result;
}
@Override
public AdamMemberOrderVo getMemberOrderInfo(String orderNo) {
return null;
}
@Override
public boolean memberNotifyCallBack(AdamMemberOrderCallbackResult result) {
if (1 != result.getStatus() ||
result.getType() != AdamMemberOrderConst.TYPE_VIP ||
null == result.getOrderCode() ||
null == result.getCode()) {
return false;
}
AdamMemberOrderVo orderVo = mongoTemplate.findOne(Query.query(Criteria.where("orderNo").is(result.getOrderCode())), AdamMemberOrderVo.class, AdamMemberOrderVo.class.getSimpleName());
int state = orderVo.getState();
if (AdamMemberOrderConst.STATUS_PAID == state || AdamMemberOrderConst.STATUS_LATE == state) {
// 订单已经处理过
return false;
}
if (result.getPrice().compareTo(orderVo.getPrice()) != 0) {
// 金额不一致
return false;
}
String currentDateTime = DateUtil.getNowTime();
// 获取购买天数
AdamMemberPrice priceVo = adamMemberPriceService.query(orderVo.getMemberPriceId());
String cardNumber = "";
int day = priceVo.getDays();
try {
if (AdamMemberOrderConst.SUB_TYPE_BUY_VIP == orderVo.getMode()) { // 购买会员
mongoTemplate.findOne(Query.query(Criteria.where("").is("")), null, null);
AdamUserMemberVo userMemberInfo = adamUserMemberService.getUserMemberInfo(orderVo.getUid());
if (null == userMemberInfo) { // 创建会员
cardNumber = adamUserMemberService.getMaxMemberNo(orderVo.getMemberId());
AdamUserMemberVo createMemberUser = AdamUserMemberVo.getNew();
createMemberUser.setMemberUserId(IDGenerator.nextSnowId().toString());
createMemberUser.setMemberId(orderVo.getMemberId());
createMemberUser.setMemberNo(orderVo.getMemberNo());
createMemberUser.setState(AdamMemberOrderConst.STATE_VALID);
createMemberUser.setUid(orderVo.getUid());
createMemberUser.setCreatedAt(currentDateTime);
createMemberUser.setUpdatedAt(currentDateTime);
createMemberUser.setMemberNo(cardNumber);
Date expiryAt = DateUtil.getBeforeDayEnd(Calendar.getInstance(), day);
String expiryAtStr = DateUtil.format(expiryAt, DateUtil.Formatter.yyyyMMddHHmmss);
createMemberUser.setExpiryAt(expiryAtStr);
// todo vip card code 记录 自动创建并使用
AdamMemberCodeVo codeVo = this.getAdamMemberCodeVo(orderVo, result.getCode(), 0, currentDateTime);
codeVo.setState(1);
codeVo.setUseUid(orderVo.getUid());
codeVo.setUseOrderNo(orderVo.getMemberCode());
codeVo.setMemberNo(orderVo.getMemberNo());
codeVo.setUseAt(currentDateTime);
codeVo.setMemberCodeId(IDGenerator.nextSnowId().toString());
// 订单写入MongoDB和Redis中
mongoTemplate.insert(createMemberUser);
redisUtil.set(AdamRedisConst.INFO_MEMBERS_USER_INFO.concat(orderVo.getUid()), createMemberUser);
// 会员码使用记录
mongoTemplate.insert(codeVo);
redisUtil.hset(AdamRedisConst.INFO_MEMBERS_CODE_INFO.concat(codeVo.getBuyUid()), codeVo.getMemberCodeId(), codeVo);
// todo mq 发送数据到队列中
} else { // 续费
String currentExpiryAt = userMemberInfo.getExpiryAt();
Calendar calendar = Calendar.getInstance();
calendar.setTime(DateUtil.parse(currentExpiryAt, "yyyy-MM-dd HH:mm:ss"));
Date expiryAt = DateUtil.getBeforeDayEnd(calendar, day);
String expiryAtStr = DateUtil.format(expiryAt, DateUtil.Formatter.yyyyMMddHHmmss);
userMemberInfo.setExpiryAt(expiryAtStr);
BasicDBObject object = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(userMemberInfo)));
mongoTemplate.getCollection(AdamUserMemberVo.class.getSimpleName())
.updateOne(Query.query(Criteria.where("uid").is(userMemberInfo.getUid())).getQueryObject(), object);
redisUtil.set(AdamRedisConst.INFO_MEMBERS_USER_INFO.concat(orderVo.getUid()), userMemberInfo);
}
}
if (AdamMemberOrderConst.SUB_TYPE_BUY_VIP_CODE == orderVo.getMode()) { // 购买会员码
cardNumber = adamUserMemberService.getMaxMemberNo(orderVo.getMemberId());
AdamMemberCodeVo codeVo = this.getAdamMemberCodeVo(orderVo, result.getCode(), 0, currentDateTime);
codeVo.setState(0);
codeVo.setMemberNo(cardNumber);
mongoTemplate.insert(codeVo);
redisUtil.hset(AdamRedisConst.INFO_MEMBERS_CODE_INFO.concat(codeVo.getBuyUid()), codeVo.getMemberCodeId(), codeVo);
}
// 更新订单信息
orderVo.setPayChannel(result.getPaymentType());
orderVo.setPaymentAt(DateUtil.format(result.getPaymentAt(), DateUtil.Formatter.yyyyMMddHHmmss));
orderVo.setState(AdamMemberOrderConst.STATUS_PAID);
orderVo.setPayNo(result.getCode());
orderVo.setMemberNo(cardNumber); // 回调中给会员卡号 or 下单时给
BasicDBObject object = new BasicDBObject("$set", JSON.parse(JsonUtils.toJson(orderVo)));
mongoTemplate.getCollection(AdamMemberOrderVo.class.getSimpleName())
.updateOne(Query.query(Criteria.where("orderNo").is(orderVo.getOrderNo())).getQueryObject(), object);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 购买会员码
* 组装会员码对象
*
* @param orderVo 会员订单
* @param orderCode 订单号
* @param type 会员码类型
* @param currentDateTime 创建时间
* @return
*/
private Object buyMemberCode() {
return null;
}
@Override
public AdamMemberOrderVo getMemberOrderInfo(String orderNo) {
return null;
private AdamMemberCodeVo getAdamMemberCodeVo(AdamMemberOrderVo orderVo, String orderCode, int type, String currentDateTime) {
AdamMemberCodeVo codeVo = new AdamMemberCodeVo();
codeVo.setMemberId(orderVo.getMemberId());
codeVo.setMemberPriceId(orderVo.getMemberPriceId());
codeVo.setBuyAt(currentDateTime);
codeVo.setBuyOrderNo(orderCode);
codeVo.setType(AdamMemberOrderConst.TYPE_BUY);
codeVo.setMemberNo(orderVo.getMemberNo());
codeVo.setCode(MemberUtil.getMemberCode(type));
codeVo.setCreatedAt(currentDateTime);
codeVo.setUpdatedAt(currentDateTime);
return codeVo;
}
}
......@@ -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