From 013e429c416ce3f824044452740ca0466cd6d7b0 Mon Sep 17 00:00:00 2001 From: xhxu Date: Thu, 13 May 2021 18:19:24 +0800 Subject: [PATCH] tt --- .../com/iformall/domain/po/tt/TtCoupon.java | 2 + .../com/iformall/domain/po/tt/TtOrder.java | 10 + .../com/iformall/mapper/TtOrderMapper.java | 47 - .../iformall/service/tt/TtOrderService.java | 18 + .../service/tt/impl/TtOrderServiceImpl.java | 2501 +++++++++++++++++ .../main/resources/mapper/TtCouponMapper.xml | 10 +- .../main/resources/mapper/TtOrderMapper.xml | 956 +------ .../controller/TtOrderController.java | 66 +- 8 files changed, 2605 insertions(+), 1005 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.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 f9791bf03..e6c2791fb 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 @@ -117,6 +117,8 @@ public class TtCoupon extends TenantEntity { private Long merchantId; @io.swagger.annotations.ApiModelProperty(value="",name="merchantName") private String merchantName; + @io.swagger.annotations.ApiModelProperty(value="",name="merchantPic") + private String merchantPic; @io.swagger.annotations.ApiModelProperty(value="业态",name="businessId") private Long businessId; 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 c607c9aae..47f0beb80 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 @@ -32,6 +32,8 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String productPic; @TableField(exist = false) + private Long authorId; + @TableField(exist = false) private String author; @TableField(exist = false) private String authorPic; @@ -64,4 +66,12 @@ public class TtOrder extends TenantEntity { @TableField(exist = false) private String paymentStr; + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-起始时间",name="startdate") + private Date startdate; + + @TableField(exist = false) + @io.swagger.annotations.ApiModelProperty(value="查询-结束时间",name="enddate") + private Date enddate; + } diff --git a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java index d10c6995c..29064cc4f 100644 --- a/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java +++ b/mallinkService/src/main/java/com/iformall/mapper/TtOrderMapper.java @@ -16,51 +16,4 @@ public interface TtOrderMapper extends CommonMapper { List findList(TtOrder record); - Integer countList(WxOrder wxOrder); - int countCouponConditionType1(WxOrder wxOrder); - - List findListOfUnpaidOrderByDate(Map dateMap); - - List findListOfUnpaidPressOrderByDate(Map dateMap); - List findListOfCompleteUnPaidPressOrderByDate(Map dateMap); - - List findListOfUnpaidGroupOrderByDate(Map dateMap); - - List findListOfCUser(WxOrder wxOrder); - List selectDetailOfCUser(WxOrder wxOrder); - - /** B端收银台(收款码支付) */ - Map dayMicroPayAmountList(Map dateMap); - List findListOfMicroPayOrderByDate(Map dateMap); - List findListOfExpMicroPayOrderByDate(Map dateMap); - - List queryForSceneRepotyHistory(HashMap params); - - List listOrderReportByDate(HashMap params); - - List listMicroPayOrderReportByDateAndMerchant(HashMap params); - - List findListOfMerchantMicroPayOrderByDate(@Param("wxOrderReportDto") WxOrderReportDto wxOrderReportDto, @Param("tenantEntitys")List tenantEntitys); - - List findListOrder(WxOrderQueryVo record); - - Long queryOrderForMerchantCount(Map params); - - Long queryOrderForSum(Map params); - - Long queryOrderForCount(Map params); - - /**砍价*/ - List findListOfPress(WxOrder wxOrder); - WxOrderCouponPressVo selectDetailOfPress(WxOrder wxOrder); - void updateStatusByPressCouponId(WxOrder wxOrder); - - void updateStatusByOrderGroupId(WxOrder order); - - void updateOrderGroupStatusByCouponId(WxOrder updateOrder); - - void updateOrderGroupStatusByCouponChannelId(WxOrder updateOrder); - - void updateOrderStatusForGroup(@Param("tenantId")String tenantId); - } diff --git a/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java new file mode 100644 index 000000000..d113adc52 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/tt/TtOrderService.java @@ -0,0 +1,18 @@ +package com.iformall.service.tt; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.tt.TtOrder; + +public interface TtOrderService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize); + +} 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 new file mode 100644 index 000000000..96636d798 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/tt/impl/TtOrderServiceImpl.java @@ -0,0 +1,2501 @@ +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.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.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 +public class TtOrderServiceImpl implements TtOrderService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private TtOrderMapper ttOrderMapper; + + @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; + + @Override + public PageInfo listAsPage(TtOrder record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> ttOrderMapper.findList(record)); + } + + @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 + public WxOrder saveOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress,EnumPayWay payWay) { + WxOrder order = null; + // 防止同一用户重复抽奖(一分钟内) + // 1. 订单保存时 加入redis缓存,key --> action:userId:couponId , 时间1000ms + // 2. 如果存在,说明该用户正在下单,返回异常提示 + // 3. 方法结束时清除 key + if (checkCouponIsFree(coupon)) { + // 免费券 + String key = StringUtils.join("action", ":", user.getId(), coupon.getId()); + boolean hasKey = cUserBasicInfoRedisTemplate.hasKey(key); + if (hasKey) { + logger.error("用户正在下单,请求异常返回,user: {} " + JSON.toJSONString(user)); + throw new MallinkException(ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION); + } + cUserBasicInfoRedisTemplate.opsForValue().set(key, user, 1000, TimeUnit.MILLISECONDS); + + order = saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,payWay); + if (order != null) { + // 6. 下订单完成,发送内部消息 + // 下订单完成,发送内部消息 + try { + sendOrderSuccessActionMsg(order); + } catch (Exception e) { + logger.error("内部消息发送失败: " + e.getMessage()); + throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR); + } + } + } else { + // 有价券 + order = saveNoFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), isPress, orderSaveDto.getOrderGroupId(), orderSaveDto.getFormId()); + } + // couponActionLog + try { + wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderSaveDto.getCouponChannelId(),0L); + } catch (Exception e) { + // 库存恢复 + stockBack(order); + logger.error("保存订单:" + e.getMessage()); + throw new MallinkException(ErrorCode.ORDER_SAVE_ERR); + } + return order; + } + + @Override + public boolean checkCouponIsFree(WxCoupon coupon) { + return coupon.getSalePrice() == 0; + } + + @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); + } + + + @Override + public ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) { + logger.info("OrderSave: " + orderSaveDto); + if (orderSaveDto.getCouponChannelId() == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空"); + } + WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId()); + if (wxCouponChannel == null) { + logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId()); + return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); + } + ResultData resultData = couponChannelCheck(orderSaveDto, wxCouponChannel); + if (resultData != null) return resultData; + + WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId()); + if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) { + logger.info("会员权益被锁定:cUserId:" + cUserId); + return new ResultData(ErrorCode.MEMBER_IS_LOCKED); + } + + WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId()); + if (null == coupon) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF); + } + //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 + if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { + int ordercount = this.countUserCouponGroupOrder(cUserId,coupon.getId(),coupon.getTenantId()); + if (ordercount>=coupon.getUseLimitQuantity()) { + return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),"您当前此券的有效拼团数量达到券的限购次数。"); + } + } + + WxCouponCVo wxCouponCVo = null; + + String key = "cc:" + orderSaveDto.getCouponChannelId(); + ValueOperations operations = cdRedisTemplate.opsForValue(); + // 缓存 + boolean hasKey = cdRedisTemplate.hasKey(key); + if (hasKey) { + // 从缓存获取用户信息 + wxCouponCVo = operations.get(key); + } else { + // 游戏没有入缓存,需要从数据库中读取 + wxCouponCVo = wxCouponChannelService.findDetailVo(orderSaveDto.getCouponChannelId(),wxCouponChannel.getTenantId()); + if (wxCouponCVo != null) { + // 游戏优化,进缓存 + cdRedisTemplate.opsForValue().set(key, wxCouponCVo, 3600, TimeUnit.SECONDS); + } + } + if (wxCouponCVo == null) { + return new ResultData(ErrorCode.COUPON_IS_EMPTY); + } + + //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 + boolean hascache = redisLock.hasCouponStockCache(wxCouponCVo.getCouponId()); + if (!hascache) { + long time = System.currentTimeMillis() + RedisLock.TIMEOUT; + String timeStr = String.valueOf(time); + boolean stocksetlock = redisLock.lock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + if (stocksetlock) { + try { + if (!redisLock.hasCouponStockCache(wxCouponCVo.getCouponId())) { + redisLock.setCouponStock(wxCouponCVo.getCouponId(), coupon.getRemainInventory()); + } + }catch(Exception e) { + logger.error("save order stock cache error.",e); + }finally { + redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + } + }else { + redisLock.unlock("couponLockStockSetByOrder_"+coupon.getId(), timeStr); + } + } + + resultData = couponUserCheck(wxCUserBasicInfo, wxCouponCVo); + if (resultData != null) return resultData; + + Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId(); + if (couponId == null) { + logger.error("couponChannelId或者couponId不能为空"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId或者couponId不能为空"); + } + // 是否砍价 + boolean isPress = orderSaveDto.getPress() != null ? orderSaveDto.getPress() : false; + + try { + WxOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, coupon, orderSaveDto, isPress,payWay); + return new ResultData(order); + } catch (MallinkException e) { + logger.error(e.getMessage()); + return new ResultData(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage()); + } + } + + 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; + } + +} diff --git a/mallinkService/src/main/resources/mapper/TtCouponMapper.xml b/mallinkService/src/main/resources/mapper/TtCouponMapper.xml index 6df1b5d25..f59e9e4bd 100644 --- a/mallinkService/src/main/resources/mapper/TtCouponMapper.xml +++ b/mallinkService/src/main/resources/mapper/TtCouponMapper.xml @@ -37,6 +37,7 @@ + @@ -47,7 +48,7 @@ `sale_price`, `orig_price`, `is_preview`, `preview_duration`, `detail`, `false_sell_count`, `dy_title`, `inventory`, `remark`, `status`, `create_date`, `update_date`, `see_count`, `sell_count`, `assess_count`, `collect_count`, `is_del`, - `column_id`, `popularity`, `merchant_id`, `merchant_name`, `business_id`, `business_name` + `column_id`, `popularity`, `merchant_id`, `merchant_name`,`merchant_pic`, `business_id`, `business_name` @@ -88,8 +89,11 @@ and `status` = #{status} - - and `create_date` between #{startdate} and #{enddate} + + and `create_date` >= #{startdate} + + + and `create_date` <= #{enddate} diff --git a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml index 549109966..02bc84b9b 100644 --- a/mallinkService/src/main/resources/mapper/TtOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/TtOrderMapper.xml @@ -15,978 +15,100 @@ + + + + + + - `id`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`coupon_channel_id`,`product_id`,`type`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date`,`detail`, - `press_end_date`,`press_current_num`,`press_current_value`,`order_group_id`,`form_id`,`total_payment` + o.`id`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`product_id`,o.`type`,o.`payment_type`,o.`payment`, + o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`, + u.`nick_name`,u.`phone`, + c.`title` product_title,c.`coverImg` product_pic, + m.`name` author,m.`imgUrl` author_pic where 1 = 1 - and `id` = #{id} - - - - and `order_number` = #{orderNumber} + and o.`id` = #{id} - and `tenant_id` = #{tenantId} + and o.`tenant_id` = #{tenantId} - and `parent_tenant_id` = #{parentTenantId} + and o.`parent_tenant_id` = #{parentTenantId} - and `c_user_id` = #{cUserId} - - - - and `coupon_channel_id` = #{couponChannelId} + and o.`c_user_id` = #{cUserId} - and `product_id` = #{productId} + and o.`product_id` = #{productId} - and `type` = #{type} + and o.`type` = #{type} - and `payment_type` = #{paymentType} + and o.`payment_type` = #{paymentType} - - and `payment` = #{payment} + + and o.`payment_time` >= #{startdate} - - - and `payment_time` = #{paymentTime} + + and o.`payment_time` <= #{enddate} - and `order_status` = #{orderStatus} - - - - and `create_date` = #{createDate} + and o.`order_status` = #{orderStatus} - - and `update_date` = #{updateDate} + + and u.`nick_name` like concat('%', #{nickName},'%') - - and `detail` like concat('%', #{detail},'%') + + and u.`phone` like concat('%', #{phone},'%') - - and `press_end_date` = #{pressEndDate} + + and c.`title` like concat('%', #{productTitle},'%') - - and `press_current_num` = #{pressCurrentNum} + + and c.merchant_id = #{authorId} - - and `press_current_value` = #{pressCurrentValue} - - - - and `order_group_id` = #{orderGroupId} - - - - and `form_id` = #{formId} - - - - and `order_status` in - - #{sItem} - + + and m.`name` like concat('%', #{author},'%') - and id in + and o.`id` in #{idItem} - order by ${sortColumns} + order by o.`update_date` desc - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.detail,c.remark,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date, - co.id as coupon_order_id,co.coupon_order_status,c.support_transfer,c.subsidy_num - - - - update wx_order set order_status=#{orderStatus} - where product_id=#{productId} - and press_end_date is not null and order_status in (6,7) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=#{orderStatus},update_date=#{updateDate} - where product_id=#{productId} and order_status in(10,15) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=#{orderStatus},update_date=#{updateDate} - where coupon_channel_id=#{couponChannelId} and order_status in(10,15) - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status,o.create_date,o.update_date, - c.type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.tail_price,c.orig_price,c.unit,c.valid_start_date,c.valid_end_date,c.pick_start_date,c.pick_end_date - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.`id`,o.`order_number`,o.`tenant_id`,o.`parent_tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, - o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, - m.name as merchant_name, bu.name, bu.phone as bphone, - cubi.phone, cubi.nick_name, cubi.name c_user_name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.`id`,o.`order_number`,o.`tenant_id`,o.`c_user_id`,o.`coupon_channel_id`,o.`product_id`,o.`type`, - o.`payment_type`,o.`payment`,o.`payment_time`,o.`order_status`,o.`create_date`,o.`update_date`,o.`detail`, - m.name as merchant_name, bu.name, bu.phone as bphone, - cubi.phone, cubi.nick_name, cubi.name c_user_name, - po.id as pay_order_id, po.transaction_id - - - - - - - - - - - - - - - - - - - - - - wm.id as id, - wm.tenant_id as tenant_id, - wm.parent_tenant_id as parent_tenant_id, - wm.name as merchant_name, - wm.link_phone as merchant_phone, - mo.xTime as report_date, - (case when mo.amount > 0 then mo.amount else 0 end) trade_amt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, - o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, - c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.press_limit_num - - - - o.id,o.order_number,o.tenant_id,o.parent_tenant_id,o.c_user_id,o.coupon_channel_id,o.product_id,o.payment_type,o.payment,o.payment_time,o.order_status, - o.create_date,o.update_date,o.press_end_date,o.press_current_num,o.press_current_value, - c.type as coupon_type,c.cover_img,c.title,c.sub_title,c.sale_price,c.use_price,c.price,c.unit,c.detail,c.remark,c.press_limit_num, - co.id as coupon_order_id,co.coupon_order_status - - - - - - - - update wx_order set order_status=#{orderStatus} - where order_group_id=#{orderGroupId} and order_status=10 - - and `tenant_id` = #{tenantId} - - - and `parent_tenant_id` = #{parentTenantId} - - - - - update wx_order set order_status=12 where `type`=0 and tenant_id = #{tenantId} and order_status in(10,15) and now()>press_end_date - diff --git a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java index 1d3cc36a6..727a85687 100644 --- a/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java +++ b/mallinkTTCApi/src/main/java/com/iformall/controller/TtOrderController.java @@ -9,6 +9,7 @@ import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxOrder; import com.iformall.domain.po.base.BaseEntity; +import com.iformall.domain.po.tt.TtOrder; import com.iformall.domain.vo.WxCouponCVo; import com.iformall.domain.vo.WxOrderCouponPressVo; import com.iformall.domain.vo.WxOrderCouponVo; @@ -18,6 +19,7 @@ import com.iformall.service.WxCUserBasicInfoService; import com.iformall.service.WxCouponChannelService; import com.iformall.service.WxCouponService; import com.iformall.service.WxOrderService; +import com.iformall.service.tt.TtOrderService; import com.iformall.utils.Constant; import com.iformall.utils.RedisLock; import io.swagger.annotations.Api; @@ -39,13 +41,16 @@ import java.util.Map; @RequestMapping("/api/order/") @Api(description = "订单相关接口") public class TtOrderController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired - private WxCouponChannelService wxCouponChannelService; + private TtOrderService ttOrderService; + + WxOrderService wxOrderService; @Autowired - private WxOrderService wxOrderService; + private WxCouponChannelService wxCouponChannelService; @Autowired private WxCouponService wxCouponService; @@ -60,6 +65,27 @@ public class TtOrderController extends BaseController { @Autowired RedisLock redisLock; + @ApiOperation("分页订单列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), + }) + public ResultData list(@ModelAttribute TtOrder order, Integer pageNum, Integer pageSize) { + // c端用户应该只能看到自己的订单 + if (order == null){ + order = new TtOrder(); + } + Long memberId; + try { + memberId = getMemberId(); + } catch (Exception e) { + return new ResultData(Result.ERROR,e.getMessage()); + } + order.setCUserId(memberId); + return new ResultData(ttOrderService.listAsPage(order, pageNum, pageSize)); + } + @ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}") @PostMapping("save") public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) { @@ -128,43 +154,7 @@ public class TtOrderController extends BaseController { return new ResultData(); } - @ApiOperation("分页订单列表接口") - @GetMapping("list") - @ApiImplicitParams({ - @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), - @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true), - }) - public ResultData list(@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.UpdateDate_DESC); - final PageInfo page = wxOrderService.listCUserVoAsPage(wxOrder, pageNum, pageSize); - Date now = new Date(); - page.getList().stream().forEach(oc->{ - if (oc.getValidStartDate() != null && oc.getValidEndDate() != null ) { - if (oc.getValidStartDate().getTime() > now.getTime()) { - oc.setValidStatus(EnumCouponOrderValidStatus.PREPARED.getCode()); - } else if (oc.getValidEndDate().getTime() < now.getTime()) { - oc.setValidStatus(EnumCouponOrderValidStatus.ENDED.getCode()); - } else { - oc.setValidStatus(EnumCouponChannelActivityStatus.STARTED.getCode()); - } - } - }); - - - return new ResultData(page); - } @ApiOperation("订单详情接口") @GetMapping("detail")