diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java index 8dc32f335..0078a9c34 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCardPayController.java +++ b/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); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java index 204c859b1..417eb6fa2 100644 --- a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java +++ b/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, "此用户发此券到达疲劳度限制"), diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMerchantSubsidyStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumMerchantSubsidyStatus.java new file mode 100644 index 000000000..6a8a53596 --- /dev/null +++ b/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; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java index f256e48c0..d280a2ee4 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxCardSpendServiceImpl.java +++ b/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); }