@@ -22,6 +22,7 @@ import com.iformall.service.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.RedisTemplate;
@@ -39,11 +40,13 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker;
import com.iformall.common.IdWorker;
import com.iformall.common.ResultData;
import com.iformall.common.ResultData;
import com.iformall.domain.dto.OrderComposeSaveDto;
import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCardInfo;
import com.iformall.domain.po.WxCardInfo;
import com.iformall.domain.po.WxComposeOrder;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxCouponMerchant;
import com.iformall.domain.po.WxCouponMerchant;
@@ -65,6 +68,7 @@ import com.iformall.mapper.WxAppinfoMapper;
import com.iformall.mapper.WxCUserBasicInfoMapper;
import com.iformall.mapper.WxCUserBasicInfoMapper;
import com.iformall.mapper.WxCUserMapper;
import com.iformall.mapper.WxCUserMapper;
import com.iformall.mapper.WxCardInfoMapper;
import com.iformall.mapper.WxCardInfoMapper;
import com.iformall.mapper.WxComposeOrderMapper;
import com.iformall.mapper.WxCouponChannelMapper;
import com.iformall.mapper.WxCouponChannelMapper;
import com.iformall.mapper.WxCouponMapper;
import com.iformall.mapper.WxCouponMapper;
import com.iformall.mapper.WxCouponMerchantMapper;
import com.iformall.mapper.WxCouponMerchantMapper;
@@ -191,11 +195,14 @@ public class WxOrderServiceImpl implements WxOrderService {
@Autowired
@Autowired
WxCouponChannelService wxCouponChannelService;
WxCouponChannelService wxCouponChannelService;
@Autowired
WxComposeOrderMapper wxComposeOrderMapper;
@Autowired
@Autowired
@Qualifier("couponDetailRedisTemplate")
@Qualifier("couponDetailRedisTemplate")
RedisTemplate<String, WxCouponCVo> cdRedisTemplate;
RedisTemplate<String, WxCouponCVo> cdRedisTemplate;
@Override
@Override
public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) {
public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record));
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record));
@@ -346,8 +353,8 @@ public class WxOrderServiceImpl implements WxOrderService {
orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
return wxOrderMapper.countList(orderQ);
return wxOrderMapper.countList(orderQ);
} catch (Exception e) {
} catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e );
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询拼团中订单错误."+e.getMessage() );
}
}
}
}
@@ -376,8 +383,8 @@ public class WxOrderServiceImpl implements WxOrderService {
orderQ.setStatusS(statusS);
orderQ.setStatusS(statusS);
return wxOrderMapper.countList(orderQ);
return wxOrderMapper.countList(orderQ);
} catch (Exception e) {
} catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e );
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询待支付错误."+e.getMessage() );
}
}
}
}
@@ -477,8 +484,8 @@ public class WxOrderServiceImpl implements WxOrderService {
// }
// }
return wxCouponOrderMapper.findCount(couponOrderQ);
return wxCouponOrderMapper.findCount(couponOrderQ);
} catch (Exception e) {
} catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e );
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询待使用订单错误." );
}
}
}
}
@@ -564,7 +571,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param coupon
* @param coupon
* @param couponIdStr
* @param couponIdStr
*/
*/
private void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr,int number) {
//如果缓存中不存在这个key,则从coupon中取
//如果缓存中不存在这个key,则从coupon中取
if(!redisLock.hasCouponStockCache(coupon.getId())) {
if(!redisLock.hasCouponStockCache(coupon.getId())) {
//此处需要加锁,防止并发设置
//此处需要加锁,防止并发设置
@@ -595,11 +603,11 @@ public class WxOrderServiceImpl implements WxOrderService {
long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr));
long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr));
if (redisStock<=0) {
if (redisStock<=0) {
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+couponIdStr);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+coupon.getTitle()+"["+coupon IdStr+"]" );
}
}
// 检查 优惠券 库存
// 检查 优惠券 库存
if (coupon.getRemainInventory() <= 0) {
if (coupon.getRemainInventory() <= 0) {
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY);
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(),coupon.getTitle()+"["+couponIdStr+"]库存不足" );
}
}
int count = 0;
int count = 0;
@@ -609,42 +617,42 @@ public class WxOrderServiceImpl implements WxOrderService {
try {
try {
count = getUserOrderCount(user, coupon);
count = getUserOrderCount(user, coupon);
} catch (Exception e) {
} catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询未支付订单失败." );
}
}
if (count > 0) {
if (count > 0) {
logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count);
logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_UNPAID);
throw new MallinkException(ErrorCode.ORDER_UNPAID.getCode(),"["+coupon.getTitle()+"]您有未支付的订单." );
}
}
}
}
//检查拼团中的数量
//检查拼团中的数量
try {
try {
count = getUserOrderGroupCount(user, coupon);
count = getUserOrderGroupCount(user, coupon);
} catch (Exception e) {
} catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询拼团中订单错误." );
}
}
if (count >= coupon.getUseLimitQuantity()) {
if (count >= coupon.getUseLimitQuantity()) {
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"["+coupon.getTitle()+"]购买超限." );
}
}
// 检查用户已购买数量
// 检查用户已购买数量
try {
try {
count = getUserCouponOrderCount(user, coupon);
count = getUserCouponOrderCount(user, coupon);
} catch (Exception e) {
} catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询待使用订单错误." );
}
}
if (count >= coupon.getUseLimitQuantity()) {
if (count >= coupon.getUseLimitQuantity()) {
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限["+coupon.getTitle()+"] , couponId: " + couponIdStr + ", count: " + count);
}
}
try {
try {
//减库存,从redis中取,然后发mq消息同步到数据库
wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), 1 );
//减库存,
wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), number );
long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1 );
long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), number );
if (stock < 0 ) {
if (stock < 0 ) {
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!");
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"] 库存已为零!");
}
}
@@ -656,7 +664,7 @@ public class WxOrderServiceImpl implements WxOrderService {
// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId());
// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId());
} catch (RuntimeException e) {
} catch (RuntimeException e) {
logger.error("此券减库存失败, couponId: " + couponIdStr,e);
logger.error("此券减库存失败, couponId: " + couponIdStr,e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存更新失败!"+ e.getMessage());
}
}
}
}
@@ -966,7 +974,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param order
* @param order
* @param coupon
* @param coupon
*/
*/
private WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay,Long merchantId,Long bUserId) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay,Long merchantId,Long bUserId) {
Date curr = new Date();
Date curr = new Date();
Date valid_date = null;
Date valid_date = null;
int limit_days = Constant.WX_LIMIT_DAYS;
int limit_days = Constant.WX_LIMIT_DAYS;
@@ -1269,7 +1278,7 @@ public class WxOrderServiceImpl implements WxOrderService {
} else {
} else {
// 减库存操作
// 减库存操作
try {
try {
stockReduce(user, coupon, couponIdStr);
stockReduce(user, coupon, couponIdStr,1 );
}catch(Exception e) {
}catch(Exception e) {
throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage());
throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage());
}
}
@@ -1958,74 +1967,119 @@ public class WxOrderServiceImpl implements WxOrderService {
@Qualifier("cUserBasicInfoRedisTemplate")
@Qualifier("cUserBasicInfoRedisTemplate")
RedisTemplate<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate;
RedisTemplate<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate;
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Override
@Override
public WxOrder saveOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress,EnumPayWay payWay) {
WxOrder order = null;
// 防止同一用户重复抽奖(一分钟内)
// 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms
// 2. 如果存在,说明该用户正在下单,返回异常提示
// 3. 方法结束时清除 key
if (checkCouponIsFree(coupon)) {
// 免费券
String key = StringUtils.join("action", ":", user.getId(), coupon.getId());
boolean hasKey = cUserBasicInfoRedisTemplate.hasKey(key);
if (hasKey) {
logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user));
throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION);
}
cUserBasicInfoRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS);
order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,payWay);
if (order != null) {
// 6. 下订单完成,发送内部消息
// 下订单完成,发送内部消息
try {
sendOrderSuccessActionMsg(order);
} catch (Exception e) {
logger.error("内部消息发送失败: " + e.getMessage());
throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR);
public WxComposeOrder saveOrderForCoupon(WxCUserBasicInfo user,List<OrderComposeSaveDto> orderSave,EnumPayWay payWay) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
// 防止同一用户重复下单,1秒内
String key = new StringBuilder().append("saveorder:").append(user.getId()).toString();
boolean hasKey = cUserBasicInfoRedisTemplate.hasKey(key);
if (hasKey) {
logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user));
throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION);
}
cUserBasicInfoRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS);
WxComposeOrder composeOrder = createWxComposeOrder(user, orderSave, payWay);
for (int i = 0 ; i < orderSave.size(); i ++) {
OrderComposeSaveDto orderdto = orderSave.get(i);
// 是否砍价
boolean isPress = orderdto.getSignleOrder().getPress() != null ? orderdto.getSignleOrder().getPress() : false;
WxOrder order = null;
if (checkCouponIsFree(orderdto.getWxCoupon())) {
// 免费券
order = proxy.saveFreeOrderForCoupon(composeOrder,user, orderdto.getWxCoupon(),orderdto.getCount(), orderdto.getSignleOrder().getCouponChannelId(), orderdto.getSignleOrder().getFormId(), null,payWay);
if (order != null) {
// 6. 下订单完成,发送内部消息
// 下订单完成,发送内部消息
try {
proxy.sendOrderSuccessActionMsg(order);
} catch (Exception e) {
logger.error("内部消息发送失败: " + e.getMessage(),e);
throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR);
}
}
}
} else {
// 有价券
order = proxy.saveNoFreeOrderForCoupon(composeOrder,user, orderdto.getWxCoupon(),orderdto.getCount(), orderdto.getSignleOrder().getCouponChannelId(), isPress, orderdto.getSignleOrder().getOrderGroupId(), orderdto.getSignleOrder().getFormId());
}
}
} else {
// 有价券
order = saveNoFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), isPress, orderSaveDto.getOrderGroupId(), orderSaveDto.getFormId());
// couponActionLog
// try {
// wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderdto.getSignleOrder().getCouponChannelId(),0L);
// } catch (Exception e) {
// // 库存恢复
// stockBack(order);
// logger.error("保存订单:" + e.getMessage());
// throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
// }
}
return composeOrder;
}
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxComposeOrder createWxComposeOrder(WxCUserBasicInfo user,List<OrderComposeSaveDto> orderSave,EnumPayWay payWay) {
WxComposeOrder order =new WxComposeOrder();
final IdWorker idWorker = IdWorker.get();
order.setId(idWorker.nextId());
order.setCUserId(user.getId());
order.setPaymentType(EnumPayType.PAY_PAYMENT.getCode());
int payment = 0;
for (OrderComposeSaveDto ocsd : orderSave) {
boolean isPress = ocsd.getSignleOrder().getPress() != null ? ocsd.getSignleOrder().getPress() : false;
payment = payment+getCouponPayment(ocsd.getWxCoupon(), isPress, ocsd.getSignleOrder().getOrderGroupId(),ocsd.getCount());
}
order.setPayment(payment);
if (payment > 0 ) {
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode());
}else {
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode());
}
order.setCreateDate(new Date());
wxComposeOrderMapper.insert(order);
return order;
}
private int getCouponPayment(WxCoupon coupon,boolean isPress,Long orderGroupId,int couponNumber) {
// 4.1 券价格
int payment = coupon.getSalePrice()*couponNumber;
//Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode();
if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) {
// 砍价券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
}
}
// couponActionLog
try {
wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderSaveDto.getCouponChannelId(),0L);
} catch (Exception e) {
// 库存恢复
stockBack(order);
logger.error("保存订单:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (orderGroupId == null) {
// 拼团券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
} else {
//orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode();
}
}
}
return order;
return payment ;
}
}
@Override
@Override
public boolean checkCouponIsFree(WxCoupon coupon) {
public boolean checkCouponIsFree(WxCoupon coupon) {
return coupon.getSalePrice() == 0;
return coupon.getSalePrice() == 0;
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxOrder saveFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) {
// 1. check user info and coupon info
userCouponMerchantCheck(user, coupon);
if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付
if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH);
}
}
// 2. 减库存操作
@Override
public WxOrder saveFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
// 减库存操作
String couponIdStr = String.valueOf(coupon.getId());
String couponIdStr = String.valueOf(coupon.getId());
stockReduce(user, coupon, couponIdStr);
proxy.stockReduce(user, coupon, couponIdStr,couponNumber);
// 3. 当积分券或者积分停车券时 则进行积分支付
// 当积分券或者积分停车券时 则进行积分支付
Integer orderType;
Integer orderType;
if (coupon.checkIsCreditCoupon()) {
if (coupon.checkIsCreditCoupon()) {
creditPay(user, coupon);
proxy. creditPay(user, coupon);
orderType = EnumOrderType.CREDIT.getCode();
orderType = EnumOrderType.CREDIT.getCode();
} else {
} else {
orderType = EnumOrderType.COUPON.getCode();
orderType = EnumOrderType.COUPON.getCode();
@@ -2040,28 +2094,96 @@ public class WxOrderServiceImpl implements WxOrderService {
record.setPayment(0);
record.setPayment(0);
record.setFormId(formId);
record.setFormId(formId);
record.setOrderGroupId(0L);
record.setOrderGroupId(0L);
if (null != composeOrder) {
record.setComposeOrderId(composeOrder.getId());
}
try {
try {
saveFreeOrder(record, user, coupon);
proxy. saveFreeOrder(record, user, coupon);
} catch (Exception e) {
} catch (Exception e) {
logger.error("下订单:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
logger.error("下订单错误 :" + e.getMessage(),e );
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]保存订单错误."+e.getMessage() );
}
}
// 5. 创建couponOrder
// 5. 创建couponOrder
try {
try {
createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null);
proxy. createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null);
} catch (Exception e) {
} catch (Exception e) {
logger.error("couponOrder失败:" + e.getMessage(),e);
logger.error("couponOrder失败:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]保存券订单错误."+e.getMessage() );
}
}
return record;
return record;
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxOrder saveNoFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, boolean isPress, Long orderGroupId, String formId) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
String couponIdStr = String.valueOf(coupon.getId());
// 3. 减库存操作
proxy.stockReduce(user, coupon, couponIdStr,couponNumber);
// 3. 当积分券或者积分停车券时 则进行积分支付
Integer orderType;
if (coupon.checkIsCreditCoupon()) {
proxy.creditPay(user, coupon);
orderType = EnumOrderType.CREDIT.getCode();
} else {
orderType = EnumOrderType.COUPON.getCode();
}
// 4. 保存订单
Long orderNumber;
// 4.1 券价格
int payment = coupon.getSalePrice()*couponNumber;
Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode();
if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) {
// 砍价券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
}
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (orderGroupId == null) {
// 拼团券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
} else {
orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode();
}
}
// 4.2 保存订单
WxOrder record = new WxOrder();
record.setType(orderType);
record.setCouponChannelId(couponChannelId);
record.setOrderGroupId(orderGroupId);
record.setFormId(formId);
record.setPayment(payment);
record.setOrderStatus(orderStatus);
if (null != composeOrder) {
record.setComposeOrderId(composeOrder.getId());
}
try {
orderNumber = proxy.saveNoFreeOrder(record, user, coupon, isPress);
} catch (Exception e) {
logger.error("保存订单:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]订单保存错误,"+e.getMessage());
}
if (isPress) {
// 5. 第一次砍价
try {
proxy.firstPress(record, user, coupon, orderNumber);
} catch (Exception e) {
logger.error("第一次砍价失败:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]第一次砍价错误,"+e.getMessage());
}
}
return record;
}
@Override
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) {
public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) {
// 1. check user info and coupon info
// 1. check user info and coupon info
userCouponMerchantCheck(user, coupon);
userCouponMerchantCheck(user, coupon,"此券" );
if (coupon.checkIsCreditCoupon()) {
if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付
//若用户剩余积分比积分售价低则不能支付
if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
@@ -2070,7 +2192,7 @@ public class WxOrderServiceImpl implements WxOrderService {
}
}
// 2. 减库存操作
// 2. 减库存操作
String couponIdStr = String.valueOf(coupon.getId());
String couponIdStr = String.valueOf(coupon.getId());
stockReduce(user, coupon, couponIdStr);
stockReduce(user, coupon, couponIdStr,1 );
// 3. 当积分券或者积分停车券时 则进行积分支付
// 3. 当积分券或者积分停车券时 则进行积分支付
Integer orderType;
Integer orderType;
@@ -2114,7 +2236,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param user
* @param user
* @param coupon
* @param coupon
*/
*/
private void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) {
Date curr = new Date();
Date curr = new Date();
// body
// body
String bodyStr = "";
String bodyStr = "";
@@ -2140,35 +2263,26 @@ public class WxOrderServiceImpl implements WxOrderService {
wxOrderMapper.insert(record);
wxOrderMapper.insert(record);
}
}
private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon) throws MallinkException {
// 检查用户
if (user == null) {
logger.error("用户不存在");
throw new MallinkException(ErrorCode.USER_IS_EMPTY);
}
private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon,String premsg) throws MallinkException {
// 检查券
// 检查券
if (coupon == null) {
if (coupon == null) {
logger.error("券不存在");
logger.error("券不存在");
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY);
}
// 检查券状态
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
logger.error("券已下架, couponId: " + coupon.getId());
throw new MallinkException(ErrorCode.COUPON_ORDER_IS_INVALID);
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"不存在");
}
}
// 检查券商户信息
// 检查券商户信息
if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) {
if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) {
logger.error("商户不存在, couponId: " + coupon.getId());
logger.error("商户不存在, couponId: " + coupon.getId());
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND);
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND.getCode(),premsg+"【"+coupon.getTitle()+"】商户信息没找到");
}
}
// 检查 优惠券 库存
// 检查 优惠券 库存
if (coupon.getRemainInventory() <= 0) {
if (coupon.getRemainInventory() <= 0) {
logger.error("此券库存为0, couponId: " + coupon.getId());
logger.error("此券库存为0, couponId: " + coupon.getId());
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY);
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(),premsg+"【"+coupon.getTitle()+"】库存不足" );
}
}
}
}
private void creditPay(WxCUserBasicInfo user, WxCoupon coupon) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void creditPay(WxCUserBasicInfo user, WxCoupon coupon) {
//-------此处为【积分支付】记录增加积分操作-------
//-------此处为【积分支付】记录增加积分操作-------
WxCreditHistory creditHistory = new WxCreditHistory();
WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setCreditNum(coupon.getCreditPrice());
creditHistory.setCreditNum(coupon.getCreditPrice());
@@ -2195,79 +2309,7 @@ public class WxOrderServiceImpl implements WxOrderService {
wxCreditHistoryService.saveOrUpdate(creditHistory,coupon.getTenantId());
wxCreditHistoryService.saveOrUpdate(creditHistory,coupon.getTenantId());
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxOrder saveNoFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId) {
// 1. check user info and coupon info
userCouponMerchantCheck(user, coupon);
if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付
if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH);
}
}
// 2. 拼团检查
if (isOrderGroup(orderGroupId)) {
checkOrderGroup(user, orderGroupId,coupon);
}
String couponIdStr = String.valueOf(coupon.getId());
// 3. 减库存操作
stockReduce(user, coupon, couponIdStr);
// 3. 当积分券或者积分停车券时 则进行积分支付
Integer orderType;
if (coupon.checkIsCreditCoupon()) {
creditPay(user, coupon);
orderType = EnumOrderType.CREDIT.getCode();
} else {
orderType = EnumOrderType.COUPON.getCode();
}
// 4. 保存订单
Long orderNumber;
// 4.1 券价格
int payment = coupon.getSalePrice();
Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode();
if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) {
// 砍价券 初始是全价即面额
payment = coupon.getPrice();
}
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (orderGroupId == null) {
// 拼团券 初始是全价即面额
payment = coupon.getPrice();
} else {
orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode();
}
}
// 4.2 保存订单
WxOrder record = new WxOrder();
record.setType(orderType);
record.setCouponChannelId(couponChannelId);
record.setOrderGroupId(orderGroupId);
record.setFormId(formId);
record.setPayment(payment);
record.setOrderStatus(orderStatus);
try {
orderNumber = saveNoFreeOrder(record, user, coupon, isPress);
} catch (Exception e) {
logger.error("保存订单:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
}
if (isPress) {
// 5. 第一次砍价
try {
firstPress(record, user, coupon, orderNumber);
} catch (Exception e) {
logger.error("第一次砍价失败:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
}
}
return record;
}
/**
/**
* 初始砍价
* 初始砍价
@@ -2277,7 +2319,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param coupon
* @param coupon
* @param orderNumber
* @param orderNumber
*/
*/
private void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) {
// 保存砍价信息
// 保存砍价信息
int total = coupon.getPrice() - coupon.getSalePrice();
int total = coupon.getPrice() - coupon.getSalePrice();
int left_total = total;
int left_total = total;
@@ -2302,7 +2345,8 @@ public class WxOrderServiceImpl implements WxOrderService {
wxOrderMapper.updateById(orderUpdatePress);
wxOrderMapper.updateById(orderUpdatePress);
}
}
private Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) {
Long orderNumber;
Long orderNumber;
Date curr = new Date();
Date curr = new Date();
@@ -2341,21 +2385,21 @@ public class WxOrderServiceImpl implements WxOrderService {
return orderNumber;
return orderNumber;
}
}
private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon) {
private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon,String premsg ) {
WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId());
WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId());
if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) {
if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) {
logger.error("下订单拼团人数已满>>>" + orderGroupId);
logger.error("下订单拼团人数已满>>>" + orderGroupId);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+"【"+coupon.getTitle()+"】拼团人数已满" );
}
}
if (group.getRemainPeople()<=0) {
if (group.getRemainPeople()<=0) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满");
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+ "【"+coupon.getTitle()+"】 下单人数已满");
}
}
//判断拼团人数是否已经超出限制
//判断拼团人数是否已经超出限制
int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId());
int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId());
if (groupCount>=coupon.getPressLimitNum()) {
if (groupCount>=coupon.getPressLimitNum()) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!");
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+ "【"+coupon.getTitle()+"】 下单人数超出优惠券人数限制!");
}
}
WxOrder order = new WxOrder();
WxOrder order = new WxOrder();
@@ -2365,7 +2409,7 @@ public class WxOrderServiceImpl implements WxOrderService {
long count = wxOrderMapper.selectCount(new QueryWrapper(order));
long count = wxOrderMapper.selectCount(new QueryWrapper(order));
if (count > 0) {
if (count > 0) {
logger.error("重复的拼团>>>" + orderGroupId);
logger.error("重复的拼团>>>" + orderGroupId);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID.getCode(),premsg+"【"+coupon.getTitle()+"】您有未支付的拼团订单" );
}
}
}
}
@@ -2390,9 +2434,9 @@ public class WxOrderServiceImpl implements WxOrderService {
}
}
@Override
@Override
public int countUserCouponGroupOrder(Long cuserId , Long couponId,String tenantId) {
public int countUserCouponGroupOrder(WxCUserBasicInfo wxCUserBasicInfo , Long couponId,String tenantId) {
WxOrder query = new WxOrder();
WxOrder query = new WxOrder();
query.setCUserId(cuserId );
query.setCUserId(wxCUserBasicInfo.getId() );
query.setProductId(couponId);
query.setProductId(couponId);
List<Integer> statusS = new ArrayList<Integer>();
List<Integer> statusS = new ArrayList<Integer>();
statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
@@ -2404,37 +2448,84 @@ public class WxOrderServiceImpl implements WxOrderService {
@Override
@Override
public ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) {
public ResultData composeSaveOrder(List<OrderComposeSaveDto> composeOrderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) {
logger.info("composeOrderSave: " + composeOrderSaveDto);
//TODO 事务,所有券都购买成功才行
try {
if (null == composeOrderSaveDto || composeOrderSaveDto.size() <= 0 ) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"无商品信息");
}
WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId());
if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) {
logger.info("会员权益被锁定:cUserId:" + cUserId);
return new ResultData(ErrorCode.MEMBER_IS_LOCKED);
}
boolean singleProduct = false;
if (composeOrderSaveDto.size() == 1) {
singleProduct = true;
}
for ( int i =0 ; i< composeOrderSaveDto.size(); i++ ) {
OrderComposeSaveDto ocsd = composeOrderSaveDto.get(i);
singleOrderCheck(ocsd,ocsd.getSignleOrder(),ocsd.getCount(),wxCUserBasicInfo,payWay,tenantEntity,i+1,singleProduct);
}
try {
WxComposeOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, composeOrderSaveDto, payWay);
return new ResultData(order);
} catch (MallinkException e) {
logger.error("saveOrderForCoupon error.",e);
throw new MallinkException(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error("saveOrderForCoupon error.",e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), e.getMessage());
}
}catch(MallinkException me) {
return new ResultData(me.getErrorCode(),me.getMessage());
}catch(Exception e) {
logger.error("composeSaveOrder error.",e);
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage());
}
}
private void singleOrderCheck(OrderComposeSaveDto ocsd,OrderSaveDto orderSaveDto,int productCount,WxCUserBasicInfo wxCUserBasicInfo,EnumPayWay payWay,TenantEntity tenantEntity,int curindex,boolean singleProduct) {
logger.info("OrderSave: " + orderSaveDto);
logger.info("OrderSave: " + orderSaveDto);
String premsg = "";
if (singleProduct) {
premsg = "此券";
}else {
premsg = "第["+curindex+"]张券";
}
if (orderSaveDto.getCouponChannelId() == null) {
if (orderSaveDto.getCouponChannelId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), premsg+ "couponChannelId不能为空");
}
}
WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId());
WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId());
if (wxCouponChannel == null) {
if (wxCouponChannel == null) {
logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId());
logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF);
}
ResultData resultData = couponChannelCheck(orderSaveDto, wxCouponChannel);
if (resultData != null) return resultData;
WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId());
if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) {
logger.info("会员权益被锁定:cUserId:" + cUserId);
return new ResultData(ErrorCode.MEMBER_IS_LOCKED);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(),premsg+"投放渠道不存在");
}
}
couponChannelCheck(orderSaveDto, wxCouponChannel,premsg);
WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId());
WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId());
if (null == coupon) {
if (null == coupon) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"不存在");
}
}
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);
throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),premsg+"【"+coupon.getTitle()+"】已作废" );
}
}
ocsd.setWxCoupon(coupon);
//判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制
//判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
int ordercount = this.countUserCouponGroupOrder(cUserId,coupon.getId(),coupon.getTenantId());
if (ordercount>=coupon.getUseLimitQuantity()) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。");
int ordercount = this.countUserCouponGroupOrder(wxCUserBasicInfo ,coupon.getId(),coupon.getTenantId());
if (( ordercount+productCount) >=coupon.getUseLimitQuantity()) {
throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),premsg+"拼团券["+coupon.getTitle()+"]您 的有效拼团数量达到券的限购次数。");
}
}
}
}
@@ -2456,7 +2547,7 @@ public class WxOrderServiceImpl implements WxOrderService {
}
}
}
}
if (wxCouponCVo == null) {
if (wxCouponCVo == null) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY );
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"【"+coupon.getTitle()+"】未查询到详细信息." );
}
}
//此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。
//此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。
@@ -2480,81 +2571,81 @@ public class WxOrderServiceImpl implements WxOrderService {
}
}
}
}
resultData = couponUserCheck(wxCUserBasicInfo, wxCouponCVo);
if (resultData != null) return resultData;
couponUserCheck(wxCUserBasicInfo, wxCouponCVo,premsg);
Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId();
Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId();
if (couponId == null) {
if (couponId == null) {
logger.error("couponChannelId或者couponId不能为空");
logger.error("couponChannelId或者couponId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId或者couponId不能为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), premsg+ "couponChannelId或者couponId不能为空");
}
}
// 是否砍价
boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false;
try {
WxOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, coupon, orderSaveDto, isPress,payWay);
return new ResultData(order);
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage());
userCouponMerchantCheck(wxCUserBasicInfo, coupon,premsg);
if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付
if (wxCUserBasicInfo.getCredit() == null || wxCUserBasicInfo.getCredit() < coupon.getCreditPrice()) {
throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH.getCode(), premsg+"【"+coupon.getTitle()+"】积分不够扣减值");
}
}
}
if (!checkCouponIsFree(coupon)) {
// 有价,拼团检查
if (isOrderGroup(ocsd.getSignleOrder().getOrderGroupId())) {
checkOrderGroup(wxCUserBasicInfo, ocsd.getSignleOrder().getOrderGroupId(),coupon,premsg);
}
}
}
}
private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) {
private void couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel,String premsg ) {
if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
Date now = new Date();
Date now = new Date();
if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) {
if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) {
logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId());
logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】活动未开始" );
}
}
if (wxCouponChannel.getEndTime().getTime() < now.getTime()) {
if (wxCouponChannel.getEndTime().getTime() < now.getTime()) {
logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId());
logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END );
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_END.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】活动已结束" );
}
}
}
}
if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) {
if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) {
logger.error("此券已下架:" + orderSaveDto.getCouponChannelId());
logger.error("此券已下架:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF );
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】已下架" );
}
}
return null;
}
}
private ResultData couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon) {
if (coupon.getConditions() == null) return null ;
private void couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon,String premsg ) {
if (coupon.getConditions() == null) return ;
JSONObject jo = null;
JSONObject jo = null;
try {
try {
jo = JSONObject.parseObject(coupon.getConditions());
jo = JSONObject.parseObject(coupon.getConditions());
} catch (Exception e) {
} catch (Exception e) {
logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage());
logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage(),e );
}
}
if (jo != null) {
if (jo != null) {
if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){
if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){
if (user != null && user.getActRecord() > 0)
if (user != null && user.getActRecord() > 0)
return new ResultData(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER );
throw new MallinkException(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER.getCode(),premsg+"【"+coupon.getTitle()+"】限新会员,您已经参加过新会员活动" );
if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0)
if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0)
return new ResultData(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER );
throw new MallinkException(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER.getCode(),premsg+"【"+coupon.getTitle()+"】限新会员,您已经不是新用户" );
}else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){
}else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){
int max = jo.getIntValue("max");
int max = jo.getIntValue("max");
int min = jo.getIntValue("min");
int min = jo.getIntValue("min");
if (max!=0 && min ==0 && user.getPoins() > max) {
if (max!=0 && min ==0 && user.getPoins() > max) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE );
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符" );
}
}
if (max==0 && min !=0 && user.getPoins() < min) {
if (max==0 && min !=0 && user.getPoins() < min) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE );
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符" );
}
}
if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) {
if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE );
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符" );
}
}
}
}
}
}
return null;
}
}
}
}