From d287777cdf257dca70f9827d0f9e8aa438bc46f1 Mon Sep 17 00:00:00 2001 From: xhxu Date: Fri, 14 May 2021 17:30:12 +0800 Subject: [PATCH] tt --- .../com/iformall/domain/po/tt/TtCoupon.java | 3 + .../com/iformall/domain/po/tt/TtOrder.java | 3 + .../com/iformall/enums/EnumTtCouponType.java | 38 + .../service/tt/impl/TtCouponServiceImpl.java | 5 + .../service/tt/impl/TtOrderServiceImpl.java | 2322 +---------------- .../controller/TtOrderController.java | 131 - .../controller/TtPayOrderController.java | 223 ++ 7 files changed, 276 insertions(+), 2449 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java create mode 100644 mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java index 1879a3761..97639ad06 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtCoupon.java @@ -129,6 +129,9 @@ public class TtCoupon extends TenantEntity { @TableField(exist = false) private WxMerchant author; + @TableField(exist = false) + private TtCoupon couponCoumn; + @TableField(exist = false) @io.swagger.annotations.ApiModelProperty(value = "审批流参数", name = "columnCoupons") private List columnCoupons; diff --git a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java index 617cff686..3ab10bb8a 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/tt/TtOrder.java @@ -67,6 +67,9 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String paymentStr; + @TableField(exist = false) + protected TtCoupon ttCoupon; + @TableField(exist = false) protected List statusS; diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java new file mode 100644 index 000000000..154e5f123 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumTtCouponType.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumTtCouponType { + + + COUPON_COLUMN(1, "专栏"), + COUPON_SINGLE(2, "单课程"), + COUPON_MORE(3, "子课程"), + ; + + public static EnumTtCouponType getEnum(Integer code) { + for (EnumTtCouponType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumTtCouponType(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/tt/impl/TtCouponServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java index 6e166d109..095a9b5ef 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtCouponServiceImpl.java @@ -7,6 +7,7 @@ import com.iformall.common.IdWorker; import com.iformall.common.ResultData; import com.iformall.domain.po.tt.TtCoupon; import com.iformall.mapper.*; +import com.iformall.service.WxMerchantService; import com.iformall.service.tt.TtCouponService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -26,6 +27,9 @@ public class TtCouponServiceImpl implements TtCouponService { @Autowired TtCouponMapper ttCouponMapper; + @Autowired + WxMerchantService wxMerchantService; + @Override public PageInfo listAsPage(TtCoupon record, Integer pageIndex, Integer pageSize) { @@ -81,6 +85,7 @@ public class TtCouponServiceImpl implements TtCouponService { @Override public TtCoupon detail(Long productId) { TtCoupon byId = this.getById(productId); + byId.setAuthor(wxMerchantService.getById(byId.getMerchantId())); return byId; } } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java index 264926c39..6e11fd0ec 100644 --- a/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java @@ -1,48 +1,26 @@ package com.iformall.service.tt.impl; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; import com.iformall.common.IdWorker; import com.iformall.common.ResultData; -import com.iformall.domain.dto.OrderSaveDto; -import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.po.*; import com.iformall.domain.po.base.TenantEntity; -import com.iformall.domain.po.msg.FmInsideOrderSuccessMsg; import com.iformall.domain.po.tt.TtCoupon; import com.iformall.domain.po.tt.TtOrder; -import com.iformall.domain.vo.*; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; -import com.iformall.mq.MqBaseProducer; -import com.iformall.service.*; +import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.tt.TtCouponService; import com.iformall.service.tt.TtOrderService; -import com.iformall.utils.*; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; @Service @@ -57,101 +35,7 @@ public class TtOrderServiceImpl implements TtOrderService { private TtCouponService ttCouponService; @Autowired - RedisLock redisLock; - - @Autowired - WxAppinfoMapper wxAppinfoMapper; - - @Autowired - WxPayAccountMapper wxPayAccountMapper; - - @Autowired - WxMallMapper wxMallMapper; - - @Autowired - WxMerchantMapper wxMerchantMapper; - - @Autowired - WxCUserMapper wxCUserMapper; - - @Autowired - WxCouponMapper wxCouponMapper; - - @Autowired - WxCouponOrderMapper wxCouponOrderMapper; - - @Autowired - WxCUserService wxCUserService; - - @Autowired - WxCUserBasicInfoService wxCUserBasicInfoService; - - @Autowired - WxPayOrderMapper wxPayOrderMapper; - - @Autowired - WxMerchantBUserMapper wxMerchantBUserMapper; - - @Autowired - WxAppinfoService wxAppinfoService; - - @Autowired - WxPayOrderService wxPayOrderService; - - @Autowired - WxScoreRulesService wxScoreRulesService; - - @Autowired - WxCUserTagsService wxCUserTagsService; - - @Autowired - WxCouponActionLogService wxCouponActionLogService; - - @Autowired - WxProfitSharingOrderService wxProfitSharingOrderService; - - @Autowired - WxCouponMerchantMapper wxCouponMerchantMapper; - - @Autowired - WxCardInfoMapper wxCardInfoMapper; - - @Autowired - WxCouponSendService wxCouponSendService; - - @Autowired - WxOrderPressMapper wxOrderPressMapper; - - @Autowired - WxOrderGroupMapper wxOrderGroupMapper; - - @Autowired - WxCreditHistoryService wxCreditHistoryService; - - @Autowired - WxCouponChannelMapper wxCouponChannelMapper; - - @Autowired - private MqBaseProducer mqBaseProducer; - - @Autowired - private WxCUserBasicInfoMapper wxCUserBasicInfoMapper; - - @Autowired - private WxCouponPasswordMapper couponPasswordMapper; - - @Autowired - ExcelService excelService; - - @Autowired - WxCouponService wxCouponService; - - @Autowired - WxCouponChannelService wxCouponChannelService; - - @Autowired - @Qualifier("couponDetailRedisTemplate") - RedisTemplate cdRedisTemplate; + private WxCUserBasicInfoService wxCUserBasicInfoService; @Override public PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize) { @@ -265,2206 +149,8 @@ public class TtOrderServiceImpl implements TtOrderService { return null; } TtCoupon coupon = ttCouponService.detail(ttOrder.getProductId()); - return null; - } - - - @Override - public ResultData microPayListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); - if (wxMerchantBUser == null) { - logger.error("B端用户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); - String dateString; - Date startDate; - Date endDate; - - if (date == null) { - endDate = new Date(); - dateString = fmt.format(new Date()); - try { - startDate = fmt.parse(dateString); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - } else { - try { - startDate = fmt.parse(date); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - Calendar cal = Calendar.getInstance(); - cal.setTime(startDate); - cal.add(Calendar.DATE, 1); - endDate = cal.getTime(); - } - - Map dateMap = new HashMap(); - dateMap.put("startDate", startDate); - dateMap.put("endDate", endDate); - dateMap.put("merchantId", wxMerchant.getId()); - dateMap.put("type", type); - dateMap.put("tenantId", wxMerchantBUser.getTenantId()); - dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); - - Map resultMap = new HashMap(); - - if (pageIndex == null || pageSize == null) { - List list; - list = wxOrderMapper.findListOfMicroPayOrderByDate(dateMap); - logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); - int total_price = 0; - for (WxOrder order : list) { - total_price = total_price + order.getPayment(); - } - resultMap.put("amount", total_price); - } else { - resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfMicroPayOrderByDate(dateMap))); - } - return new ResultData(resultMap); - } - - @Override - public ResultData microPayExpListOnDateAsPage(Long bUserId, Integer type, String date, Integer pageIndex, Integer pageSize) { - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(bUserId.longValue()); - if (wxMerchantBUser == null) { - logger.error("B端用户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - WxMerchant wxMerchant = wxMerchantMapper.selectById(wxMerchantBUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在:" + bUserId); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - - SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); - String dateString; - Date startDate; - Date endDate; - - if (date == null) { - endDate = new Date(); - dateString = fmt.format(new Date()); - try { - startDate = fmt.parse(dateString); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - } else { - try { - startDate = fmt.parse(date); - } catch (ParseException e) { - return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR); - } - Calendar cal = Calendar.getInstance(); - cal.setTime(startDate); - cal.add(Calendar.DATE, 1); - endDate = cal.getTime(); - } - - Map dateMap = new HashMap(); - dateMap.put("startDate", startDate); - dateMap.put("endDate", endDate); - dateMap.put("merchantId", wxMerchant.getId()); - dateMap.put("type", type); - dateMap.put("tenantId", wxMerchantBUser.getTenantId()); - dateMap.put("finalTenantId", wxMerchantBUser.getFinalTenantId()); - Map resultMap = new HashMap(); - - if (pageIndex == null || pageSize == null) { - List list; - list = wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap); - logger.info("find " + list.size() + " order from " + startDate + " to " + new Date()); - int total_price = 0; - for (WxOrder order : list) { - total_price = total_price + order.getPayment(); - } - resultMap.put("amount", total_price); - } else { - resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfExpMicroPayOrderByDate(dateMap))); - } - return new ResultData(resultMap); - } - - /** - * 拼团数量 - * - * @param user - * @param counpon - * @return - */ - private int getUserOrderGroupCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - return wxOrderMapper.countList(orderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - - /** - * 用户购买的订单数量 - * - * @param user - * @param counpon - * @return - */ - private int getUserOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - orderQ.setStatusS(statusS); - return wxOrderMapper.countList(orderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - /** - * 用户购买的订单数量 - * - * @param user - * @param counpon - * @return - */ - public WxOrder getUnPaidOrder(WxCUserBasicInfo user, WxCoupon counpon) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.updateTenantInfo(counpon); - orderQ.setProductId(counpon.getId()); - orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(user.getId()); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - orderQ.setStatusS(statusS); - List orders = wxOrderMapper.findList(orderQ); - if (orders.size() >= 1) { - return orders.get(0); - } - } catch (Exception e) { - logger.error("待支付Order, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); - } - return null; - } - - /** - * 用户正在参加的新手活动 - * - * @param - * @return - */ - public int countCouponConditionType1(String subTenantId,Long cuserId) { - // + Order 待支付 - try { - WxOrder orderQ = new WxOrder(); - orderQ.setTenantId(subTenantId); -// orderQ.setType(EnumOrderType.COUPON.getCode()); - orderQ.setCUserId(cuserId); - List statusS = new ArrayList<>(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PENDING_REFUND.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_REFUND_FAILD.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_PRESS_CANCEL.getCode()); - - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode()); - - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_SCHEDU_REFUND.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE_REFUND.getCode()); - - orderQ.setStatusS(statusS); - return wxOrderMapper.countCouponConditionType1(orderQ); - } catch (Exception e) { - logger.error("用户正在参加的新手活动, userId: " + cuserId + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); - } - } - - /** - * 用户购买的券包数量- 待使用的券 - * - * @param user - * @param counpon - * @return - */ - private int getUserCouponOrderCount(WxCUserBasicInfo user, WxCoupon counpon) { - // + couponOrder ---待使用 - try { - WxCouponOrder couponOrderQ = new WxCouponOrder(); - couponOrderQ.updateTenantInfo(counpon); - couponOrderQ.setCouponId(counpon.getId()); - couponOrderQ.setCUserId(user.getId()); - if (counpon.getSendType().equals(EnumCouponSendType.PASSIVE)) { - couponOrderQ.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } - return wxCouponOrderMapper.findCount(couponOrderQ); - } catch (Exception e) { - logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL); - } - - } - - /** - * 商户注券减库存 - * - * @param user - * @param coupon - * @param couponIdStr - * @param wxCouponSendVo - */ - private void stockMerchantReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr, WxCouponSendVo wxCouponSendVo) { - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - // 库存加锁 - if (!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST.getCode(), coupon.getTitle() + ErrorCode.TOO_MANY_REQUEST.getMessage()); - } - - JSONObject jo = JSONObject.parseObject(wxCouponSendVo.getConditions()); - int merchantSend = jo.getIntValue(WxCouponSend.KEY_MERCHANT_SEND); - int merchantRemain = jo.getIntValue(WxCouponSend.KEY_MERCHANT_REMAIN); - - // 检查 优惠券 库存 - if (merchantRemain <= 0) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券库存为0, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(), coupon.getTitle() + ErrorCode.REMAIN_IS_EMPTY.getMessage()); - } - - int count = 0; - // 有价券 TODO 当前只支持系统券(免费券) -// if (coupon.getSalePrice() > 0) { -// // 检查是否未支付订单 -// try { -// count = getUserOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count > 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_UNPAID); -// } -// } - // 检查用户已购买数量 - try { - count = getUserCouponOrderCount(user, coupon); - } catch (Exception e) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); - } - - try { - // 减库存 - wxCouponSendService.reduceMerchantSend(coupon.getTenantId(),wxCouponSendVo.getId(), merchantRemain, merchantSend, 1); - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: {}, error: {}", couponIdStr, e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), coupon.getTitle() + ErrorCode.ORDER_IS_LIMITED.getMessage()); - } finally { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - } - } - - /** - * 减库存 - * - * @param user - * @param coupon - * @param couponIdStr - */ - private void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr) { - //如果缓存中不存在这个key,则从coupon中取 - if(!redisLock.hasCouponStockCache(coupon.getId())) { - //此处需要加锁,防止并发设置 - long time = System.currentTimeMillis() + RedisLock.TIMEOUT; - String timeStr = String.valueOf(time); - boolean stocksetlock = redisLock.lock("couponLockStockSet_"+coupon.getId(), timeStr); - if (stocksetlock) { - if (!redisLock.hasCouponStockCache(coupon.getId())) { - WxCoupon cou = wxCouponMapper.selectById(coupon.getId(),coupon.getTenantId()); - if (null == cou) { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"未查询到券!"+coupon.getId()); - } - try { - redisLock.setCouponStock(coupon.getId(), cou.getRemainInventory()); - }catch(Exception e) { - logger.error("set couponstock to redis fail.",e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"redis设置券库存失败"+coupon.getId()); - }finally { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - } - }else { - redisLock.unlock("couponLockStockSet_"+coupon.getId(), timeStr); - } - } - - } - - long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); - if (redisStock<=0) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+couponIdStr); - } - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - - int count = 0; - // 有价券 - if (coupon.getSalePrice() > 0) { - // 检查是否未支付订单 - try { - count = getUserOrderCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count > 0) { - logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_UNPAID); - } - } - //检查拼团中的数量 - try { - count = getUserOrderGroupCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); - } - - // 检查用户已购买数量 - try { - count = getUserCouponOrderCount(user, coupon); - } catch (Exception e) { - throw new MallinkException(ErrorCode.DB_FAIL); - } - if (count >= coupon.getUseLimitQuantity()) { - logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); - } - - try { - //减库存,从redis中取,然后发mq消息同步到数据库 - wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), 1); - - long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); - if (stock < 0 ) { - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!"); - } - - -// UpdateCouponStockMsg msg = new UpdateCouponStockMsg(); -// msg.setCouponId(coupon.getId()); -// msg.setNumber(1); -// msg.setOperateType(UpdateCouponStockMsg.OPERATE_TYPE_DECREASE); -// msg.setMsgType(EnumMsgRecordType.COUPON_STOCK.getCode()); -// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId()); - } catch (RuntimeException e) { - logger.error("此券减库存失败, couponId: " + couponIdStr,e); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage()); - } - } - -// /** -// * 减库存 -// * -// * @param user -// * @param coupon -// * @param couponIdStr -// */ -// private void stockReduce(WxCUser user, WxCoupon coupon, String couponIdStr) { -// long time = System.currentTimeMillis() + RedisLock.TIMEOUT; -// String timeStr = String.valueOf(time); -// // 库存加锁 -// if (!redisLock.lock(couponIdStr, timeStr)) { -// logger.error("此券被锁定, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); -// } -// -// // 检查 优惠券 库存 -// if (coupon.getRemainInventory() <= 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券库存为0, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); -// } -// -// int count = 0; -// // 有价券 -// if (coupon.getSalePrice() > 0) { -// // 检查是否未支付订单 -// try { -// count = getUserOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count > 0) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_UNPAID); -// } -// } -// //检查拼团中的数量 -// try { -// count = getUserOrderGroupCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count >= coupon.getUseLimitQuantity()) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); -// } -// -// // 检查用户已购买数量 -// try { -// count = getUserCouponOrderCount(user, coupon); -// } catch (Exception e) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// throw new MallinkException(ErrorCode.DB_FAIL); -// } -// if (count >= coupon.getUseLimitQuantity()) { -// //解锁 -// redisLock.unlock(couponIdStr, timeStr); -// logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); -// throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); -// } -// -// try { -// // 减库存 -// int num = wxCouponMapper.reduceInventory(coupon.getId(), 1); -// if (num <= 0) { -// logger.error("此券减库存失败, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); -// } -// } catch (RuntimeException e) { -// logger.error("此券减库存失败, couponId: " + couponIdStr); -// throw new MallinkException(ErrorCode.ORDER_IS_FAIL); -// } finally { -// // 解锁 -// redisLock.unlock(couponIdStr, timeStr); -// } -// } - - @Override - public void stockBack(WxOrder updateOrder) { - // 已取消/已退款,库存加1 - // 获取订单相关coupon - Long couponId = updateOrder.getProductId(); - String couponIdStr = "" + couponId; - //加锁 - long time = System.currentTimeMillis() + RedisLock.LONG_TIMEOUT; - String timeStr = String.valueOf(time); - - if (!redisLock.lock(couponIdStr, timeStr)) { - logger.error("此券被锁定, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.TOO_MANY_REQUEST); - } - WxCoupon coupon = null; - try { - coupon = wxCouponMapper.selectById(couponId,updateOrder.getTenantId()); - } catch (Exception e) { - logger.error("券未找到, e:" + e.getMessage()); - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon == null) { - logger.error("券未找到, " + couponIdStr); - redisLock.unlock(couponIdStr, timeStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - - try { - int num = wxCouponMapper.backInventory(coupon.getId(),coupon.getTenantId(), 1, coupon.getRemainInventory()); - if (num <= 0) { - logger.error("此券加库存失败, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券couponId:["+couponIdStr+"]库存回滚失败,更新记录条数小于等于0."); - } - redisLock.increase(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1); - } catch (Exception e) { - logger.error("数据库更新失败,库存+1失败, e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "库存恢复失败"); - } finally { - //解锁 - redisLock.unlock(couponIdStr, timeStr); - } - } - - /** - * 检查券商户是否可用 - * - * @param couponId - * @return - */ - private boolean isCouponMerchantValid(Long couponId,String tenantId) { - List merchantVoList = wxCouponMerchantMapper.findMerchantNameList(couponId,tenantId); - if (merchantVoList.stream().anyMatch((cm -> cm.getMerchantStatus().equals(EnumMerchantStatus.VALID.getCode())))) { - return true; - } - return false; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveMicroPayOrder(WxMerchantBUser user, String totalFeeStr,EnumPayWay payWay) { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查商户 - WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { - logger.error("商户已禁用, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); - } - - WxOrder record = new WxOrder(); - - Date curr = new Date(); - - BigDecimal totalFee = new BigDecimal(totalFeeStr); - totalFee.setScale(2, BigDecimal.ROUND_HALF_UP); // 第一个变量是小数位数,第二个变量是取舍方法(四舍五入) - - int payment = totalFee.multiply(new BigDecimal(100)).intValue(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]刷卡支付, 金额:" + totalFeeStr; - - record.setId(orderNumber); - record.updateTenantInfo(user); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.MICROPAY.getCode()); - record.setProductId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveMicroPayOrderV2(WxMerchantBUser user, WxCUserBasicInfo cUser, Integer payment) { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查商户 - WxMerchant wxMerchant = wxMerchantMapper.selectById(user.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - if (wxMerchant.getStatus() == EnumMerchantStatus.NOT_VALID.getCode()) { - logger.error("商户已禁用, merchantId: " + user.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_VALID); - } - - WxOrder record = new WxOrder(); - - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "刷卡支付, 金额:" + payment; - - record.setId(orderNumber); - record.updateTenantInfo(user); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.MICROPAY.getCode()); - record.setProductId(user.getId()); - if (cUser != null) { - record.setCUserId(cUser.getId()); - } - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public WxOrder saveCardPayOrder(WxMerchant merchant, Long cUserId, String totalFeeStr, Integer payment,EnumPayWay payWay) { - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = "["+payWay.getMessage()+"("+payWay.getCode()+")]C扫B储值卡支付, 金额:" + totalFeeStr; - - WxOrder record = new WxOrder(); - record.setId(orderNumber); - record.updateTenantInfo(merchant); - record.setOrderNumber(orderNumber); - record.setType(EnumOrderType.PREPAIDCARD.getCode()); - record.setProductId(merchant.getId()); - record.setCUserId(cUserId); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setTotalPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - try { - // 保存订单 - wxOrderMapper.insert(record); - } catch (RuntimeException e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - return record; - } - - /** - * 创建 couponOrder - * - * @param user - * @param order - * @param coupon - */ - private WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay) { - Date curr = new Date(); - Date valid_date = null; - int limit_days = Constant.WX_LIMIT_DAYS; - WxPayAccount payAccount = null; - WxPayAccount payAccountQ = new WxPayAccount(); - payAccountQ.updateTenantInfo(order); - try { - payAccount = wxPayAccountMapper.selectOne(new QueryWrapper<>(payAccountQ)); - } catch (Exception e) { - logger.error("获取payAccount error: " + order.getTenantId()); - } - WxPayOrder payOrder = null; - if (coupon.getSalePrice() > 0) { - // 有价券获取payOrder,以备后续使用 - try { - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.updateTenantInfo(order); - payOrderQ.setOrderId(order.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - payOrder = wxPayOrderMapper.selectOne(new QueryWrapper(payOrderQ)); - } catch (Exception e) { - logger.error("payOrder not found:" + e.getMessage()); - } - } - - if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode()) || - coupon.getType().equals(EnumCouponType.COUPON_TINGCHE.getCode())) { - - if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ - valid_date = coupon.getPickEndDate(); - }else{ - valid_date = coupon.getValidEndDate(); - } - if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { - if (payOrder != null && payOrder.getShareAmount() != null) { - // 分账有价券核销有效期不能大于分账过期时间 - Date limit_date = DateUtils.getTimeAfterDays(limit_days, curr); - if (valid_date.after(limit_date)) { - valid_date = limit_date; - } - } - } - } else { - if (coupon.getSalePrice() > 0 && !coupon.checkIsCard()) { - if (payOrder != null && payOrder.getShareAmount() != null) { - // 分账有价券核销有效期不能大于分账过期时间 - if (coupon.getValidDays() < Constant.WX_LIMIT_DAYS) { - limit_days = coupon.getValidDays(); - } - } - } else { - limit_days = coupon.getValidDays(); - } - valid_date = DateUtils.getTimeAfterDays(limit_days, curr); - } - boolean isCard = false; - // 检查是否是储值卡 - if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { - isCard = true; - } - //TODO 如果orderId已经存在,则不再添加 - WxCouponOrder couponOrderQ = new WxCouponOrder(); - couponOrderQ.setOrderId(order.getId()); - couponOrderQ.updateTenantInfo(order); - WxCouponOrder couponOrder = null; - List couponorderlist = wxCouponOrderMapper.findList(couponOrderQ); - if (null != couponorderlist && couponorderlist.size() > 0 ) { - couponOrder = couponorderlist.get(0); - }else { - final IdWorker idWorker = IdWorker.get(); - couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - //有支付信息,从支付信息中取渠道 - if (null != payOrder) { - couponOrder.setPayVendor(payOrder.getPayVendor()); - }else { - //免费券无需支付,如商户注券,核销发券,免费券等等 - couponOrder.setPayVendor(payWay.getCode()); - } - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); - } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - wxCouponOrderMapper.insert(couponOrder); - } - - /// 储值卡信息添加 - if (isCard) { - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - if (!coupon.checkIsFree()) { - //判断该transctionId是否已经存在,如果存在,则不添加 - WxCardInfo cardInfoq = new WxCardInfo(); - cardInfoq.setTransactionId(payOrder.getTransactionId()); - List cardInfoList = wxCardInfoMapper.findList(cardInfoq); - if (null != cardInfoList && cardInfoList.size() > 0) { - //do nothing - }else { - // 有价卡 - cardInfo.setTransactionId(payOrder.getTransactionId()); - if (payOrder.getShareAmount() != null) { - // 开启分账 - fee = payOrder.getPayAmount() - payOrder.getShareAmount(); - cardInfo.setShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRemainingShareFeeAmount(payOrder.getShareAmount()); - cardInfo.setRateAmount(payOrder.getRateAmount()); - } else { - // 未开启分账 - fee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRate(), false); - Integer shareAmount = payOrder.getPayAmount() - fee; - cardInfo.setShareFeeAmount(shareAmount); - cardInfo.setRemainingShareFeeAmount(shareAmount); - if (payAccount.getRealRate() != null) { - int iRealChargeFee = PayUtils.getPayRate(payOrder.getPayAmount(), payAccount.getRealRate(), true); - if (fee > iRealChargeFee) { - cardInfo.setRateAmount(fee - iRealChargeFee); - } - } - } - } - } else { - // 免费卡 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); - } - return couponOrder; - } - - /** - * 创建 couponOrder - * - * @param user - * @param order - * @param coupon - */ - private WxCouponOrder createCouponOrderForOuter(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId) { - Date curr = new Date(); - Date valid_date = null; - int limit_days = Constant.WX_LIMIT_DAYS; - if (coupon.getValidType().equals(EnumValidStatus.VALID_RANGE.getCode())) { - if( coupon.getType().equals(EnumCouponType.COUPON_PREORDER.getCode())){ - valid_date = coupon.getPickEndDate(); - }else{ - valid_date = coupon.getValidEndDate(); - } - } else { - limit_days = coupon.getValidDays(); - valid_date = DateUtils.getTimeAfterDays(limit_days, curr); - } - boolean isCard = false; - // 检查是否是储值卡 - if (coupon.getType().equals(EnumCouponType.CARD_MULTIMCH.getCode())) { - isCard = true; - } - final IdWorker idWorker = IdWorker.get(); - - WxCouponOrder couponOrder = new WxCouponOrder(); - couponOrder.setId(idWorker.nextId()); - couponOrder.updateTenantInfo(order); - couponOrder.setCouponId(order.getProductId()); - couponOrder.setCouponType(coupon.getType()); - couponOrder.setCUserId(user.getId()); - couponOrder.setOwnerId(user.getId()); - couponOrder.setAutoRefund(coupon.getAutoRefund()); - couponOrder.setOrderId(order.getOrderNumber()); - couponOrder.setExpiredTime(valid_date); - if (!isCard) { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); - } else { - couponOrder.setCouponOrderStatus(EnumCouponOrderStatus.CARD_USING.getCode()); - } - couponOrder.setCreateDate(curr); - couponOrder.setUpdateDate(curr); - couponOrder.setCouponPrice(order.getPayment()); - - wxCouponOrderMapper.insert(couponOrder); - - /// 储值卡信息添加 - if (isCard) { - WxPayOrder payOrder = null; - Integer fee = 0; - WxCardInfo cardInfo = new WxCardInfo(); - cardInfo.setId(couponOrder.getId()); - cardInfo.updateTenantInfo(order); - cardInfo.setCouponId(order.getProductId()); - cardInfo.setAmount(coupon.getPrice()); - cardInfo.setSaleAmount(coupon.getSalePrice()); - cardInfo.setRemainingAmount(coupon.getPrice()); - - // 不论有价免费卡, 钱是线下支付, 所以不设分账 - cardInfo.setShareFeeAmount(0); - cardInfo.setRemainingShareFeeAmount(0); - cardInfo.setRateAmount(0); - if (coupon.getPasswordSupport().equals(EnumCouponPasswordSupport.SUPPORTED.getCode())) { - WxCouponPassword updateCPwd = new WxCouponPassword(); - updateCPwd.setId(couponPasswordId); - updateCPwd.setCardId(cardInfo.getId()); - updateCPwd.setStatus(EnumCouponPasswordStatus.USED.getCode()); - couponPasswordMapper.updateById(updateCPwd); - } - - cardInfo.setServiceFeeAmount(fee); - cardInfo.setCreateDate(curr); - cardInfo.setUpdateDate(curr); - cardInfo.setSupportTransfer(coupon.getSupportTransfer()); - - //检查卡是否下架,如果是,不可转赠 - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(order.getCouponChannelId(),order.getTenantId()); - if (wxCouponChannel != null && wxCouponChannel.getStatus().equals(EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode())) { - cardInfo.setSupportTransfer(EnumCouponTransfer.NO.getCode()); - } - wxCardInfoMapper.insert(cardInfo); - } - return couponOrder; - } - - @Override - @Transactional(propagation = Propagation.NESTED, readOnly = false, rollbackFor = {Exception.class}) - public WxCouponOrder sendFreeCouponToUser(Long userId,TenantEntity tenantinfo, Long couponId, WxCouponSendVo wxCouponSendVo,EnumPayWay payWay) { - // check 用户状态 - WxCUserBasicInfo user = null; - try { - user = wxCUserBasicInfoMapper.selectById(userId,tenantinfo.getFinalTenantId()); - } catch (Exception e) { - logger.error("userId : " + userId + ", e: " + e.getMessage(),e); - } - if (user == null) { - logger.error("用户不存在, userId: " + userId); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - - // 检查券状态 - String couponIdStr = String.valueOf(couponId); - WxCoupon coupon = wxCouponMapper.selectById(couponId,tenantinfo.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { - logger.error("券已下架, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_TAKE_OFF.getMessage()); - } - if (coupon.getSalePrice() != 0) { - logger.error("券不免费, couponId: " + couponIdStr); - throw new MallinkException(ErrorCode.COUPON_IS_NOT_FREE.getCode(), coupon.getTitle() + ErrorCode.COUPON_IS_NOT_FREE.getMessage()); - } - - if (Objects.nonNull(wxCouponSendVo) && Objects.equals(EnumCouponSendSendType.MERCHANT.getCode(), wxCouponSendVo.getSendType())) { - // 商户注券减库存操作 - try { - stockMerchantReduce(user, coupon, couponIdStr, wxCouponSendVo); - }catch(Exception e) { - throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); - } - } else { - // 减库存操作 - try { - stockReduce(user, coupon, couponIdStr); - }catch(Exception e) { - throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); - } - } - - int payment = coupon.getSalePrice(); - - Date curr = new Date(); - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = coupon.getTitle() + "/" + coupon.getSubTitle(); - - WxOrder record = new WxOrder(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(couponId); - record.setType(EnumOrderType.COUPON.getCode()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(payment); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - - // 保存订单 - try { - wxOrderMapper.insert(record); - } catch (Exception e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.ORDER_SAVE_ERR.getMessage()); - } - - // 创建couponOrder - WxCouponOrder couponOrder = null; - try { - couponOrder = createCouponOrder(record, user, coupon, null,payWay); - } catch (Exception e) { - logger.error("保存订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(), coupon.getTitle() + ErrorCode.COUPON_ORDER_SAVE_ERR.getMessage()); - } - - return couponOrder; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int couponOrderSuccess(WxOrder updateOrder) { - Date currentDate = new Date(); - // 检查券相关 - WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } - // 检查用户 - WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (user == null) { - logger.error("用户不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 已支付,更新支付时间 - WxOrder updateT = new WxOrder(); - updateT.setId(updateOrder.getId()); - updateT.setPaymentTime(currentDate); - updateT.updateTenantInfo(updateOrder); - //拼团到此处为已完成状态 - if (updateOrder.getOrderGroupId().equals(0L)) { - updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - } else { - // 拼团设为已完成状态 - updateT.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - } - updateT.setUpdateDate(currentDate); - int ret = 0; - try { - ret = wxOrderMapper.updateById(updateT); - } catch (Exception e) { - logger.error("订单更新失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - - // 创建couponOrder - try { - createCouponOrder(updateOrder, user, coupon, null,null); - } catch (Exception e) { - logger.error("创建券包:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - - - return ret; - } - - private void sendInsideOrderSuccessMsg(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { - FmInsideOrderSuccessMsg orderSuccess = new FmInsideOrderSuccessMsg(); - orderSuccess.setMsgType(EnumMsgRecordType.INSIDE_ORDER_SUCCESS.getCode()); - orderSuccess.updateTenantInfo(updateOrder); - orderSuccess.setOrderId(updateOrder.getId()); - orderSuccess.setCUserId(user.getId()); - orderSuccess.setCouponId(coupon.getId()); - logger.info(">>>>>>>>>>>send sendInsideOrderSuccessMsg :"+orderSuccess); - mqBaseProducer.sendMessage(orderSuccess, EnumMsgMqTopic.DEFAULT.getCode(), EnumMsgMqTag.DEFAULT.getCode(), EnumMsgMqKey.DEFAULT.getCode()); - } - - @Override - public void sendOrderSuccessActionMsg(WxOrder updateOrder) { - // 检查券相关 - WxCoupon coupon = wxCouponMapper.selectById(updateOrder.getProductId(),updateOrder.getTenantId()); - if (coupon == null) { - logger.error("券不存在, couponId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.COUPON_IS_EMPTY); - } -// if (coupon.getStatus() == EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode()) { -// logger.error("券已下架, couponId: " + updateOrder.getProductId()); -// throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF); -// } - // 检查用户 - WxCUserBasicInfo basicUser = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (basicUser == null) { - logger.error("会员不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } -// WxCUser user = wxCUserMapper.selectById(updateOrder.getCUserId()); -// if (user == null) { -// logger.error("用户不存在, userId: " + updateOrder.getCUserId()); -// throw new MallinkException(ErrorCode.USER_IS_EMPTY); -// } - - // 记录活动 - JSONObject jo = null; - try { - jo = JSONObject.parseObject(coupon.getConditions()); - } catch (Exception e) { - logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); - e.printStackTrace(); - } - if (jo != null) { - if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()) { - wxCUserBasicInfoMapper.incActRecordById(basicUser.getId(),coupon.getFinalTenantId()); - } - } - - sendInsideOrderSuccessMsg(updateOrder, coupon, basicUser); - } - - /** - * 下订单后操作 - * - * @param updateOrder - * @param coupon - * @param user - */ - public void actionAfterCouponOrderSuccess(WxOrder updateOrder, WxCoupon coupon, WxCUserBasicInfo user) { - /// TODO 晚上会定时打一下tag - wxCUserTagsService.triggerAssignTags(EnumAssignTagsTrigger.ASSIGN_TAGS_TRIGGER_BUY, user,updateOrder); - - // 交易发券 - try { - wxCouponSendService.sendCouponToUser(EnumCouponSendSendType.C_ORDER, updateOrder,EnumPayWay.PAY_WAY_NOT_UNPAY_TRADE); - } catch (Exception e) { - logger.error("订单发券:" + e.getMessage()); - } - - } - - @Override - public Map summary(WxOrderQueryVo wxOrderQueryVo) { - List listOrder = wxOrderMapper.findListOrder(wxOrderQueryVo); - Long payment = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPayment)); - Long pay = listOrder.stream().collect(Collectors.summingLong(WxOrder::getPay)); - Map data = new HashMap<>(); - data.put("payment", payment); - data.put("pay", pay); - return data; - } - - @Override - public void exportData(WxOrderQueryVo wxOrderQueryVo, HttpServletRequest request, HttpServletResponse response) { - List list = wxOrderMapper.findListOrder(wxOrderQueryVo); - Map summary = summary(wxOrderQueryVo); - Long payment = summary.get("payment"); - Long pay = summary.get("pay"); - String paymentStr = new BigDecimal(payment).divide(new BigDecimal(100)).toPlainString(); - String payStr = new BigDecimal(pay).divide(new BigDecimal(100)).toPlainString(); - WxOrder order = new WxOrder(); - order.setPayStr("支付总金额(元): " + payStr); - order.setPaymentStr("订单总金额(元): " + paymentStr); - order.setOrderStatus(-1); - order.setAttribute(-1); - list.add(order); - excelService.exportExcel(list, null, "线上交易", WxOrder.class, "线上交易.xlsx", response, false); - } - - /** - * 积分设置来源商户 - */ - private void setMerchantId(WxCoupon coupon, WxCreditHistory creditHistory) { - WxCouponMerchant wxCouponMerchant = new WxCouponMerchant(); - wxCouponMerchant.setProductId(coupon.getId()); - wxCouponMerchant.setStatus(EnumCouponMerchantStatus.COUPON_MERCHANT_STATUS_VALID.getCode()); - List list = wxCouponMerchantMapper.findList(wxCouponMerchant); - if (list != null && list.size() > 0) { - if (list.size() == 1) { - creditHistory.setMerchantId(list.get(0).getMerchantId()); - } - if (list.size() > 1) { - creditHistory.setMerchantId(Long.valueOf(EnumMerchantType.MERCHANT_MORE.getCode())); - } - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int microPayOrderSuccess(WxOrder updateOrder) { - Date currentDate = new Date(); - // C端用户 - WxCUserBasicInfo user = wxCUserBasicInfoMapper.selectById(updateOrder.getCUserId(),updateOrder.getFinalTenantId()); - if (user == null) { - logger.error("用户不存在, userId: " + updateOrder.getCUserId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // B端用户 - WxMerchantBUser bUser = wxMerchantBUserMapper.selectById(updateOrder.getProductId()); - if (bUser == null) { - logger.error("B端用户不存在, bUserId: " + updateOrder.getProductId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 基于B端User查找merchant - WxMerchant wxMerchant = wxMerchantMapper.selectById(bUser.getMerchantId()); - if (wxMerchant == null) { - logger.error("商户不存在, merchantId: " + bUser.getMerchantId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - // 已支付,更新支付时间 - updateOrder.setPaymentTime(currentDate); - updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - updateOrder.setUpdateDate(currentDate); - int ret = 0; - try { - ret = wxOrderMapper.updateById(updateOrder); - } catch (Exception e) { - logger.error("订单更新失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - - // 成长值 计算 - try { - wxScoreRulesService.addScore2(bUser,EnumScoreType.CONSUMPTION, updateOrder, wxMerchant.getBusinessId()); - } catch (Exception e) { - logger.error("成长值:" + e.getMessage()); - } - // 积分 计算 - try { - //扣减积分操作记录 - WxCreditHistory creditHistory = new WxCreditHistory(); - creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); - creditHistory.setOperatorId(user.getId()); - creditHistory.setCUserId(user.getId()); - creditHistory.setCreateDate(new Date()); -// creditHistory.updateTenantInfo(wxMerchant); - creditHistory.setTenantId(wxMerchant.getFinalTenantId()); - creditHistory.setFinalTenantId(wxMerchant.getFinalTenantId()); - creditHistory.setCreditType(EnumScoreType.CONSUMPTION.getCode()); - creditHistory.setBusinessId(wxMerchant.getBusinessId()); - creditHistory.setSpend(updateOrder.getPayment()); - creditHistory.setMerchantId(wxMerchant.getId()); - if (updateOrder.getCouponChannelId() != null) { - WxCouponChannel wxCouponChannel = wxCouponChannelMapper.selectById(updateOrder.getCouponChannelId(),updateOrder.getTenantId()); - creditHistory.setCouponId(wxCouponChannel.getCouponId()); - - } - - creditHistory.setChangePurpose("付款码消费:消费商户["+wxMerchant.getName()+"] 金额["+creditHistory.getSpendStr()+"元]"); - - - wxCreditHistoryService.saveOrUpdate(creditHistory,wxMerchant.getTenantId()); - } catch (Exception e) { - logger.error("积分值:" + e.getMessage()); - } - - return ret; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public int updateOrderStatus(WxOrder updateOrder, EnumOrderStatus enumOrderStatus) { - Date currentDate = new Date(); - WxOrder oldOrder = wxOrderMapper.selectById(updateOrder.getId(),updateOrder.getTenantId()); - if (!oldOrder.getOrderStatus().equals(enumOrderStatus.getCode())) { - // 状态已更新,库存不退回, 保证不会多退 - switch (enumOrderStatus) { - case ORDER_STATUS_OVERTIME_CANCEL: // 支付取消,库存退回 - case ORDER_STATUS_REFUND_SUCCESS: // 退款成功,库存退回 - case ORDER_STATUS_COOPERATING_OVERTIME: // 拼团超时,退库存 - case ORDER_STATUS_COOPERATING_CANCEL: // 拼团取消,退库存 - case ORDER_STATUS_COOPERATING_COMPLETE: // 拼团完成,退库存 - { - try { - stockBack(updateOrder); - } catch (Exception e) { - logger.error("库存+1失败, e:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); - } - break; - } - } - } - WxOrder refOrder = new WxOrder(); - refOrder.setId(updateOrder.getId()); - refOrder.setOrderStatus(enumOrderStatus.getCode()); - refOrder.setUpdateDate(currentDate); - refOrder.updateTenantInfo(updateOrder); - int ret = 0; - try { - ret = wxOrderMapper.updateById(refOrder); - } catch (Exception e) { - logger.error("订单状态更新失败, e:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); - } - return ret; - } - - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void updateOrderStatus(WxOrder updateOrder) { - if (updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_OVERTIME.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_CANCEL.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_FAILD.getCode()) || - updateOrder.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_BREAK.getCode())) { - try { - stockBack(updateOrder); - } catch (Exception e) { - logger.error("拼团库存+1失败, e:" + e.getMessage()); - throw new MallinkException(ErrorCode.REMAIN_BACK_FAIL); - } - } - } - - @Override - public void updateOrderGroupStatusByCouponId(Long couponId, TenantEntity tenantEntity, Integer orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setProductId(couponId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateOrderGroupStatusByCouponId(updateOrder); - } - - @Override - public void updateOrderGroupStatusByCouponChannelId(Long couponChannelId, TenantEntity tenantEntity, Integer orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setCouponChannelId(couponChannelId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateOrderGroupStatusByCouponChannelId(updateOrder); - } - - /** - * 微信关闭订单 - */ - @Override - public ResultData orderClose(WxOrder order,EnumPayWay payWay) { - // 1. get c appid - WxAppinfo appInfo = wxAppinfoService.getCAppInfo(order,payWay); - // 2. get pay order - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.updateTenantInfo(order); - payOrderQ.setOrderId(order.getId()); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_STATUS_WAIT.getCode()); - List payOrders = wxPayOrderMapper.selectList(new QueryWrapper(payOrderQ)); - - // 3. wx pay order close - for (WxPayOrder payOrder : payOrders) { - try { - wxPayOrderService.payOrderClose(appInfo, payOrder); - } catch (Exception e) { - logger.error("微信关单失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.PAY_ORDER_ERROR); - } - } - - return new ResultData(); - } - - @Override - public WxOrder getById(Long id,String tenantId) { - return wxOrderMapper.selectById(id,tenantId); - } - - @Override - public WxOrder getPressOrderById(Long id,String tenantId) { - return wxOrderMapper.selectById(id,tenantId); - } - - @Override - public void saveOrUpdate(WxOrder record) { - if (record.getId() == null) { - //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); - final IdWorker idWorker = IdWorker.get(); - record.setId(idWorker.nextId()); - wxOrderMapper.insert(record); - } else { - wxOrderMapper.updateById(record); - } - } - -// @Override -// public void deleteById(Long id) { -// wxOrderMapper.deleteById(id); -// } - - @Override - public List findList(WxOrder record) { - return wxOrderMapper.findList(record); - } - - @Override - public PageInfo listCUserVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfCUser(record)); - } - - @Override - public WxOrderCouponVo detailCUserVo(WxOrder record) { - List list = wxOrderMapper.selectDetailOfCUser(record); - if (list.size() > 0) { - return list.get(0); - } - return null; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public void shareForMicroPay(TenantEntity tenantEntity, Long orderId, Long payOrderId,EnumPayWay payWay) { - // 微信分账 - try { - WxPayOrder wxPayOrder = new WxPayOrder(); - wxPayOrder.updateTenantInfo(tenantEntity); - wxPayOrder.setId(payOrderId); - wxPayOrder.setOrderId(orderId); - wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode()); - wxPayOrder = wxPayOrderMapper.selectOne(new QueryWrapper(wxPayOrder)); - WxOrder wxOrder = wxOrderMapper.selectById(orderId,tenantEntity.getTenantId()); - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectById(wxOrder.getProductId()); - - if (wxPayOrder != null && wxMerchantBUser != null && - wxPayOrder.getShare().equals(EnumPayShare.YES.getCode())) { - WxSharingOrderDto sharingOrder = new WxSharingOrderDto(); - sharingOrder.setCUserId(wxPayOrder.getCUserId()); - sharingOrder.setMerchantId(wxMerchantBUser.getMerchantId()); - sharingOrder.setType(EnumProfitSharingOrderType.PROFIT_SHARING_SINGLE.getCode()); - sharingOrder.setPayAmount(wxPayOrder.getPayAmount()); - sharingOrder.setRateAmount(wxPayOrder.getRateAmount()); - sharingOrder.setOrderId(wxPayOrder.getId()); - sharingOrder.setPayTimeStart(wxPayOrder.getPayTimeStart()); - sharingOrder.setPayTimeEnd(wxPayOrder.getPayTimeEnd()); - sharingOrder.updateTenantInfo(wxPayOrder); - sharingOrder.setTransactionId(wxPayOrder.getTransactionId()); - sharingOrder.setShareAmount(wxPayOrder.getShareAmount()); - ResultData resultData = wxProfitSharingOrderService.createSharingOrder(sharingOrder,payWay.getCode()); - } else { - logger.error("微信分账: 未找到payorder or merchant at orderid-" + orderId); - } - } catch (MallinkException e) { - logger.error("微信分账: " + e.getMessage()); - } - } - - @Override - public PageInfo listOrderAsPage(WxOrderQueryVo record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOrder(record)); - } - - @Override - public Map queryOrderSummary(TenantEntity tenantEntity) { - Map result = new HashMap<>(); - queryOrderCount(tenantEntity, result); - queryOrderSummary(tenantEntity, result); - return result; - } - - @Deprecated - public void queryMerchantCount(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //全部商户个数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long allMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("allMerchantCount", allMerchantCount); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long todayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("todayMerchantCount", todayMerchantCount); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - Long yesterdayMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("yesterdayMerchantCount", yesterdayMerchantCount); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - Long lastweekMerchantCount = wxOrderMapper.queryOrderForMerchantCount(params); - result.put("lastweekMerchantCount", lastweekMerchantCount); - //商户数日环比 - if (yesterdayMerchantCount > 0) { - double hbd = (double) (todayMerchantCount - yesterdayMerchantCount) / yesterdayMerchantCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentMerchant", hb + "%"); - } else { - result.put("increasedPercentMerchant", "--"); - } - //商户数周同比 - if (lastweekMerchantCount > 0) { - double hbd = (double) (todayMerchantCount - lastweekMerchantCount) / lastweekMerchantCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekMerchant", hb + "%"); - } else { - result.put("increasedPercentWeekMerchant", "--"); - } - } - - public void queryOrderSummary(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //总数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - params.put("order_status", "1"); - Long allPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long allRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("allRefundOrderSummary", allRefundOrderSummary); - Long allOrderSummary = allPayOrderSummary - allRefundOrderSummary; - result.put("allOrderSummary", allPayOrderSummary); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - params.put("order_status", "1"); - Long todayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long todayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("todayRefundOrderSummary", todayRefundOrderSummary); - result.put("todayOrderSummary", todayPayOrderSummary); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - params.put("order_status", "1"); - Long yesterdayPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long yesterdayRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("yesterdayRefundOrderSummary", yesterdayRefundOrderSummary); - result.put("yesterdayOrderSummary", yesterdayPayOrderSummary); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - params.put("order_status", "1"); - Long lastweekPayOrderSummary = wxOrderMapper.queryOrderForSum(params); - params.put("order_status", "4"); - Long lastweekRefundOrderSummary = wxOrderMapper.queryOrderForSum(params); - result.put("lastweekRefundOrderSummary", lastweekRefundOrderSummary); - result.put("lastweekOrderSummary", lastweekPayOrderSummary); - //商户数日环比 - if (yesterdayPayOrderSummary > 0) { - double hbd = (double) (todayPayOrderSummary - yesterdayPayOrderSummary) / yesterdayPayOrderSummary * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentSummary", hb + "%"); - } else { - result.put("increasedPercentSummary", "--"); - } - //商户数周同比 - if (lastweekPayOrderSummary > 0) { - double hbd = (double) (todayPayOrderSummary - lastweekPayOrderSummary) / lastweekPayOrderSummary * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekSummary", hb + "%"); - } else { - result.put("increasedPercentWeekSummary", "--"); - } - } - - public void queryOrderCount(TenantEntity tenantEntity, Map result) { - String systemTime = DateUtils.getSystemTime("yyyy-MM-dd"); - //总数 - Map params = new HashMap<>(); - params.put("tenantId", tenantEntity.getTenantId()); - if (StringUtils.isNotBlank(tenantEntity.getParentTenantId())) { - params.put("parentTenantId", tenantEntity.getParentTenantId()); - } - String thirtyTime = DateUtils.getTimeBefore(29, new Date()); - params.put("startdate", thirtyTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long allOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("allOrderCount", allOrderCount); - //今日 - params.put("startdate", systemTime + " 00:00:00"); - params.put("enddate", systemTime + " 23:59:59"); - Long todayOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("todayOrderCount", todayOrderCount); - //昨日 - String yesterday = DateUtils.getTimeBefore(1, new Date()); - params.put("startdate", yesterday + " 00:00:00"); - params.put("enddate", yesterday + " 23:59:59"); - Long yesterdayOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("yesterdayOrderCount", yesterdayOrderCount); - //上周 - String lastweek = DateUtils.getTimeBefore(7, new Date()); - params.put("startdate", lastweek + " 00:00:00"); - params.put("enddate", lastweek + " 23:59:59"); - Long lastweekOrderCount = wxOrderMapper.queryOrderForCount(params); - result.put("lastweekOrderCount", lastweekOrderCount); - //订单数日环比 - if (yesterdayOrderCount > 0) { - double hbd = (double) (yesterdayOrderCount - yesterdayOrderCount) / yesterdayOrderCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentCount", hb + "%"); - } else { - result.put("increasedPercentCount", "--"); - } - //订单数周同比 - if (lastweekOrderCount > 0) { - double hbd = (double) (yesterdayOrderCount - lastweekOrderCount) / lastweekOrderCount * 100; - double hb = new BigDecimal(hbd).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); - result.put("increasedPercentWeekCount", hb + "%"); - } else { - result.put("increasedPercentWeekCount", "--"); - } - } - - /** - * 砍价 - */ - @Override - public PageInfo listPressVoAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { - return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findListOfPress(record)); - } - - @Override - public WxOrderCouponPressVo detailPressVo(WxOrder record) { - WxOrderCouponPressVo pressVo = wxOrderMapper.selectDetailOfPress(record); - if (null != pressVo) { - Map paramMap = new HashMap(); - paramMap.put("orderId", record.getId()); - paramMap.put("tenantId", record.getTenantId()); - paramMap.put("finalTenantId", record.getFinalTenantId()); - pressVo.setOrderPressList(wxOrderPressMapper.findPressList(paramMap)); - } - return pressVo; - } - - @Override - public void updateStatusByPressCouponId(Long couponId, TenantEntity tenantEntity, int orderStatus) { - WxOrder updateOrder = new WxOrder(); - updateOrder.updateTenantInfo(tenantEntity); - updateOrder.setOrderStatus(orderStatus); - updateOrder.setProductId(couponId); - updateOrder.setUpdateDate(new Date()); - wxOrderMapper.updateStatusByPressCouponId(updateOrder); - } - - @Autowired - @Qualifier("cUserBasicInfoRedisTemplate") - RedisTemplate cUserBasicInfoRedisTemplate; - - - - - @Override - @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. 减库存操作 - String couponIdStr = String.valueOf(coupon.getId()); - stockReduce(user, coupon, couponIdStr); - - // 3. 当积分券或者积分停车券时 则进行积分支付 - Integer orderType; - if (coupon.checkIsCreditCoupon()) { - creditPay(user, coupon); - orderType = EnumOrderType.CREDIT.getCode(); - } else { - orderType = EnumOrderType.COUPON.getCode(); - } - - // 4. 保存Order - WxOrder record = new WxOrder(); - record.setCouponChannelId(couponChannelId); - record.setType(orderType); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(0); - record.setFormId(formId); - record.setOrderGroupId(0L); - try { - saveFreeOrder(record, user, coupon); - } catch (Exception e) { - logger.error("下订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - - // 5. 创建couponOrder - try { - createCouponOrder(record, user, coupon, couponPasswordId,payWay); - } catch (Exception e) { - logger.error("couponOrder失败:" + e.getMessage(),e); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - return record; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { - // 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. 减库存操作 - String couponIdStr = String.valueOf(coupon.getId()); - stockReduce(user, coupon, couponIdStr); - - // 3. 当积分券或者积分停车券时 则进行积分支付 - Integer orderType; - if (coupon.checkIsCreditCoupon()) { - creditPay(user, coupon); - orderType = EnumOrderType.CREDIT.getCode(); - } else { - orderType = EnumOrderType.COUPON.getCode(); - } - - // 4. 保存Order - WxOrder record = new WxOrder(); - record.setCouponChannelId(couponChannelId); - record.setType(orderType); - record.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setPayment(0); - record.setFormId(formId); - record.setOrderGroupId(0L); - try { - saveFreeOrder(record, user, coupon); - } catch (Exception e) { - logger.error("下订单:" + e.getMessage()); - throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); - } - - // 5. 创建couponOrder - try { - WxCouponOrder couponOrder = createCouponOrderForOuter(record, user, coupon, couponPasswordId); - return couponOrder.getId(); - } catch (Exception e) { - logger.error("couponOrder失败:" + e.getMessage()); - throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR); - } - } - - /** - * 保存订单-免费 - * - * @param record - * @param user - * @param coupon - */ - private void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) { - Date curr = new Date(); - // body - String bodyStr = ""; - try { - bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); - } catch (Exception e) { - logger.error("body:" + e.getMessage()); - bodyStr = "券" + '-' + EnumCouponType.getEnum(coupon.getType()); - } - - final IdWorker idWorker = IdWorker.get(); - Long orderNumber = idWorker.nextId(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(coupon.getId()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setCreateDate(curr); - record.setUpdateDate(curr); - // 保存订单 - wxOrderMapper.insert(record); - } - - private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon) throws MallinkException { - // 检查用户 - if (user == null) { - logger.error("用户不存在"); - throw new MallinkException(ErrorCode.USER_IS_EMPTY); - } - // 检查券 - if (coupon == null) { - 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); - } - // 检查券商户信息 - if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) { - logger.error("商户不存在, couponId: " + coupon.getId()); - throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND); - } - // 检查 优惠券 库存 - if (coupon.getRemainInventory() <= 0) { - logger.error("此券库存为0, couponId: " + coupon.getId()); - throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); - } - } - - private void creditPay(WxCUserBasicInfo user, WxCoupon coupon) { - //-------此处为【积分支付】记录增加积分操作------- - WxCreditHistory creditHistory = new WxCreditHistory(); - creditHistory.setCreditNum(coupon.getCreditPrice()); - creditHistory.setCUserId(user.getId()); -// creditHistory.updateTenantInfo(coupon); - creditHistory.setTenantId(coupon.getFinalTenantId()); - creditHistory.setFinalTenantId(coupon.getFinalTenantId()); - creditHistory.setCreditType(EnumScoreType.CHANGE_CREDIT.getCode()); - - creditHistory.setCouponId(coupon.getId()); - //如果券与商户一对一 则直接将消费商户更新为此商户 若一对多 则消费商户显示多商户 - setMerchantId(coupon, creditHistory); - //记录操作人类型 操作人id - if (user.getOperatorType() == EnumUserType.MALLUSER.getCode()) { - creditHistory.setOperatorType(EnumUserType.MALLUSER.getCode()); - creditHistory.setOperatorId(user.getOperatorId()); - creditHistory.setChangePurpose("管理端积分兑换"+"["+coupon.getTitle()+"]"); - } else { - creditHistory.setOperatorType(EnumUserType.CUSERBASIC.getCode()); - creditHistory.setOperatorId(user.getId()); - creditHistory.setChangePurpose("积分兑换"+"["+coupon.getTitle()+"]"); - } - - 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; - } - - /** - * 初始砍价 - * - * @param record - * @param user - * @param coupon - * @param orderNumber - */ - private void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) { - // 保存砍价信息 - int total = coupon.getPrice() - coupon.getSalePrice(); - int left_total = total; - WxOrderPress orderPress = new WxOrderPress(); - orderPress.setId(IdWorker.get().nextId()); - orderPress.updateTenantInfo(coupon); - orderPress.setCouponId(record.getProductId()); - orderPress.setOrderId(orderNumber); - orderPress.setUserId(user.getId()); - orderPress.setCreateDate(new Date()); - orderPress.setFirst(EnumOrderPressType.FIRST.getCode()); - int lPressValue = PressUtils.stateLessPressValue(total, left_total, coupon.getPressLimitNum(), 0); - orderPress.setPressValue(lPressValue); - wxOrderPressMapper.insert(orderPress); - // 更新订单砍价信息 - WxOrder orderUpdatePress = new WxOrder(); - orderUpdatePress.setId(record.getId()); - orderUpdatePress.setPressCurrentNum(1); - orderUpdatePress.setPressCurrentValue(left_total - orderPress.getPressValue()); - orderUpdatePress.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PRESSING.getCode()); - orderUpdatePress.setUpdateDate(new Date()); - wxOrderMapper.updateById(orderUpdatePress); - } - - private Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) { - Long orderNumber; - Date curr = new Date(); - - // body - // tenant_id + merchant_id + title + subtitle - String bodyStr = ""; - try { - bodyStr = Utility.substring(coupon.getTitle(), Math.min(62, coupon.getTitle().getBytes().length), "utf-8"); - } catch (Exception e) { - logger.error("body:" + e.getMessage()); - bodyStr = "券-" + EnumCouponType.getEnum(coupon.getType()).getMessage(); - } - final IdWorker idWorker = IdWorker.get(); - orderNumber = idWorker.nextId(); - record.setId(orderNumber); - record.updateTenantInfo(coupon); - record.setOrderNumber(orderNumber); - record.setProductId(coupon.getId()); - //record.setType(EnumOrderType.COUPON.getCode()); - record.setCUserId(user.getId()); - record.setPaymentType(EnumPayType.PAY_PAYMENT.getCode()); - record.setDetail(bodyStr); - record.setUpdateDate(curr); - record.setCreateDate(curr); - if (isPress) { - // 初始砍价信息 - record.setPressCurrentNum(0); - // 砍价券过期时间取券的过期时间和砍价限制时间中时间小的那个 - Date pressEndDate = DateUtils.getHourTimeAfter(coupon.getPressLimitHours(), new Date()); - if (pressEndDate.after(coupon.getValidEndDate())) - pressEndDate = coupon.getValidEndDate(); - record.setPressEndDate(pressEndDate); - record.setPressCurrentValue(coupon.getPrice() - coupon.getSalePrice()); - } - wxOrderMapper.insert(record); - return orderNumber; - } - - private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon) { - WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId()); - if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { - logger.error("下订单拼团人数已满>>>" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED); - } - - if (group.getRemainPeople()<=0) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满"); - } - - //判断拼团人数是否已经超出限制 - int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId()); - if (groupCount>=coupon.getPressLimitNum()) { - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!"); - } - - WxOrder order = new WxOrder(); - order.setOrderGroupId(group.getId()); - order.setCUserId(user.getId()); - order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - long count = wxOrderMapper.selectCount(new QueryWrapper(order)); - if (count > 0) { - logger.error("重复的拼团>>>" + orderGroupId); - throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID); - } - } - - private boolean isOrderGroup(Long orderGroupId) { - return orderGroupId != null && !orderGroupId.equals(0L); - } - - @Override - public int countGroupOrder(Long groupId,boolean ignoreUnPay,String tenantId) { - WxOrder query = new WxOrder(); - query.setOrderGroupId(groupId); - List statusS = new ArrayList(); - statusS.add(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - if (!ignoreUnPay) { - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode()); - } - query.setStatusS(statusS); - query.setTenantId(tenantId); - return wxOrderMapper.countList(query); - } - - @Override - public int countUserCouponGroupOrder(Long cuserId, Long couponId,String tenantId) { - WxOrder query = new WxOrder(); - query.setCUserId(cuserId); - query.setProductId(couponId); - List statusS = new ArrayList(); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); - statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode()); - query.setStatusS(statusS); - query.setTenantId(tenantId); - return wxOrderMapper.countList(query); - } - - private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) { - if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) { - Date now = new Date(); - if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) { - logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED); - } - if (wxCouponChannel.getEndTime().getTime() < now.getTime()) { - logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END); - } - } - - if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) { - logger.error("此券已下架:" + orderSaveDto.getCouponChannelId()); - return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); - } - return null; - } - - private ResultData couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon) { - if (coupon.getConditions() == null) return null; - JSONObject jo = null; - try { - jo = JSONObject.parseObject(coupon.getConditions()); - } catch (Exception e) { - logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); - } - if (jo != null) { - if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){ - - if (user != null && user.getActRecord() > 0) - return new ResultData(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER); - if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0) - return new ResultData(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER); - }else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){ - int max = jo.getIntValue("max"); - int min = jo.getIntValue("min"); - - if (max!=0 && min ==0 && user.getPoins() > max) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - if (max==0 && min !=0 && user.getPoins() < min) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) { - return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); - } - } - } - - return null; + ttOrder.setTtCoupon(coupon); + return ttOrder; } } diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 2db785888..5a8819006 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -164,135 +164,4 @@ public class TtOrderController extends BaseController { return new ResultData(order); } - @ApiOperation(value = "根据orderId查询接口", notes = "{\"orderId\":\"string\"}") - @GetMapping("/findById") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) - }) - public ResultData findById(String orderId) { - if (orderId == null || orderId.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - Long id = 0L; - try { - id = Long.valueOf(orderId); - } catch (NumberFormatException e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); - } - WxOrder order = null; - try { - order = wxOrderService.getById(id,getTenantInfo().getTenantId()); - if (order != null) { - return new ResultData(Result.SUCCESS, "查询成功", order); - } else { - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } catch (Exception e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); - } - } - - @ApiOperation(value = "获取未支付订单", notes = "{\"couponId\":\"string\"}") - @GetMapping("getUnPaidOrder") - @ApiImplicitParams({ - @ApiImplicitParam(name = "couponId", value = "券id", dataType = "String", paramType = "query", required = true) - }) - public ResultData getUnPaidOrder(String couponId) { - if (couponId == null || couponId.equalsIgnoreCase(Constant.UNDEFINED)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - Long id = 0L; - try { - id = Long.valueOf(couponId); - } catch (NumberFormatException e) { - logger.error("parse couponId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "券ID转换异常"); - } - WxCoupon wxCoupon = null; - try { - wxCoupon = wxCouponService.getById(id,getTenantInfo().getTenantId()); - } catch (Exception e) { - logger.error("券ID获取券信息失败, couponId: " + couponId); - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - if(wxCoupon == null) { - logger.error("券ID获取券信息失败, couponId: " + couponId); - return new ResultData(ErrorCode.COUPON_IS_EMPTY); - } - - WxOrder order = null; - try { - WxCUserBasicInfo member = wxCUserBasicInfoService.getById(getMemberId(),getTenantInfo().getFinalTenantId()); - if(member == null) { - logger.error("会员用户未找到: " + getMemberId()); - throw new MallinkException(ErrorCode.USER_IS_EMPTY.getCode(), "会员用户未找到" + getMemberId()); - } - order = wxOrderService.getUnPaidOrder(member, wxCoupon); - if (order != null) { - return new ResultData(Result.SUCCESS, "查询成功", order); - } else { - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } catch (Exception e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.DB_FAIL.getCode(), "订单查询未成功,e:" + e.getMessage()); - } - } - - @ApiOperation("我的砍价-分页列表接口") - @GetMapping("pressOrderList") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) - public ResultData pressOrderList(@ModelAttribute WxOrder wxOrder, Integer pageNum, Integer pageSize) { - // c端用户应该只能看到自己的订单 - if (wxOrder == null) wxOrder = new WxOrder(); - Long memberId; - try { - memberId = getMemberId(); - } catch (Exception e) { - return new ResultData(Result.ERROR,e.getMessage()); - } - wxOrder.setCUserId(memberId); - wxOrder.setSortColumns(BaseEntity.SortField.CreateDate_DESC); - final PageInfo page = wxOrderService.listPressVoAsPage(wxOrder, pageNum, pageSize); - return new ResultData(page); - } - - @ApiOperation("砍价订单-详情接口") - @GetMapping("pressOrderDetail") - @ApiImplicitParams({ - @ApiImplicitParam(name = "orderId", value = "订单id", dataType = "String", paramType = "query", required = true) - }) - public ResultData pressOrderDetail(String orderId) { - // c端用户应该只能看到自己的订单细节 - WxOrder wxOrder = new WxOrder(); - if(StringUtils.isBlank(orderId)) { - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID不能为空"); - } - Long id = 0L; - try { - id = Long.valueOf(orderId); - } catch (NumberFormatException e) { - logger.error("parse orderId failed"); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "订单ID转换异常"); - } - wxOrder.setId(id); - wxOrder.updateTenantInfo(getTenantInfo()); - try { - final WxOrderCouponPressVo orderCouponPressVo = wxOrderService.detailPressVo(wxOrder); - if (orderCouponPressVo == null) { - logger.error("orderCouponPressVo is null: " + orderId); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - return new ResultData(orderCouponPressVo); - } catch (Exception e) { - logger.error("SQL: " + e.getMessage()); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND); - } - } - - } diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java new file mode 100644 index 000000000..007e75380 --- /dev/null +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtPayOrderController.java @@ -0,0 +1,223 @@ +package com.iformall.controller; + +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.po.tt.TtCUser; +import com.iformall.enums.EnumCreditLockedStatus; +import com.iformall.enums.EnumOrderStatus; +import com.iformall.enums.EnumPayStatus; +import com.iformall.enums.EnumPayWay; +import com.iformall.exception.MallinkException; +import com.iformall.service.*; +import com.iformall.service.pay.entity.PayExtraParam; +import com.iformall.utils.IPUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +@RestController +@RequestMapping("/api/pay") +@Api(description = "支付相关接口") +public class TtPayOrderController extends BaseController { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxPayOrderService wxPayOrderService; + + @Autowired + private WxOrderService wxOrderService; + + @Autowired + private WxCUserBasicInfoService wxCUserBasicInfoService; + + @Autowired + private WxPayAccountService wxPayAccountService; + + @Autowired + private WxCouponService wxCouponService; + + @Autowired + private WxAppinfoService wxAppinfoService; + + /** + * 微信支付 + * @param paramMap + * @param request + * @return + * @throws Exception + */ + //@ApiOperation(value = "发起微信小程序支付订单", notes = "{\"orderId\":\"string\"}") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ResultData _create(@RequestBody Map paramMap, HttpServletRequest request) throws Exception { + logger.info("/api/pay/create" + paramMap.toString()); + String orderIdStr = paramMap.get("orderId"); + if (StringUtils.isBlank(orderIdStr)) { + logger.info("orderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + + TtCUser user = getTtCUser(); + if (!user.basicInfoIs()) { + logger.error("暂未成为会员,请授权手机号"); + return new ResultData(ErrorCode.USER_IS_NOT_MEMBER.getCode(), "暂未成为会员,请授权手机号"); + } + + return _create(orderIdStr,user.getUserId(),EnumPayWay.PAY_WAY_TT,user.getAppId(),new PayExtraParam("openId",user.getOpenId()),request); + } + + private ResultData _create(String orderIdStr,Long userId, EnumPayWay payWay,String appId,PayExtraParam parm,HttpServletRequest request) { + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(userId,getTenantInfo().getFinalTenantId()); + if ( null == wxCUserBasicInfo) { + logger.error("会员用户不存在."+userId); + return new ResultData(ErrorCode.USER_IS_EMPTY.getCode(),"会员用户不存在."+userId); + } + if (null != wxCUserBasicInfo && EnumCreditLockedStatus.CLOSE.getCode().equals(wxCUserBasicInfo.getStatus())) { + return new ResultData(ErrorCode.MEMBER_IS_LOCKED); + } + WxAppinfo appInfo = wxAppinfoService.getByAppId(appId); + if(appInfo == null) { + return new ResultData(ErrorCode.APP_ID_NOT_FOUND); + } + Long orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); + } + WxPayOrder record = new WxPayOrder(); + record.setOrderId(orderId); + try { + record.setIp(IPUtil.getIpAddr(request)); + return wxPayOrderService.createPayOrder(appInfo, wxCUserBasicInfo, record, payWay,parm); + } catch (MallinkException e) { + logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("payment wechat, order create error, req 3: " + record.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); + } + } + + @ApiOperation(value = "更新支付订单状态", notes = "{\"payOrderId\":\"string\",\"orderId\":\"string\",\"status\":integer,\"reason\":\"string\"}") + @PostMapping("/updatePayOrder") + public ResultData updatePayOrder(@RequestBody Map paramMap) { + logger.info("/api/pay/updatePayOrder" + paramMap.toString()); + String payOrderIdStr = (String) paramMap.get("payOrderId"); + String orderIdStr = (String) paramMap.get("orderId"); + String reasonStr = (String) paramMap.get("reason"); + Integer status = (Integer) paramMap.get("status"); + if (StringUtils.isBlank(orderIdStr)) { + logger.info("orderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空"); + } + Long payOrderId = 0L, orderId = 0L; + try { + orderId = Long.valueOf(orderIdStr); + } catch (NumberFormatException e) { + logger.error("orderId参数不正确: " + paramMap.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId参数不正确"); + } + if (!StringUtils.isBlank(payOrderIdStr)) { + try { + payOrderId = Long.valueOf(payOrderIdStr); + } catch (NumberFormatException e) { + logger.error("payOrderId参数不正确: " + paramMap.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId参数不正确"); + } + } + + if(payOrderIdStr.equalsIgnoreCase("0")) { + // 免费券直接返回成功 + return new ResultData(Result.SUCCESS, "免费券支付状态更新成功"); + } + + WxPayOrder payOrder = new WxPayOrder(); + payOrder.setId(payOrderId); + payOrder.setPayOrderNo(String.valueOf(payOrderId)); + payOrder.setOrderId(orderId); + payOrder.setPayOrderStatus(status); + payOrder.setFailReason(reasonStr); + payOrder.updateTenantInfo(getTenantInfo()); + payOrder.setPayVendor(EnumPayWay.PAY_WAY_WECHAT.getCode()); + + try { + //有价券支付成功 + if (status.equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())) { + // 前端提示支付成功, 不作为支付成功标志,只检查支付订单状态 + // 有价券不走update, callback更新 + if (payOrderId<=0) { + logger.error("/api/pay/updatePayOrder error : payOrderId不能为空: " + paramMap.toString()); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId非法"+payOrderId+"[payOrderIdStr:"+payOrderIdStr+"]"); + } + payOrder = wxPayOrderService.getById(payOrderId,payOrder.getTenantId()); + if (null == payOrder) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到payOrder."); + } + WxOrder order = wxOrderService.getById(orderId,payOrder.getTenantId()); + if (null == order) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到Order["+orderId+"]."); + } + WxCoupon wxCoupon = wxCouponService.getById(order.getProductId(),order.getTenantId()); + if (null == wxCoupon) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "未查询到优惠券[orderId:"+orderId+"]."); + } + + //拼团的订单,如果查询到是拼团待付款的,则重新查询是否已经真的支付,其他的直接返回订单信息 + if (wxPayOrderService.isOrderGroupCoupon(payOrder, wxCoupon)) { + if (!order.getOrderStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }else { + //非拼团的订单,支付成功,关闭订单,撤销支付订单,支付转退款的,直接返回订单信息,其他需要查询真实支付状态 + if (payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_SUCCESS.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_CLOSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REVERSE.getCode())|| + payOrder.getPayOrderStatus().equals(EnumPayStatus.PAY_STATUS_REFUND.getCode())) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + } + //查询微信订单状态并更新 + + WxAppinfo appInfo = wxAppinfoService.getCAppInfo(payOrder, EnumPayWay.getEnum(payOrder.getPayVendor())); + //WxCUser user = getUser(); + //WxAppinfo appInfo = getAppInfo(user.getAppId()); + if (null == appInfo) { + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "当前支付类型["+payOrder.getPayVendor()+"]找不到C端appInfo"); + } + WxPayAccount payAccount = wxPayAccountService.getById(appInfo.getPayId()); + try { + WxPayOrder wo = wxPayOrderService.handleWxOrderQuery(payOrder, order, appInfo, payAccount, IdWorker.get(),false); + if (null != wo) { + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + }catch(MallinkException e) { + //已经同步了微信的支付状态,表示已经更新 + return new ResultData(Result.SUCCESS, "支付状态更新成功", order); + } + + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "查询微信订单支付状态失败,请稍后!"); + } else if (status.equals(EnumPayStatus.PAY_STATUS_FAIL.getCode())) { + // 有价券支付失败 + wxPayOrderService.handlePayOrderFail(payOrder, EnumPayStatus.PAY_STATUS_FAIL.getCode()); + } + return new ResultData(Result.SUCCESS, "支付状态更新成功"); + } catch (MallinkException e) { + logger.error("支付状态更新失败2: " + payOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error("支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); + return new ResultData(ErrorCode.PAY_ORDER_ERROR, "支付状态更新失败3: " + payOrder.toString() + ", e:" + e.getMessage()); + } + } +}