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

tbOrder新增vipPromotion字段,获取支付参数和完成订单时加入会员优惠逻辑

codingliang 7 месяцев назад
Родитель
Сommit
a58f832871

+ 8 - 0
db/update_251111.sql

@@ -45,3 +45,11 @@ alter table pay_details add extra varchar(100) comment '额外备用参数' afte
 
 
 -- 商品添加参与vip优惠标识 0否 1是
 -- 商品添加参与vip优惠标识 0否 1是
 alter table goods_shop add vip_promotion varchar(1) not null default 0 comment '是否参与vip优惠 0否 1是';
 alter table goods_shop add vip_promotion varchar(1) not null default 0 comment '是否参与vip优惠 0否 1是';
+
+-- 新增会员每单立减金额(元)、会员每天优惠单数(个)配置
+INSERT INTO `tcwm2.5`.`common_info`(`id`, `create_at`, `max`, `min`, `type`, `value`, `condition_from`) VALUES (444, '2025-13-13 14:47:44', NULL, '会员每单立减金额(元)', 444, '2', 'huiyuan');
+INSERT INTO `tcwm2.5`.`common_info`(`id`, `create_at`, `max`, `min`, `type`, `value`, `condition_from`) VALUES (445, '2025-13-13 14:47:44', NULL, '会员每天优惠单数(个)', 445, '2', 'huiyuan');
+
+-- 订单添加是否会员优惠字段 0否 1是
+alter table tb_order add vip_promotion varchar(1) not null default '0' comment '是否会员优惠 0否 1是';
+CREATE INDEX idx_user_vip_pay_time ON tb_order(user_id, vip_promotion, is_pay, pay_time);

+ 12 - 9
src/main/java/com/sqx/modules/order/entity/TbOrder.java

@@ -135,6 +135,18 @@ public class TbOrder implements Serializable {
     @ApiModelProperty("打印状态  已打印:1 未打印:0")
     @ApiModelProperty("打印状态  已打印:1 未打印:0")
     private Integer isPrint;
     private Integer isPrint;
 
 
+    @ApiModelProperty("超时时间")
+    private Long timeOut;
+
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    @ApiModelProperty("快跑者回调订单号")
+    private String tradeNo;
+
+    @ApiModelProperty("是否会员优惠 0否 1是")
+    private String vipPromotion;
+
     @ApiModelProperty("商铺名")
     @ApiModelProperty("商铺名")
     @TableField(exist = false)
     @TableField(exist = false)
     private String shopName;
     private String shopName;
@@ -267,9 +279,6 @@ public class TbOrder implements Serializable {
     @ApiModelProperty("站点名称")
     @ApiModelProperty("站点名称")
     private String stationName;
     private String stationName;
 
 
-    @ApiModelProperty("超时时间")
-    private Long timeOut;
-
     @ApiModelProperty("交易号")
     @ApiModelProperty("交易号")
     @TableField(exist = false)
     @TableField(exist = false)
     private String transactionId;
     private String transactionId;
@@ -291,10 +300,4 @@ public class TbOrder implements Serializable {
     @ApiModelProperty("完成订单时间")
     @ApiModelProperty("完成订单时间")
     @TableField(exist = false)
     @TableField(exist = false)
     private String finishTime;
     private String finishTime;
-
-    @ApiModelProperty("身份证号")
-    private String idCard;
-
-    @ApiModelProperty("快跑者回调订单号")
-    private String tradeNo;
 }
 }

+ 68 - 8
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -103,6 +103,7 @@ import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.modules.sys.entity.SysUserEntity;
 import com.sqx.modules.sys.entity.SysUserEntity;
 import com.sqx.modules.sys.service.SysUserService;
 import com.sqx.modules.sys.service.SysUserService;
 import com.sqx.modules.utils.SenInfoCheckUtil;
 import com.sqx.modules.utils.SenInfoCheckUtil;
+import com.sqx.modules.utils.VipExpirationUtil;
 import com.sqx.modules.utils.excel.EasyExcelUtil;
 import com.sqx.modules.utils.excel.EasyExcelUtil;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.excel.ExcelData;
 import com.sqx.modules.utils.fieYun.FeiYunUtils;
 import com.sqx.modules.utils.fieYun.FeiYunUtils;
@@ -497,9 +498,6 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         // 给支付的时候商品描述用
         // 给支付的时候商品描述用
         parentOrder.setShopName(goodsShop.getShopName());
         parentOrder.setShopName(goodsShop.getShopName());
 
 
-        // // 设置订单类型
-        // parentOrder.setOrderType(payOrderDTO.getOrderType());
-
         // 校验订单类型
         // 校验订单类型
         checkOrderType(parentOrder, payOrderDTO, goodsShop);
         checkOrderType(parentOrder, payOrderDTO, goodsShop);
 
 
@@ -518,6 +516,9 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         // 校验优惠券信息
         // 校验优惠券信息
         checkCoupon(parentOrder, userId);
         checkCoupon(parentOrder, userId);
 
 
+        // 校验是否参与vip优惠
+        checkVipPromotion(parentOrder, goodsShop, userId);
+
         // 计算店铺收益
         // 计算店铺收益
         calcShopIncome(parentOrder, goodsShop);
         calcShopIncome(parentOrder, goodsShop);
 
 
@@ -2226,14 +2227,16 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         contentBuffer.append("平台服务费:").append(pingRate.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
         contentBuffer.append("平台服务费:").append(pingRate.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
         contentBuffer.append("短信服务费:").append(smsSendMoney.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
         contentBuffer.append("短信服务费:").append(smsSendMoney.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
         if (ObjectUtils.isNotEmpty(tbOrder.getOrderTypeExtra())&&tbOrder.getOrderTypeExtra()==2) {
         if (ObjectUtils.isNotEmpty(tbOrder.getOrderTypeExtra())&&tbOrder.getOrderTypeExtra()==2) {
-            //        配送费大于等于1.5就不需要骑手额外配送费
-//            if (tbOrder.getErrandMoney().doubleValue()<1.5) {
-                contentBuffer.append("骑手额外配送费:").append(rider.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
-//            }
+            contentBuffer.append("骑手额外配送费:").append(rider.setScale(2, BigDecimal.ROUND_DOWN)).append(",");
         }
         }
-        contentBuffer.append("到账金额:").append(shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
 
 
+        // 会员优惠
+        if (StrUtil.equals(tbOrder.getVipPromotion(), Constant.YES)) {
+            CommonInfo commonInfo = commonInfoService.findOne(444);
+            contentBuffer.append("会员优惠金额:").append(commonInfo.getValue()).append("元,");
+        }
 
 
+        contentBuffer.append("到账金额:").append(shopMoney.setScale(2, BigDecimal.ROUND_DOWN));
 
 
 
 
         if (shopIds == 0) {
         if (shopIds == 0) {
@@ -2988,4 +2991,61 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             lock.unlock();
             lock.unlock();
         }
         }
     }
     }
+
+    /**
+     * 校验是否参与vip优惠
+     * @param order 订单信息
+     * @param goodsShop 店铺信息
+     * @param userId 用户id
+     */
+    private void checkVipPromotion(TbOrder order, GoodsShop goodsShop, Long userId) {
+        // 检查店铺是否支持会员优惠
+        if (!StrUtil.equals(goodsShop.getVipPromotion(), Constant.YES)) {
+            return;
+        }
+
+        UserEntity user = userService.getById(userId);
+
+        // 检查用户是否为会员,且会员是否过期
+        if(ObjectUtil.isNotNull(user.getIsVip()) && user.getIsVip() == 1 && VipExpirationUtil.isVipValid(user.getVipExpirationTime())) {
+            // 查询用户当天会员优惠单数量
+            int count = getCurDayVipPromotionByUserCount(userId);
+
+            // 会员每天限制优惠单数(单)
+            CommonInfo vipPromotionCount = commonInfoService.findOne(445);
+            if (count >= Integer.parseInt(vipPromotionCount.getValue())) {
+                return;
+            }
+
+            // 会员每单立减金额(元)
+            CommonInfo vipPromotionAmount = commonInfoService.findOne(444);
+            BigDecimal payMoney = order.getPayMoney().subtract(new BigDecimal(vipPromotionAmount.getValue()));
+
+            //如果使用红包后,订单价格小于0,则改为0.01元
+            if (payMoney.doubleValue() <= 0) {
+                payMoney = new BigDecimal("0.01");
+            }
+
+            // 设置订单支付金额
+            order.setPayMoney(payMoney);
+
+            // 订单设置为vip优惠订单
+            order.setVipPromotion(Constant.YES);
+
+            log.info("preOrder==>[{}],订单参与会员优惠,优惠后金额为:{}元", order.getOrderId(), payMoney);
+        }
+    }
+
+    private int getCurDayVipPromotionByUserCount(Long userId) {
+        // 查询用户当天会员优惠单数量
+        QueryWrapper<TbOrder> wrapper = new QueryWrapper<>();
+        wrapper.eq("user_id", userId)
+                .eq("vip_promotion", Constant.YES)
+                .eq("is_pay", Constant.YES)
+                // 8商家拒绝接单 5订单已取消 不纳入统计
+                .notIn("status", "5", "8")
+                .ge("pay_time", LocalDateTime.now().toLocalDate().atStartOfDay())
+                .le("pay_time", LocalDateTime.now().toLocalDate().atTime(23, 59, 59));
+        return count(wrapper);
+    }
 }
 }