Просмотр исходного кода

[储值卡][新增]:储值卡购买逻辑

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
5db9263bc7
4 измененных файлов: 111 добавлений и 10 удалений
  1. +1
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java
  2. +2
    -0
      mallinkService/src/main/java/com/iformall/common/ErrorCode.java
  3. +36
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumMerchantSubsidyStatus.java
  4. +72
    -9
      mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java

+ 1
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java Просмотреть файл

@@ -76,7 +76,7 @@ public class WxCardPayController extends BaseController {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "merchantCode转换失败");
}

// check if merchantId is in card support merchant
// TODO check if merchantId is in card support merchant

BigDecimal totalFee = new BigDecimal(totalFeeStr);
totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入)


+ 2
- 0
mallinkService/src/main/java/com/iformall/common/ErrorCode.java Просмотреть файл

@@ -92,6 +92,8 @@ public enum ErrorCode{
COUPON_SEND_IS_INVALID(2029, "此发券渠道不存在"),
COUPON_SEND_IS_INVALID_TIME(2030, "发放时间不能晚于使用时间"),

COUPON_MERCHANT_NOT_FOUND(2031, "卡券关联商户未发现"),


PUSH_LIMIT_UP_TO_1DAYLIMIT(2040, "此用户一天内发券到达疲劳度限制"),
PUSH_LIMIT_UP_TO_COUPONLIMIT(2041, "此用户发此券到达疲劳度限制"),


+ 36
- 0
mallinkService/src/main/java/com/iformall/enums/EnumMerchantSubsidyStatus.java Просмотреть файл

@@ -0,0 +1,36 @@
package com.iformall.enums;

/**
* Created by Stormeye on 2018/08/09.
*/
public enum EnumMerchantSubsidyStatus {

NOT_SUBSIDY(0, "未补贴"),
SUBSIDIED(1, "已补贴"),
;

public static EnumMerchantSubsidyStatus getEnum(Integer code) {
for (EnumMerchantSubsidyStatus value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}

private Integer code;
private String message;

EnumMerchantSubsidyStatus(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

+ 72
- 9
mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java Просмотреть файл

@@ -5,9 +5,11 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.domain.po.*;
import com.iformall.mapper.WxCardInfoMapper;
import com.iformall.mapper.WxCardSpendMapper;
import com.iformall.mapper.WxPayAccountMapper;
import com.iformall.enums.EnumCouponMerchantStatus;
import com.iformall.enums.EnumCouponType;
import com.iformall.enums.EnumMerchantSubsidyStatus;
import com.iformall.enums.EnumOrderType;
import com.iformall.mapper.*;
import com.iformall.service.WxCardSpendService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,29 +17,67 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iformall.common.IdWorker;

import java.util.Date;

@Service
public class WxCardSpendServiceImpl implements WxCardSpendService {

private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
WxCardSpendMapper wxCardSpendMapper;

@Autowired
WxCardInfoMapper wxCardInfoMapper;

@Autowired
WxCouponMapper wxCouponMapper;

@Autowired
WxCouponMerchantMapper wxCouponMerchantMapper;

@Autowired
WxPayAccountMapper payAccountMapper;

@Override
public ResultData createCardSpend(WxCardSpend record, WxOrder order, WxCUser user) {
Date curDate = new Date();
final IdWorker idWorker = IdWorker.get();
// 1. get card info
WxCardInfo cardInfo = wxCardInfoMapper.selectByPrimaryKey(record.getCardId());
if (cardInfo != null) {
logger.error("card not found: " + record.getCardId());
return new ResultData(ErrorCode.CARD_IS_NOT_FOUND);
}
// 2. get pay account
// 2. coupon 补贴 rate
WxCouponMerchant couponMerchant = null;
WxCouponMerchant couponMerchantQ = new WxCouponMerchant();
couponMerchantQ.setProductId(cardInfo.getCouponId());
couponMerchantQ.setMerchantId(record.getMerchantId());
couponMerchantQ.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode());
try {
couponMerchant = wxCouponMerchantMapper.selectOne(couponMerchantQ);
} catch (Exception e) {
logger.error("couponmerchant not found: " + cardInfo.getCouponId());
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
}

if (couponMerchant == null) {
logger.error("卡: card: " + cardInfo.getId() + " coupon-" + cardInfo.getCouponId() + "couponMerchantId-" + record.getMerchantId());
return new ResultData(ErrorCode.COUPON_MERCHANT_NOT_FOUND);
}

Integer subsidyRate = 0;
if(couponMerchant.getParameter() != null) {
try {
subsidyRate = Integer.valueOf(couponMerchant.getParameter());
} catch (Exception e) {
logger.error("couponmerchant subidy rate not found: " + cardInfo.getCouponId());
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
}
}

// 3. get pay account
WxPayAccount payAccount = null;
WxPayAccount payAccountQ = new WxPayAccount();
payAccountQ.setTenantId(user.getTenantId());
@@ -48,18 +88,21 @@ public class WxCardSpendServiceImpl implements WxCardSpendService {
return new ResultData(ErrorCode.DB_FAIL.getCode(), "获取payAccount失败");
}

// 3. 扣减计算
// 5. 扣减计算
Integer payment = cardInfo.getSaleAmount() * record.getDeductionAmount() / cardInfo.getAmount();
Double dChargeFee = Math.ceil(payment * 1.0D * payAccount.getRate() / 10000);
Integer real_payment = payment - dChargeFee.intValue();

// 4 insert card_spend
// 6 insert card_spend
record.setId(idWorker.nextId());
record.setPayment(payment);
record.setRealPayment(real_payment);
record.setCardBeforeAmount(cardInfo.getRemainingAmount());
record.setCardRemainAmount(cardInfo.getRemainingAmount()-record.getDeductionAmount());
record.setCardBeforeRealAmount(cardInfo.getRemainingShareFeeAmount());
record.setCardRemainAmount(cardInfo.getRemainingShareFeeAmount()-real_payment);
record.setCreateDate(curDate);
record.setUpdateDate(curDate);
try {
wxCardSpendMapper.insertSelective(record);
} catch (Exception e) {
@@ -67,8 +110,7 @@ public class WxCardSpendServiceImpl implements WxCardSpendService {
return new ResultData(ErrorCode.DB_FAIL.getCode(), "card spend 插入出错!");
}


// 5. update card info
// 7. update card info
cardInfo.setRemainingAmount(cardInfo.getRemainingAmount()-record.getDeductionAmount());
cardInfo.setRemainingShareFeeAmount(cardInfo.getRemainingShareFeeAmount()-real_payment);
try {
@@ -78,6 +120,27 @@ public class WxCardSpendServiceImpl implements WxCardSpendService {
return new ResultData(ErrorCode.DB_FAIL.getCode(), "card info 更新出错!");
}

// 8. 补贴
Integer subsidyFee = (record.getDeductionAmount() - payment)* subsidyRate / 10000;
Double dSubChargeFee = Math.ceil(subsidyFee * 1.0D * payAccount.getRate() / 10000);
Integer realSubsidyFee = subsidyFee - dSubChargeFee.intValue();
WxMerchantSubsidy merchantSubsidy = new WxMerchantSubsidy();
merchantSubsidy.setId(idWorker.nextId());
merchantSubsidy.setOrderId(order.getId());
merchantSubsidy.setOrderType(EnumOrderType.PREPAIDCARD.getCode());
merchantSubsidy.setMerchantId(record.getMerchantId());
merchantSubsidy.setCouponOrderId(cardInfo.getId());
merchantSubsidy.setCouponType(EnumCouponType.CARD_MULTIMCH.getCode());
merchantSubsidy.setOrderPayment(record.getDeductionAmount());
merchantSubsidy.setReceiverPayment(payment);
merchantSubsidy.setRealPayment(real_payment);
merchantSubsidy.setSubsidy(subsidyFee);
merchantSubsidy.setRealSubsidy(realSubsidyFee);
merchantSubsidy.setStatus(EnumMerchantSubsidyStatus.NOT_SUBSIDY.getCode());
merchantSubsidy.setCreateDate(curDate);
merchantSubsidy.setUpdateDate(curDate);
// 9. 分账

return new ResultData(record);
}



Загрузка…
Отмена
Сохранить