|
|
|
@@ -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); |
|
|
|
} |
|
|
|
|
|
|
|
|