Procházet zdrojové kódy

Merge branch 'release_real_20211001' of https://git.malls.iformall.com/server/formallProject into release_real_20211001

release_toaliyun_real
xhxu před 4 roky
rodič
revize
3aa9077899
13 změnil soubory, kde provedl 815 přidání a 391 odebrání
  1. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java
  2. +217
    -0
      mallinkAdmin/src/main/resources/db/migration/V202109070001__order.sql
  3. +1
    -1
      mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java
  4. +15
    -154
      mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java
  5. +20
    -0
      mallinkService/src/main/java/com/iformall/domain/dto/OrderComposeSaveDto.java
  6. +43
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxComposeOrder.java
  7. +6
    -0
      mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java
  8. +13
    -0
      mallinkService/src/main/java/com/iformall/mapper/WxComposeOrderMapper.java
  9. +9
    -5
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  10. +10
    -2
      mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java
  11. +317
    -226
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  12. +156
    -0
      mallinkService/src/main/resources/mapper/WxComposeOrderMapper.xml
  13. +7
    -2
      mallinkService/src/main/resources/mapper/WxOrderMapper.xml

+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java Zobrazit soubor

@@ -188,7 +188,7 @@ public class WxOrderController extends BaseController {
return new ResultData(ErrorCode.COUPON_IS_NOT_FREE); return new ResultData(ErrorCode.COUPON_IS_NOT_FREE);
} }
// 免费券 // 免费券
order = wxOrderService.saveFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT);
order = wxOrderService.saveFreeOrderForCoupon(null,user, coupon, 1,orderSaveDto.getCouponChannelId(), orderSaveDto.getFormId(), null,EnumPayWay.PAY_WAY_NOT_UNPAY_CREDIT);
return new ResultData(order); return new ResultData(order);
} catch (MallinkException e) { } catch (MallinkException e) {
logger.error(e.getMessage()); logger.error(e.getMessage());


+ 217
- 0
mallinkAdmin/src/main/resources/db/migration/V202109070001__order.sql Zobrazit soubor

@@ -0,0 +1,217 @@
CREATE TABLE `wx_compose_order` (
`id` bigint(20) NOT NULL,
`tenant_id` varchar(5) NOT NULL,
`parent_tenant_id` varchar(5) DEFAULT NULL,
`c_user_id` bigint(20) DEFAULT NULL,
`payment_type` smallint(2) DEFAULT NULL COMMENT '0: 付款 1: 退款 2:自动退款 3:A端退款',
`payment` int(11) DEFAULT NULL COMMENT '支付金额:允许有负数,退款时为负值。',
`payment_time` datetime DEFAULT NULL,
`order_status` smallint(2) DEFAULT NULL COMMENT '订单状态:0-待付款;1-已支付;2-已取消(限定时间内未付款);3-待退款;4-已退款;5-退款失败 砍价:6-砍价中,7-砍价完成,8-砍价已过期,9-砍价已取消,10拼团中11拼团成功12拼团超已过期13拼团失败',
`create_date` datetime DEFAULT NULL,
`update_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



ALTER TABLE wx_order_0 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_1 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_2 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_3 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_4 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_5 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_6 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_7 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_8 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_9 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_10 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_11 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_12 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_13 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_14 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_15 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_16 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_17 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_18 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_19 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_20 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_21 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_22 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_23 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_24 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_25 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_26 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_27 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_28 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_29 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_30 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_31 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_32 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_33 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_34 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_35 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_36 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_37 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_38 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_39 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_40 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_41 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_42 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_43 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_44 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_45 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_46 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_47 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_48 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_49 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_50 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_51 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_52 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_53 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_54 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_55 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_56 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_57 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_58 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_59 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_60 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_61 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_62 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_63 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_64 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_65 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_66 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_67 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_68 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_69 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_70 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_71 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_72 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_73 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_74 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_75 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_76 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_77 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_78 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_79 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_80 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_81 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_82 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_83 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_84 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_85 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_86 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_87 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_88 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_89 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_90 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_91 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_92 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_93 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_94 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_95 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_96 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_97 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_98 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';
ALTER TABLE wx_order_99 ADD COLUMN `compose_order_id` bigint(20) COMMENT '组合订单编号';

ALTER TABLE wx_order_0 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_1 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_2 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_3 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_4 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_5 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_6 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_7 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_8 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_9 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_10 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_11 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_12 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_13 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_14 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_15 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_16 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_17 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_18 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_19 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_20 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_21 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_22 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_23 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_24 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_25 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_26 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_27 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_28 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_29 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_30 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_31 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_32 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_33 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_34 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_35 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_36 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_37 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_38 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_39 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_40 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_41 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_42 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_43 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_44 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_45 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_46 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_47 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_48 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_49 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_50 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_51 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_52 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_53 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_54 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_55 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_56 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_57 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_58 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_59 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_60 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_61 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_62 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_63 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_64 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_65 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_66 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_67 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_68 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_69 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_70 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_71 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_72 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_73 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_74 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_75 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_76 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_77 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_78 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_79 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_80 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_81 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_82 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_83 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_84 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_85 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_86 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_87 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_88 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_89 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_90 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_91 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_92 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_93 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_94 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_95 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_96 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_97 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_98 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';
ALTER TABLE wx_order_99 ADD COLUMN `coupon_number` int(8) COMMENT '购买券数量';

+ 1
- 1
mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java Zobrazit soubor

@@ -96,7 +96,7 @@ public class WxCouponPasswordController extends BaseController {


// 3. 领取free coupon // 3. 领取free coupon
try { try {
WxOrder order = orderService.saveFreeOrderForCoupon(member, coupon, null, formId, couponPassword.getId(),payWay);
WxOrder order = orderService.saveFreeOrderForCoupon(null,member, coupon, 1,null, formId, couponPassword.getId(),payWay);
} catch (MallinkException e) { } catch (MallinkException e) {
setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus)); setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus));
logger.error(e.getMessage(),e); logger.error(e.getMessage(),e);


+ 15
- 154
mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java Zobrazit soubor

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.dto.OrderComposeSaveDto;
import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.domain.po.base.BaseEntity; import com.iformall.domain.po.base.BaseEntity;
@@ -32,6 +33,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;


import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.Map; import java.util.Map;


@RestController @RestController
@@ -59,171 +61,30 @@ public class WxOrderController extends BaseController {
@Autowired @Autowired
RedisLock redisLock; RedisLock redisLock;


@ApiOperation(value = "下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}")
@PostMapping("save")
public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) {
@ApiOperation(value = "多个券多个数量组合下订单", notes = "[{\"signleOrder\":{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"},\"count\":8},]")
@PostMapping("composeSave")
public ResultData saveOrder(@RequestBody List<OrderComposeSaveDto> orderSaveDto) {
Long memberId; Long memberId;
try { try {
memberId = getMemberId(); memberId = getMemberId();
} catch (Exception e) { } catch (Exception e) {
return new ResultData(Result.ERROR,e.getMessage()); return new ResultData(Result.ERROR,e.getMessage());
} }
return wxOrderService.saveOrder(orderSaveDto,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo());
return wxOrderService.composeSaveOrder(orderSaveDto,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo());
} }
// private ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay) {
// logger.info("OrderSave: " + orderSaveDto);
// if (orderSaveDto.getCouponChannelId() == null) {
// return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空");
// }
// WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),getTenantInfo().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,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 = wxOrderService.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<String, WxCouponCVo> 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;
//
// @ApiOperation(value = "单个券单个数量下订单", notes = "{\"couponChannelId\":\"String\",\"couponId\":\"String\",\"press\":\"String\",\"orderGroupId\":\"String\",\"formId\":\"String\"}")
// @PostMapping("save")
// public ResultData saveOrder(@RequestBody OrderSaveDto orderSaveDto) {
// Long memberId;
// try { // try {
// WxOrder order = wxOrderService.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());
// }
// memberId = getMemberId();
// } catch (Exception e) {
// return new ResultData(Result.ERROR,e.getMessage());
// }
// return wxOrderService.saveOrder(orderSaveDto,memberId,EnumPayWay.PAY_WAY_WECHAT,getTenantInfo());
// } // }
// 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 (wxOrderService.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;
// }

// private ResultData couponChannelCheck(@RequestBody 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;
// }

@ApiOperation(value = "取消订单", notes = "{\"orderId\":\"string\"}") @ApiOperation(value = "取消订单", notes = "{\"orderId\":\"string\"}")
@PostMapping("cancel") @PostMapping("cancel")
public ResultData cancelOrder(@RequestBody Map<String, String> paramMap) { public ResultData cancelOrder(@RequestBody Map<String, String> paramMap) {


+ 20
- 0
mallinkService/src/main/java/com/iformall/domain/dto/OrderComposeSaveDto.java Zobrazit soubor

@@ -0,0 +1,20 @@
package com.iformall.domain.dto;

import lombok.Data;

import java.io.Serializable;

import com.iformall.domain.po.WxCoupon;

@Data
public class OrderComposeSaveDto implements Serializable {

private static final long serialVersionUID = 1L;

OrderSaveDto signleOrder;//单个券/实物商品
int count;//购买数量
WxCoupon wxCoupon;

}

+ 43
- 0
mallinkService/src/main/java/com/iformall/domain/po/WxComposeOrder.java Zobrazit soubor

@@ -0,0 +1,43 @@
package com.iformall.domain.po;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.iformall.domain.po.base.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
import java.util.List;

@TableName(value = "wx_compose_order")
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class WxComposeOrder extends TenantEntity {

/**
*
*/
private static final long serialVersionUID = 1L;

protected Long id;

@io.swagger.annotations.ApiModelProperty(value="c端用户id",name="cUserId")
private Long cUserId;
@io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款",name="paymentType")
private Integer paymentType;
@io.swagger.annotations.ApiModelProperty(value="支付金额(分):允许有负数,退款时为负值。",name="payment")
private Integer payment;
@io.swagger.annotations.ApiModelProperty(value="支付时间",name="paymentTime")
private Date paymentTime;
@io.swagger.annotations.ApiModelProperty(value="订单状态:-1全部;正向交易:0-已下单/待付款;1-已支付;2-已取消(限定时间内未付款)反向交易:3-已退款; 4-退款失败,5-退款失败; 砍价:6-砍价中,7-砍价完成,8-砍价失败",name="orderStatus")
private Integer orderStatus;
@TableField(exist = false)
protected List<Integer> statusS;
@io.swagger.annotations.ApiModelProperty(value="创建时间/砍价开始时间",name="createDate")
private Date createDate;
@io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate")
private Date updateDate;
}

+ 6
- 0
mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java Zobrazit soubor

@@ -93,6 +93,12 @@ public class WxOrder extends TenantEntity {


@io.swagger.annotations.ApiModelProperty(value="总计支付金额(分),收银台用券时使用",name="totalPayment") @io.swagger.annotations.ApiModelProperty(value="总计支付金额(分),收银台用券时使用",name="totalPayment")
private Integer totalPayment; private Integer totalPayment;
@io.swagger.annotations.ApiModelProperty(value="组合订单编号",name="composeOrderId")
private Long composeOrderId;
@io.swagger.annotations.ApiModelProperty(value="组合订单编号",name="couponNumber")
private Integer couponNumber;


@TableField(exist = false) @TableField(exist = false)
protected List<Integer> statusS; protected List<Integer> statusS;


+ 13
- 0
mallinkService/src/main/java/com/iformall/mapper/WxComposeOrderMapper.java Zobrazit soubor

@@ -0,0 +1,13 @@
package com.iformall.mapper;

import com.iformall.common.CommonMapper;
import com.iformall.domain.po.WxComposeOrder;
import org.apache.ibatis.annotations.Param;

public interface WxComposeOrderMapper extends CommonMapper<WxComposeOrder, Long> {

WxComposeOrder selectById(@Param("id")Long id,@Param("tenantId")String tenantId);
void updateStatusByOrderGroupId(WxComposeOrder order);

}

+ 9
- 5
mallinkService/src/main/java/com/iformall/service/WxOrderService.java Zobrazit soubor

@@ -8,8 +8,10 @@ import javax.servlet.http.HttpServletResponse;


import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.dto.OrderComposeSaveDto;
import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxComposeOrder;
import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCouponOrder; import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.po.WxMerchant; import com.iformall.domain.po.WxMerchant;
@@ -192,7 +194,7 @@ public interface WxOrderService {
* @param coupon * @param coupon
* @return * @return
*/ */
WxOrder saveOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, OrderSaveDto orderSaveDto, boolean isPress,EnumPayWay payWay);
WxComposeOrder saveOrderForCoupon(WxCUserBasicInfo user, List<OrderComposeSaveDto> orderSave,EnumPayWay payWay);
void sendOrderSuccessActionMsg(WxOrder updateOrder); void sendOrderSuccessActionMsg(WxOrder updateOrder);


/** /**
@@ -211,10 +213,10 @@ public interface WxOrderService {
boolean checkCouponIsFree(WxCoupon coupon); boolean checkCouponIsFree(WxCoupon coupon);


// 2. 创建免费订单, 领取 couponOrder // 2. 创建免费订单, 领取 couponOrder
WxOrder saveFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay);
WxOrder saveFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay);


// 3. 创建有价订单 // 3. 创建有价订单
WxOrder saveNoFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, boolean isPress, Long orderGroupId, String formId);
WxOrder saveNoFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, boolean isPress, Long orderGroupId, String formId);


/** /**
* 下订单成功后处理 * 下订单成功后处理
@@ -237,8 +239,10 @@ public interface WxOrderService {
int countGroupOrder(Long groupId,boolean ignoreUnPay,String tenantId); int countGroupOrder(Long groupId,boolean ignoreUnPay,String tenantId);
int countUserCouponGroupOrder(Long cuserId,Long couponId,String tenantId);
int countUserCouponGroupOrder(WxCUserBasicInfo wxCUserBasicInfo,Long couponId,String tenantId);


ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity);
//ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity);
ResultData composeSaveOrder(List<OrderComposeSaveDto> composeOrderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity);


} }

+ 10
- 2
mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java Zobrazit soubor

@@ -10,6 +10,7 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker; import com.iformall.common.IdWorker;
import com.iformall.common.Result; import com.iformall.common.Result;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.dto.OrderComposeSaveDto;
import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.po.*; import com.iformall.domain.po.*;
import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.base.TenantEntity;
@@ -72,7 +73,7 @@ public class WxGameServiceImpl implements WxGameService {


@Autowired @Autowired
private WxOrderService wxOrderService; private WxOrderService wxOrderService;
@Autowired @Autowired
@Qualifier("couponDetailRedisTemplate") @Qualifier("couponDetailRedisTemplate")
RedisTemplate<String, WxCouponCVo> cdRedisTemplate; RedisTemplate<String, WxCouponCVo> cdRedisTemplate;
@@ -444,6 +445,7 @@ public class WxGameServiceImpl implements WxGameService {
Object data = resultData.data; Object data = resultData.data;
Long orderId = 0L; Long orderId = 0L;
Integer addCredit = 0; Integer addCredit = 0;
if(data != null){ if(data != null){
logger.info("userId:"+userId+",中奖了,"+data.toString()); logger.info("userId:"+userId+",中奖了,"+data.toString());
if(data instanceof WxCouponChannelVo){ if(data instanceof WxCouponChannelVo){
@@ -451,7 +453,13 @@ public class WxGameServiceImpl implements WxGameService {
OrderSaveDto orderSaveDto = new OrderSaveDto(); OrderSaveDto orderSaveDto = new OrderSaveDto();
orderSaveDto.setCouponChannelId(vo.getId()); orderSaveDto.setCouponChannelId(vo.getId());
orderSaveDto.setCouponId(vo.getCouponId()); orderSaveDto.setCouponId(vo.getCouponId());
ResultData resultData1 = wxOrderService.saveOrder(orderSaveDto, userId, EnumPayWay.PAY_WAY_WECHAT, wxGame);
List<OrderComposeSaveDto> orderSave = new ArrayList<OrderComposeSaveDto>();
OrderComposeSaveDto ocsd = new OrderComposeSaveDto();
ocsd.setSignleOrder(orderSaveDto);
ocsd.setCount(1);
orderSave.add(ocsd);
ResultData resultData1 = wxOrderService.composeSaveOrder(orderSave, userId, EnumPayWay.PAY_WAY_WECHAT, wxGame);


if(resultData1.code == Result.SUCCESS && resultData1.data != null && resultData1.data instanceof WxOrder){ if(resultData1.code == Result.SUCCESS && resultData1.data != null && resultData1.data instanceof WxOrder){
WxOrder order = (WxOrder)resultData1.data; WxOrder order = (WxOrder)resultData1.data;


+ 317
- 226
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Zobrazit soubor

@@ -22,6 +22,7 @@ import com.iformall.service.*;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
@@ -39,11 +40,13 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ErrorCode; import com.iformall.common.ErrorCode;
import com.iformall.common.IdWorker; import com.iformall.common.IdWorker;
import com.iformall.common.ResultData; import com.iformall.common.ResultData;
import com.iformall.domain.dto.OrderComposeSaveDto;
import com.iformall.domain.dto.OrderSaveDto; import com.iformall.domain.dto.OrderSaveDto;
import com.iformall.domain.dto.WxSharingOrderDto; import com.iformall.domain.dto.WxSharingOrderDto;
import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxAppinfo;
import com.iformall.domain.po.WxCUserBasicInfo; import com.iformall.domain.po.WxCUserBasicInfo;
import com.iformall.domain.po.WxCardInfo; import com.iformall.domain.po.WxCardInfo;
import com.iformall.domain.po.WxComposeOrder;
import com.iformall.domain.po.WxCoupon; import com.iformall.domain.po.WxCoupon;
import com.iformall.domain.po.WxCouponChannel; import com.iformall.domain.po.WxCouponChannel;
import com.iformall.domain.po.WxCouponMerchant; import com.iformall.domain.po.WxCouponMerchant;
@@ -65,6 +68,7 @@ import com.iformall.mapper.WxAppinfoMapper;
import com.iformall.mapper.WxCUserBasicInfoMapper; import com.iformall.mapper.WxCUserBasicInfoMapper;
import com.iformall.mapper.WxCUserMapper; import com.iformall.mapper.WxCUserMapper;
import com.iformall.mapper.WxCardInfoMapper; import com.iformall.mapper.WxCardInfoMapper;
import com.iformall.mapper.WxComposeOrderMapper;
import com.iformall.mapper.WxCouponChannelMapper; import com.iformall.mapper.WxCouponChannelMapper;
import com.iformall.mapper.WxCouponMapper; import com.iformall.mapper.WxCouponMapper;
import com.iformall.mapper.WxCouponMerchantMapper; import com.iformall.mapper.WxCouponMerchantMapper;
@@ -191,11 +195,14 @@ public class WxOrderServiceImpl implements WxOrderService {


@Autowired @Autowired
WxCouponChannelService wxCouponChannelService; WxCouponChannelService wxCouponChannelService;
@Autowired
WxComposeOrderMapper wxComposeOrderMapper;


@Autowired @Autowired
@Qualifier("couponDetailRedisTemplate") @Qualifier("couponDetailRedisTemplate")
RedisTemplate<String, WxCouponCVo> cdRedisTemplate; RedisTemplate<String, WxCouponCVo> cdRedisTemplate;
@Override @Override
public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) {
return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record)); return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxOrderMapper.findList(record));
@@ -346,8 +353,8 @@ public class WxOrderServiceImpl implements WxOrderService {
orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); orderQ.setOrderStatus(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
return wxOrderMapper.countList(orderQ); return wxOrderMapper.countList(orderQ);
} catch (Exception e) { } catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询拼团中订单错误."+e.getMessage());
} }


} }
@@ -376,8 +383,8 @@ public class WxOrderServiceImpl implements WxOrderService {
orderQ.setStatusS(statusS); orderQ.setStatusS(statusS);
return wxOrderMapper.countList(orderQ); return wxOrderMapper.countList(orderQ);
} catch (Exception e) { } catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询待支付错误."+e.getMessage());
} }


} }
@@ -477,8 +484,8 @@ public class WxOrderServiceImpl implements WxOrderService {
// } // }
return wxCouponOrderMapper.findCount(couponOrderQ); return wxCouponOrderMapper.findCount(couponOrderQ);
} catch (Exception e) { } catch (Exception e) {
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
logger.error("购买是否超限-DB, couponId: " + counpon.getId() + ", e:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"["+counpon.getTitle()+"]查询待使用订单错误.");
} }


} }
@@ -564,7 +571,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param coupon * @param coupon
* @param couponIdStr * @param couponIdStr
*/ */
private void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void stockReduce(WxCUserBasicInfo user, WxCoupon coupon, String couponIdStr,int number) {
//如果缓存中不存在这个key,则从coupon中取 //如果缓存中不存在这个key,则从coupon中取
if(!redisLock.hasCouponStockCache(coupon.getId())) { if(!redisLock.hasCouponStockCache(coupon.getId())) {
//此处需要加锁,防止并发设置 //此处需要加锁,防止并发设置
@@ -595,11 +603,11 @@ public class WxOrderServiceImpl implements WxOrderService {
long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr));
if (redisStock<=0) { if (redisStock<=0) {
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+couponIdStr);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!:"+coupon.getTitle()+"["+couponIdStr+"]");
} }
// 检查 优惠券 库存 // 检查 优惠券 库存
if (coupon.getRemainInventory() <= 0) { if (coupon.getRemainInventory() <= 0) {
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY);
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(),coupon.getTitle()+"["+couponIdStr+"]库存不足");
} }


int count = 0; int count = 0;
@@ -609,42 +617,42 @@ public class WxOrderServiceImpl implements WxOrderService {
try { try {
count = getUserOrderCount(user, coupon); count = getUserOrderCount(user, coupon);
} catch (Exception e) { } catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询未支付订单失败.");
} }
if (count > 0) { if (count > 0) {
logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_UNPAID);
throw new MallinkException(ErrorCode.ORDER_UNPAID.getCode(),"["+coupon.getTitle()+"]您有未支付的订单.");
} }
} }
//检查拼团中的数量 //检查拼团中的数量
try { try {
count = getUserOrderGroupCount(user, coupon); count = getUserOrderGroupCount(user, coupon);
} catch (Exception e) { } catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询拼团中订单错误.");
} }
if (count >= coupon.getUseLimitQuantity()) { if (count >= coupon.getUseLimitQuantity()) {
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"["+coupon.getTitle()+"]购买超限.");
} }


// 检查用户已购买数量 // 检查用户已购买数量
try { try {
count = getUserCouponOrderCount(user, coupon); count = getUserCouponOrderCount(user, coupon);
} catch (Exception e) { } catch (Exception e) {
throw new MallinkException(ErrorCode.DB_FAIL);
throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询待使用订单错误.");
} }
if (count >= coupon.getUseLimitQuantity()) { if (count >= coupon.getUseLimitQuantity()) {
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"此券购买数量已超限["+coupon.getTitle()+"], couponId: " + couponIdStr + ", count: " + count);
} }


try { try {
//减库存,从redis中取,然后发mq消息同步到数据库
wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), 1);
//减库存,
wxCouponService.reduceRemainInventory(coupon.getId(),coupon.getTenantId(), number);
long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), 1);
long stock = redisLock.decrease(EnumCacheKey.COUPON_STOCK.getMessage()+coupon.getId(), number);
if (stock < 0 ) { if (stock < 0 ) {
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券库存已为零!");
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存已为零!");
} }
@@ -656,7 +664,7 @@ public class WxOrderServiceImpl implements WxOrderService {
// mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId()); // mqBaseProducer.sendMessage(msg, EnumMsgMqTopic.STOCK.getCode(), "*", "decrease_stock_"+coupon.getId());
} catch (RuntimeException e) { } catch (RuntimeException e) {
logger.error("此券减库存失败, couponId: " + couponIdStr,e); logger.error("此券减库存失败, couponId: " + couponIdStr,e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(),"券["+coupon.getTitle()+"]库存更新失败!"+e.getMessage());
} }
} }


@@ -966,7 +974,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param order * @param order
* @param coupon * @param coupon
*/ */
private WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay,Long merchantId,Long bUserId) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxCouponOrder createCouponOrder(WxOrder order, WxCUserBasicInfo user, WxCoupon coupon, Long couponPasswordId,EnumPayWay payWay,Long merchantId,Long bUserId) {
Date curr = new Date(); Date curr = new Date();
Date valid_date = null; Date valid_date = null;
int limit_days = Constant.WX_LIMIT_DAYS; int limit_days = Constant.WX_LIMIT_DAYS;
@@ -1269,7 +1278,7 @@ public class WxOrderServiceImpl implements WxOrderService {
} else { } else {
// 减库存操作 // 减库存操作
try { try {
stockReduce(user, coupon, couponIdStr);
stockReduce(user, coupon, couponIdStr,1);
}catch(Exception e) { }catch(Exception e) {
throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage());
} }
@@ -1958,74 +1967,119 @@ public class WxOrderServiceImpl implements WxOrderService {
@Qualifier("cUserBasicInfoRedisTemplate") @Qualifier("cUserBasicInfoRedisTemplate")
RedisTemplate<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate; RedisTemplate<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate;


@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
@Override @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);
public WxComposeOrder saveOrderForCoupon(WxCUserBasicInfo user,List<OrderComposeSaveDto> orderSave,EnumPayWay payWay) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
// 防止同一用户重复下单,1秒内
String key = new StringBuilder().append("saveorder:").append(user.getId()).toString();
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);
WxComposeOrder composeOrder = createWxComposeOrder(user, orderSave, payWay);
for (int i = 0 ; i < orderSave.size(); i ++) {
OrderComposeSaveDto orderdto = orderSave.get(i);
// 是否砍价
boolean isPress = orderdto.getSignleOrder().getPress() != null ? orderdto.getSignleOrder().getPress() : false;
WxOrder order = null;
if (checkCouponIsFree(orderdto.getWxCoupon())) {
// 免费券
order = proxy.saveFreeOrderForCoupon(composeOrder,user, orderdto.getWxCoupon(),orderdto.getCount(), orderdto.getSignleOrder().getCouponChannelId(), orderdto.getSignleOrder().getFormId(), null,payWay);
if (order != null) {
// 6. 下订单完成,发送内部消息
// 下订单完成,发送内部消息
try {
proxy.sendOrderSuccessActionMsg(order);
} catch (Exception e) {
logger.error("内部消息发送失败: " + e.getMessage(),e);
throw new MallinkException(ErrorCode.MSG_INSIDE_ERROR);
}
} }
} else {
// 有价券
order = proxy.saveNoFreeOrderForCoupon(composeOrder,user, orderdto.getWxCoupon(),orderdto.getCount(), orderdto.getSignleOrder().getCouponChannelId(), isPress, orderdto.getSignleOrder().getOrderGroupId(), orderdto.getSignleOrder().getFormId());
} }
} else {
// 有价券
order = saveNoFreeOrderForCoupon(user, coupon, orderSaveDto.getCouponChannelId(), isPress, orderSaveDto.getOrderGroupId(), orderSaveDto.getFormId());
// couponActionLog
// try {
// wxCouponActionLogService.addOne(order, order.getProductId(), order.getOrderNumber(), EnumCouponSendSendType.ACTIVE.getCode(), orderdto.getSignleOrder().getCouponChannelId(),0L);
// } catch (Exception e) {
// // 库存恢复
// stockBack(order);
// logger.error("保存订单:" + e.getMessage());
// throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
// }
}
return composeOrder;
}
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxComposeOrder createWxComposeOrder(WxCUserBasicInfo user,List<OrderComposeSaveDto> orderSave,EnumPayWay payWay) {
WxComposeOrder order =new WxComposeOrder();
final IdWorker idWorker = IdWorker.get();
order.setId(idWorker.nextId());
order.setCUserId(user.getId());
order.setPaymentType(EnumPayType.PAY_PAYMENT.getCode());
int payment = 0;
for (OrderComposeSaveDto ocsd : orderSave) {
boolean isPress = ocsd.getSignleOrder().getPress() != null ? ocsd.getSignleOrder().getPress() : false;
payment = payment+getCouponPayment(ocsd.getWxCoupon(), isPress, ocsd.getSignleOrder().getOrderGroupId(),ocsd.getCount());
}
order.setPayment(payment);
if (payment > 0 ) {
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode());
}else {
order.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode());
}
order.setCreateDate(new Date());
wxComposeOrderMapper.insert(order);
return order;
}
private int getCouponPayment(WxCoupon coupon,boolean isPress,Long orderGroupId,int couponNumber) {
// 4.1 券价格
int payment = coupon.getSalePrice()*couponNumber;
//Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode();
if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) {
// 砍价券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
} }
// 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);
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (orderGroupId == null) {
// 拼团券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
} else {
//orderStatus = EnumOrderStatus.ORDER_STATUS_COOPERATING_UNPAID.getCode();
}
} }
return order;
return payment;
} }

@Override @Override
public boolean checkCouponIsFree(WxCoupon coupon) { public boolean checkCouponIsFree(WxCoupon coupon) {
return coupon.getSalePrice() == 0; return coupon.getSalePrice() == 0;
} }


@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @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. 减库存操作
@Override
public WxOrder saveFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
// 减库存操作
String couponIdStr = String.valueOf(coupon.getId()); String couponIdStr = String.valueOf(coupon.getId());
stockReduce(user, coupon, couponIdStr);
proxy.stockReduce(user, coupon, couponIdStr,couponNumber);


// 3. 当积分券或者积分停车券时 则进行积分支付
// 当积分券或者积分停车券时 则进行积分支付
Integer orderType; Integer orderType;
if (coupon.checkIsCreditCoupon()) { if (coupon.checkIsCreditCoupon()) {
creditPay(user, coupon);
proxy.creditPay(user, coupon);
orderType = EnumOrderType.CREDIT.getCode(); orderType = EnumOrderType.CREDIT.getCode();
} else { } else {
orderType = EnumOrderType.COUPON.getCode(); orderType = EnumOrderType.COUPON.getCode();
@@ -2040,28 +2094,96 @@ public class WxOrderServiceImpl implements WxOrderService {
record.setPayment(0); record.setPayment(0);
record.setFormId(formId); record.setFormId(formId);
record.setOrderGroupId(0L); record.setOrderGroupId(0L);
if (null != composeOrder) {
record.setComposeOrderId(composeOrder.getId());
}
try { try {
saveFreeOrder(record, user, coupon);
proxy.saveFreeOrder(record, user, coupon);
} catch (Exception e) { } catch (Exception e) {
logger.error("下订单:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR);
logger.error("下订单错误:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]保存订单错误."+e.getMessage());
} }


// 5. 创建couponOrder // 5. 创建couponOrder
try { try {
createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null);
proxy.createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null);
} catch (Exception e) { } catch (Exception e) {
logger.error("couponOrder失败:" + e.getMessage(),e); logger.error("couponOrder失败:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]保存券订单错误."+e.getMessage());
} }
return record; return record;
} }


@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public WxOrder saveNoFreeOrderForCoupon(WxComposeOrder composeOrder,WxCUserBasicInfo user, WxCoupon coupon,int couponNumber, Long couponChannelId, boolean isPress, Long orderGroupId, String formId) {
WxOrderServiceImpl proxy = (WxOrderServiceImpl) AopContext.currentProxy();
String couponIdStr = String.valueOf(coupon.getId());
// 3. 减库存操作
proxy.stockReduce(user, coupon, couponIdStr,couponNumber);

// 3. 当积分券或者积分停车券时 则进行积分支付
Integer orderType;
if (coupon.checkIsCreditCoupon()) {
proxy.creditPay(user, coupon);
orderType = EnumOrderType.CREDIT.getCode();
} else {
orderType = EnumOrderType.COUPON.getCode();
}

// 4. 保存订单
Long orderNumber;
// 4.1 券价格
int payment = coupon.getSalePrice()*couponNumber;
Integer orderStatus = EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode();
if (isPress || coupon.getType().equals(EnumCouponType.COUPON_PRESS.getCode())) {
// 砍价券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
}
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) {
if (orderGroupId == null) {
// 拼团券 初始是全价即面额
payment = coupon.getPrice()*couponNumber;
} 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);
if (null != composeOrder) {
record.setComposeOrderId(composeOrder.getId());
}
try {
orderNumber = proxy.saveNoFreeOrder(record, user, coupon, isPress);
} catch (Exception e) {
logger.error("保存订单:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]订单保存错误,"+e.getMessage());
}

if (isPress) {
// 5. 第一次砍价
try {
proxy.firstPress(record, user, coupon, orderNumber);
} catch (Exception e) {
logger.error("第一次砍价失败:" + e.getMessage(),e);
throw new MallinkException(ErrorCode.ORDER_SAVE_ERR.getCode(),"["+coupon.getTitle()+"]第一次砍价错误,"+e.getMessage());
}
}
return record;
}
@Override @Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) {
// 1. check user info and coupon info // 1. check user info and coupon info
userCouponMerchantCheck(user, coupon);
userCouponMerchantCheck(user, coupon,"此券");
if (coupon.checkIsCreditCoupon()) { if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付 //若用户剩余积分比积分售价低则不能支付
if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) {
@@ -2070,7 +2192,7 @@ public class WxOrderServiceImpl implements WxOrderService {
} }
// 2. 减库存操作 // 2. 减库存操作
String couponIdStr = String.valueOf(coupon.getId()); String couponIdStr = String.valueOf(coupon.getId());
stockReduce(user, coupon, couponIdStr);
stockReduce(user, coupon, couponIdStr,1);


// 3. 当积分券或者积分停车券时 则进行积分支付 // 3. 当积分券或者积分停车券时 则进行积分支付
Integer orderType; Integer orderType;
@@ -2114,7 +2236,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param user * @param user
* @param coupon * @param coupon
*/ */
private void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void saveFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon) {
Date curr = new Date(); Date curr = new Date();
// body // body
String bodyStr = ""; String bodyStr = "";
@@ -2140,35 +2263,26 @@ public class WxOrderServiceImpl implements WxOrderService {
wxOrderMapper.insert(record); wxOrderMapper.insert(record);
} }


private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon) throws MallinkException {
// 检查用户
if (user == null) {
logger.error("用户不存在");
throw new MallinkException(ErrorCode.USER_IS_EMPTY);
}
private void userCouponMerchantCheck(WxCUserBasicInfo user, WxCoupon coupon,String premsg) throws MallinkException {
// 检查券 // 检查券
if (coupon == null) { if (coupon == null) {
logger.error("券不存在"); 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);
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"不存在");
} }
// 检查券商户信息 // 检查券商户信息
if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) { if (!isCouponMerchantValid(coupon.getId(),coupon.getTenantId())) {
logger.error("商户不存在, couponId: " + coupon.getId()); logger.error("商户不存在, couponId: " + coupon.getId());
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND);
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND.getCode(),premsg+"【"+coupon.getTitle()+"】商户信息没找到");
} }
// 检查 优惠券 库存 // 检查 优惠券 库存
if (coupon.getRemainInventory() <= 0) { if (coupon.getRemainInventory() <= 0) {
logger.error("此券库存为0, couponId: " + coupon.getId()); logger.error("此券库存为0, couponId: " + coupon.getId());
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY);
throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(),premsg+"【"+coupon.getTitle()+"】库存不足");
} }
} }


private void creditPay(WxCUserBasicInfo user, WxCoupon coupon) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void creditPay(WxCUserBasicInfo user, WxCoupon coupon) {
//-------此处为【积分支付】记录增加积分操作------- //-------此处为【积分支付】记录增加积分操作-------
WxCreditHistory creditHistory = new WxCreditHistory(); WxCreditHistory creditHistory = new WxCreditHistory();
creditHistory.setCreditNum(coupon.getCreditPrice()); creditHistory.setCreditNum(coupon.getCreditPrice());
@@ -2195,79 +2309,7 @@ public class WxOrderServiceImpl implements WxOrderService {
wxCreditHistoryService.saveOrUpdate(creditHistory,coupon.getTenantId()); 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;
}


/** /**
* 初始砍价 * 初始砍价
@@ -2277,7 +2319,8 @@ public class WxOrderServiceImpl implements WxOrderService {
* @param coupon * @param coupon
* @param orderNumber * @param orderNumber
*/ */
private void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void firstPress(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, Long orderNumber) {
// 保存砍价信息 // 保存砍价信息
int total = coupon.getPrice() - coupon.getSalePrice(); int total = coupon.getPrice() - coupon.getSalePrice();
int left_total = total; int left_total = total;
@@ -2302,7 +2345,8 @@ public class WxOrderServiceImpl implements WxOrderService {
wxOrderMapper.updateById(orderUpdatePress); wxOrderMapper.updateById(orderUpdatePress);
} }


private Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) {
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public Long saveNoFreeOrder(WxOrder record, WxCUserBasicInfo user, WxCoupon coupon, boolean isPress) {
Long orderNumber; Long orderNumber;
Date curr = new Date(); Date curr = new Date();


@@ -2341,21 +2385,21 @@ public class WxOrderServiceImpl implements WxOrderService {
return orderNumber; return orderNumber;
} }


private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon) {
private void checkOrderGroup(WxCUserBasicInfo user, Long orderGroupId,WxCoupon coupon,String premsg) {
WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId()); WxOrderGroup group = wxOrderGroupMapper.selectById(orderGroupId,coupon.getTenantId());
if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) {
logger.error("下订单拼团人数已满>>>" + orderGroupId); logger.error("下订单拼团人数已满>>>" + orderGroupId);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+"【"+coupon.getTitle()+"】拼团人数已满");
} }
if (group.getRemainPeople()<=0) { if (group.getRemainPeople()<=0) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数已满");
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+"【"+coupon.getTitle()+"】下单人数已满");
} }
//判断拼团人数是否已经超出限制 //判断拼团人数是否已经超出限制
int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId()); int groupCount = countGroupOrder(orderGroupId,true,group.getTenantId());
if (groupCount>=coupon.getPressLimitNum()) { if (groupCount>=coupon.getPressLimitNum()) {
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),"下单人数超出优惠券人数限制!");
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_FINISHED.getCode(),premsg+"【"+coupon.getTitle()+"】下单人数超出优惠券人数限制!");
} }
WxOrder order = new WxOrder(); WxOrder order = new WxOrder();
@@ -2365,7 +2409,7 @@ public class WxOrderServiceImpl implements WxOrderService {
long count = wxOrderMapper.selectCount(new QueryWrapper(order)); long count = wxOrderMapper.selectCount(new QueryWrapper(order));
if (count > 0) { if (count > 0) {
logger.error("重复的拼团>>>" + orderGroupId); logger.error("重复的拼团>>>" + orderGroupId);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID);
throw new MallinkException(ErrorCode.ORDER_GROUP_COOPERATING_UNPAID.getCode(),premsg+"【"+coupon.getTitle()+"】您有未支付的拼团订单");
} }
} }


@@ -2390,9 +2434,9 @@ public class WxOrderServiceImpl implements WxOrderService {
} }


@Override @Override
public int countUserCouponGroupOrder(Long cuserId, Long couponId,String tenantId) {
public int countUserCouponGroupOrder(WxCUserBasicInfo wxCUserBasicInfo, Long couponId,String tenantId) {
WxOrder query = new WxOrder(); WxOrder query = new WxOrder();
query.setCUserId(cuserId);
query.setCUserId(wxCUserBasicInfo.getId());
query.setProductId(couponId); query.setProductId(couponId);
List<Integer> statusS = new ArrayList<Integer>(); List<Integer> statusS = new ArrayList<Integer>();
statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode());
@@ -2404,37 +2448,84 @@ public class WxOrderServiceImpl implements WxOrderService {




@Override @Override
public ResultData saveOrder(OrderSaveDto orderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) {
public ResultData composeSaveOrder(List<OrderComposeSaveDto> composeOrderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity) {
logger.info("composeOrderSave: " + composeOrderSaveDto);
//TODO 事务,所有券都购买成功才行
try {
if (null == composeOrderSaveDto || composeOrderSaveDto.size() <= 0 ) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"无商品信息");
}
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);
}
boolean singleProduct = false;
if (composeOrderSaveDto.size() == 1) {
singleProduct = true;
}
for ( int i =0 ; i< composeOrderSaveDto.size(); i++ ) {
OrderComposeSaveDto ocsd = composeOrderSaveDto.get(i);
singleOrderCheck(ocsd,ocsd.getSignleOrder(),ocsd.getCount(),wxCUserBasicInfo,payWay,tenantEntity,i+1,singleProduct);
}

try {
WxComposeOrder order = this.saveOrderForCoupon(wxCUserBasicInfo, composeOrderSaveDto, payWay);
return new ResultData(order);
} catch (MallinkException e) {
logger.error("saveOrderForCoupon error.",e);
throw new MallinkException(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error("saveOrderForCoupon error.",e);
throw new MallinkException(ErrorCode.ORDER_IS_FAIL.getCode(), e.getMessage());
}
}catch(MallinkException me) {
return new ResultData(me.getErrorCode(),me.getMessage());
}catch(Exception e) {
logger.error("composeSaveOrder error.",e);
return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),e.getMessage());
}
}
private void singleOrderCheck(OrderComposeSaveDto ocsd,OrderSaveDto orderSaveDto,int productCount,WxCUserBasicInfo wxCUserBasicInfo,EnumPayWay payWay,TenantEntity tenantEntity,int curindex,boolean singleProduct) {
logger.info("OrderSave: " + orderSaveDto); logger.info("OrderSave: " + orderSaveDto);
String premsg = "";
if (singleProduct) {
premsg = "此券";
}else {
premsg = "第["+curindex+"]张券";
}
if (orderSaveDto.getCouponChannelId() == null) { if (orderSaveDto.getCouponChannelId() == null) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId不能为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), premsg+"couponChannelId不能为空");
} }
WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId()); WxCouponChannel wxCouponChannel = wxCouponChannelService.getById(orderSaveDto.getCouponChannelId(),tenantEntity.getTenantId());
if (wxCouponChannel == null) { if (wxCouponChannel == null) {
logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId()); 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);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(),premsg+"投放渠道不存在");
} }
couponChannelCheck(orderSaveDto, wxCouponChannel,premsg);


WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId()); WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId());
if (null == coupon) { if (null == coupon) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"不存在");
} }
if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) { if (coupon.getStatus().equals(EnumCouponStatus.COUPON_STATUS_TAKE_OFFF.getCode())) {
return new ResultData(ErrorCode.COUPON_IS_TAKE_OFF);
throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),premsg+"【"+coupon.getTitle()+"】已作废");
} }
ocsd.setWxCoupon(coupon);
//判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制 //判断是否是拼团订单,如果是拼团订单,判断现在进行中的,和已完成的数量是否超出券的限制
if (coupon.getType().equals(EnumCouponType.COUPON_GROUP.getCode())) { 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(),"您当前此券的有效拼团数量达到券的限购次数。");
int ordercount = this.countUserCouponGroupOrder(wxCUserBasicInfo,coupon.getId(),coupon.getTenantId());
if ((ordercount+productCount)>=coupon.getUseLimitQuantity()) {
throw new MallinkException(ErrorCode.COUPON_IS_TAKE_OFF.getCode(),premsg+"拼团券["+coupon.getTitle()+"]您的有效拼团数量达到券的限购次数。");
} }
} }


@@ -2456,7 +2547,7 @@ public class WxOrderServiceImpl implements WxOrderService {
} }
} }
if (wxCouponCVo == null) { if (wxCouponCVo == null) {
return new ResultData(ErrorCode.COUPON_IS_EMPTY);
throw new MallinkException(ErrorCode.COUPON_IS_EMPTY.getCode(),premsg+"【"+coupon.getTitle()+"】未查询到详细信息.");
} }


//此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。 //此处判断是否存在绝对保证库存不超卖的缓存,如果没有,则把当前的库存设置为最大值。如果有,则是后台设置的时候保存的,以那个为准。
@@ -2480,81 +2571,81 @@ public class WxOrderServiceImpl implements WxOrderService {
} }
} }


resultData = couponUserCheck(wxCUserBasicInfo, wxCouponCVo);
if (resultData != null) return resultData;
couponUserCheck(wxCUserBasicInfo, wxCouponCVo,premsg);


Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId(); Long couponId = orderSaveDto.getCouponId() == null ? wxCouponChannel.getCouponId() : orderSaveDto.getCouponId();
if (couponId == null) { if (couponId == null) {
logger.error("couponChannelId或者couponId不能为空"); logger.error("couponChannelId或者couponId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponChannelId或者couponId不能为空");
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), premsg+"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());
userCouponMerchantCheck(wxCUserBasicInfo, coupon,premsg);
if (coupon.checkIsCreditCoupon()) {
//若用户剩余积分比积分售价低则不能支付
if (wxCUserBasicInfo.getCredit() == null || wxCUserBasicInfo.getCredit() < coupon.getCreditPrice()) {
throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH.getCode(), premsg+"【"+coupon.getTitle()+"】积分不够扣减值");
}
} }
if (!checkCouponIsFree(coupon)) {
// 有价,拼团检查
if (isOrderGroup(ocsd.getSignleOrder().getOrderGroupId())) {
checkOrderGroup(wxCUserBasicInfo, ocsd.getSignleOrder().getOrderGroupId(),coupon,premsg);
}
}
} }


private ResultData couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel) {
private void couponChannelCheck(OrderSaveDto orderSaveDto, WxCouponChannel wxCouponChannel,String premsg) {
if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) { if (wxCouponChannel.getTargetAd().equals(EnumCouponChannelType.COUPON_CHANNEL_ID_TIMED.getCode())) {
Date now = new Date(); Date now = new Date();
if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) { if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) {
logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId()); logger.error("此券活动未开始:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_NOT_STARTED.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】活动未开始");
} }
if (wxCouponChannel.getEndTime().getTime() < now.getTime()) { if (wxCouponChannel.getEndTime().getTime() < now.getTime()) {
logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId()); logger.error("此券活动已结束:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_END);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_END.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】活动已结束");
} }
} }


if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) { if (wxCouponChannel.getStatus() == EnumCouponChannelStatus.STATUS_TAKE_OFFF.getCode()) {
logger.error("此券已下架:" + orderSaveDto.getCouponChannelId()); logger.error("此券已下架:" + orderSaveDto.getCouponChannelId());
return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF);
throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(),premsg+"【"+wxCouponChannel.getTitle()+"】已下架");
} }
return null;
} }


private ResultData couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon) {
if (coupon.getConditions() == null) return null;
private void couponUserCheck(WxCUserBasicInfo user, WxCouponCVo coupon,String premsg) {
if (coupon.getConditions() == null) return ;
JSONObject jo = null; JSONObject jo = null;
try { try {
jo = JSONObject.parseObject(coupon.getConditions()); jo = JSONObject.parseObject(coupon.getConditions());
} catch (Exception e) { } catch (Exception e) {
logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage());
logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage(),e);
} }
if (jo != null) { if (jo != null) {
if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){ if (jo.getIntValue("type") == EnumCouponConditionType.NEW_MEMBER.getCode()){


if (user != null && user.getActRecord() > 0) if (user != null && user.getActRecord() > 0)
return new ResultData(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER);
throw new MallinkException(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER.getCode(),premsg+"【"+coupon.getTitle()+"】限新会员,您已经参加过新会员活动");
if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0) if (this.countCouponConditionType1(coupon.getTenantId(),user.getId()) > 0)
return new ResultData(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER);
throw new MallinkException(ErrorCode.COUPON_ALREADY_IN_NEW_MEMBER.getCode(),premsg+"【"+coupon.getTitle()+"】限新会员,您已经不是新用户");
}else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){ }else if (jo.getIntValue("type") == EnumCouponConditionType.SCORE_SCOPE.getCode()){
int max = jo.getIntValue("max"); int max = jo.getIntValue("max");
int min = jo.getIntValue("min"); int min = jo.getIntValue("min");


if (max!=0 && min ==0 && user.getPoins() > max) { if (max!=0 && min ==0 && user.getPoins() > max) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE);
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符");
} }
if (max==0 && min !=0 && user.getPoins() < min) { if (max==0 && min !=0 && user.getPoins() < min) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE);
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符");
} }
if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) { if (max!=0 && min !=0 && (user.getPoins() < min || user.getPoins() > max)) {
return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE);
throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符");
} }
} }
} }

return null;
} }


} }

+ 156
- 0
mallinkService/src/main/resources/mapper/WxComposeOrderMapper.xml Zobrazit soubor

@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.iformall.mapper.WxComposeOrderMapper">
<resultMap id="BaseResultMap" type="com.iformall.domain.po.WxComposeOrder">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="tenant_id" jdbcType="VARCHAR" property="tenantId"/>
<result column="parent_tenant_id" jdbcType="VARCHAR" property="parentTenantId" />
<result column="c_user_id" jdbcType="BIGINT" property="cUserId"/>
<result column="payment_type" jdbcType="INTEGER" property="paymentType"/>
<result column="payment" jdbcType="INTEGER" property="payment"/>
<result column="payment_time" jdbcType="TIMESTAMP" property="paymentTime"/>
<result column="order_status" jdbcType="INTEGER" property="orderStatus"/>
<result column="create_date" jdbcType="TIMESTAMP" property="createDate"/>
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/>
</resultMap>

<sql id="allColumns">
`id`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date`
</sql>

<sql id="dynamicWhereConditions">
where 1 = 1

<if test=" null != id ">
and `id` = #{id}
</if>

<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != cUserId ">
and `c_user_id` = #{cUserId}
</if>

<if test=" null != paymentType ">
and `payment_type` = #{paymentType}
</if>

<if test=" null != payment ">
and `payment` = #{payment}
</if>

<if test=" null != paymentTime ">
and `payment_time` = #{paymentTime}
</if>

<if test=" null != orderStatus ">
and `order_status` = #{orderStatus}
</if>

<if test=" null != statusS ">
and `order_status` in
<foreach collection="statusS" index="index" item="sItem" open="(" separator="," close=")">
#{sItem}
</foreach>
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">
#{idItem}
</foreach>
</if>
<if test=" null != sortColumns">order by ${sortColumns}</if>
</sql>

<select id="selectById" parameterType="java.util.HashMap" resultMap="BaseResultMap">
select <include refid="allColumns"/> from wx_order where id =#{id} and tenant_id=#{tenantId}
</select>

<select id="findList" parameterType="com.iformall.domain.po.WxOrder" resultMap="BaseResultMap">
select
<include refid="allColumns"/>
from wx_order
<include refid="dynamicWhereConditions"/>
</select>

<select id="countList" parameterType="com.iformall.domain.po.WxOrder" resultType="java.lang.Integer">
select count(1) from wx_order
<include refid="dynamicWhereConditions"/>
</select>

<select id="countCouponConditionType1" parameterType="com.iformall.domain.po.WxOrder" resultType="java.lang.Integer">
select count(*) from wx_order o,wx_coupon c
where o.product_id = c.id
and c.conditions is not null
/*and JSON_EXTRACT(c.conditions, '$.type') = 1*/
<if test=" null != cUserId ">
and o.c_user_id = #{cUserId}
</if>

<if test=" null != tenantId and '' != tenantId">
and o.`tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and o.`parent_tenant_id` = #{parentTenantId}
</if>

<if test=" null != type ">
and o.type = #{type}
</if>

<if test=" null != statusS ">
and o.order_status in
<foreach collection="statusS" index="index" item="sItem" open="(" separator="," close=")">
#{sItem}
</foreach>
</if>

</select>



<select id="selectDetailOfPress" parameterType="com.iformall.domain.po.WxOrder" resultMap="PressVoDetailResultMap">
select
<include refid="allOrderPressDetailColumns"/>
FROM wx_order o
left join wx_coupon c ON o.product_id = c.id
left join wx_coupon_order co on o.id = co.order_id
where o.product_id = c.id
<if test="cUserId != null">
and o.c_user_id = #{cUserId}
</if>
<if test=" null != tenantId and '' != tenantId">
and o.`tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and o.`parent_tenant_id` = #{parentTenantId}
</if>
<if test="id != null">
and o.id = #{id}
</if>

</select>
<update id="updateStatusByOrderGroupId" parameterType="com.iformall.domain.po.WxOrder">
update wx_order set order_status=#{orderStatus}
where order_group_id=#{orderGroupId} and order_status=10
<if test=" null != tenantId and '' != tenantId">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != parentTenantId and '' != parentTenantId">
and `parent_tenant_id` = #{parentTenantId}
</if>
</update>
<update id="updateOrderStatusForGroup" parameterType="java.util.HashMap">
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
</update>

</mapper>

+ 7
- 2
mallinkService/src/main/resources/mapper/WxOrderMapper.xml Zobrazit soubor

@@ -23,12 +23,13 @@
<result column="order_group_id" jdbcType="BIGINT" property="orderGroupId"/> <result column="order_group_id" jdbcType="BIGINT" property="orderGroupId"/>
<result column="form_id" jdbcType="VARCHAR" property="formId"/> <result column="form_id" jdbcType="VARCHAR" property="formId"/>
<result column="total_payment" jdbcType="INTEGER" property="totalPayment"/> <result column="total_payment" jdbcType="INTEGER" property="totalPayment"/>

<result column="compose_order_id" jdbcType="BIGINT" property="composeOrderId"/>
<result column="coupon_number" jdbcType="INTEGER" property="couponNumber"/>
</resultMap> </resultMap>


<sql id="allColumns"> <sql id="allColumns">
`id`,`order_number`,`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`, `id`,`order_number`,`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`
`press_end_date`,`press_current_num`,`press_current_value`,`order_group_id`,`form_id`,`total_payment`,`compose_order_id`,`coupon_number`
</sql> </sql>


<sql id="dynamicWhereConditions"> <sql id="dynamicWhereConditions">
@@ -112,6 +113,10 @@
<if test=" null != formId "> <if test=" null != formId ">
and `form_id` = #{formId} and `form_id` = #{formId}
</if> </if>
<if test=" null != composeOrderId ">
and `compose_order_id` = #{composeOrderId}
</if>
<if test=" null != statusS "> <if test=" null != statusS ">
and `order_status` in and `order_status` in


Načítá se…
Zrušit
Uložit