记得上下班打卡 | 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);
}
} }
package com.liquidnet.service.adam.service.impl; 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.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.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.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;
import com.liquidnet.service.adam.dto.vo.AdamMemberOrderVo; import com.liquidnet.service.adam.dto.vo.*;
import com.liquidnet.service.adam.dto.vo.AdamMemberPriceVo;
import com.liquidnet.service.adam.dto.vo.AdamMemberVo;
import com.liquidnet.service.adam.entity.AdamMemberOrder; 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.AdamMemberOrderMapper;
import com.liquidnet.service.adam.mapper.AdamMemberPriceMapper; import com.liquidnet.service.adam.mapper.AdamMemberPriceMapper;
import com.liquidnet.service.adam.service.IAdamMemberOrderService; import com.liquidnet.service.adam.service.IAdamMemberOrderService;
import com.liquidnet.service.adam.service.IAdamMemberService; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate; 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 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 @Slf4j
@Service @Service
...@@ -31,6 +50,10 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe ...@@ -31,6 +50,10 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
@Autowired @Autowired
AdamMemberPriceMapper adamMemberPriceMapper; AdamMemberPriceMapper adamMemberPriceMapper;
@Autowired @Autowired
IAdamUserMemberService adamUserMemberService;
@Autowired
IAdamMemberPriceService adamMemberPriceService;
@Autowired
MongoTemplate mongoTemplate; MongoTemplate mongoTemplate;
@Autowired @Autowired
MongoConverter mongoConverter; MongoConverter mongoConverter;
...@@ -43,42 +66,101 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe ...@@ -43,42 +66,101 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
@Override @Override
public AdamMemberOrderResult buyMemberOrMemberCode(AdamMemberOrderParam param) throws Exception { public AdamMemberOrderResult buyMemberOrMemberCode(AdamMemberOrderParam param) throws Exception {
String memberId = param.getMemberId();
String memberPriceId = param.getMemberPriceId();
AdamMemberOrderResult result = new AdamMemberOrderResult(); AdamMemberOrderResult result = new AdamMemberOrderResult();
// 判断黑名单,待定(暂不做) // 判断黑名单,待定(暂不做)
// 验证会员是否有效 // 验证会员是否有效
AdamMemberVo adamMemberVo = adamMemberService.queryMemberInfo(); AdamMemberVo adamMemberVo = adamMemberService.queryMemberInfo();
if (adamMemberVo.getMemberId() != param.getMemberId()) { if (adamMemberVo.getMemberId() != memberId) {
result.setState(0); result.setState(0);
return result; return result;
} }
// 验证价格是否有效 // 验证价格是否有效
List<AdamMemberPriceVo> adamMemberPrice = adamMemberVo.getAdamMemberPrice(); List<AdamMemberPriceVo> adamMemberPrice = adamMemberVo.getAdamMemberPrice();
AdamMemberPriceVo priceVo = null;
for (int i = 0; i < adamMemberPrice.size(); i++) { for (int i = 0; i < adamMemberPrice.size(); i++) {
AdamMemberPriceVo adamMemberPriceVo = adamMemberPrice.get(i); AdamMemberPriceVo adamMemberPriceVo = adamMemberPrice.get(i);
if (adamMemberPriceVo.getMemberPriceId().equals(param.getMemberPriceId())) { 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(); 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) { switch (buyType) {
case 0: case 0:
a = "1"; payParam.add("detail", "正在现场 - 购买会员");
payResult = this.callPayServer(param.getPayChannel(), payParam);
result.setOrderId(payResult.get("order_id"));
break; break;
case 1: case 1:
a = "2"; payParam.add("detail", "正在现场 - 购买会员码");
break; payResult = this.callPayServer(param.getPayChannel(), payParam);
default: result.setOrderId(payResult.get("order_id"));
a = "3";
break; break;
} }
result.setPayObject(payResult);
return result; return result;
} }
...@@ -96,25 +178,170 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe ...@@ -96,25 +178,170 @@ public class AdamMemberOrderServiceImpl extends ServiceImpl<AdamMemberOrderMappe
} }
/** /**
* 购买会员 * 调用支付中心接口,获取支付信息
* *
* @param payType 支付类型
* @param payParam 支付参数
* @return * @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; 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 * @return
*/ */
private Object buyMemberCode() { private AdamMemberCodeVo getAdamMemberCodeVo(AdamMemberOrderVo orderVo, String orderCode, int type, String currentDateTime) {
return null; AdamMemberCodeVo codeVo = new AdamMemberCodeVo();
} codeVo.setMemberId(orderVo.getMemberId());
codeVo.setMemberPriceId(orderVo.getMemberPriceId());
@Override codeVo.setBuyAt(currentDateTime);
public AdamMemberOrderVo getMemberOrderInfo(String orderNo) { codeVo.setBuyOrderNo(orderCode);
return null; 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 ...@@ -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