| @@ -188,7 +188,7 @@ public class WxOrderController extends BaseController { | |||
| 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); | |||
| } catch (MallinkException e) { | |||
| logger.error(e.getMessage()); | |||
| @@ -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 '购买券数量'; | |||
| @@ -96,7 +96,7 @@ public class WxCouponPasswordController extends BaseController { | |||
| // 3. 领取free coupon | |||
| 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) { | |||
| setCouponPasswordStatus(couponPassword, EnumCouponPasswordStatus.getEnum(pwdStatus)); | |||
| logger.error(e.getMessage(),e); | |||
| @@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.dto.OrderComposeSaveDto; | |||
| import com.iformall.domain.dto.OrderSaveDto; | |||
| import com.iformall.domain.po.*; | |||
| 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 java.util.Date; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| @RestController | |||
| @@ -59,171 +61,30 @@ public class WxOrderController extends BaseController { | |||
| @Autowired | |||
| 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; | |||
| try { | |||
| memberId = getMemberId(); | |||
| } catch (Exception e) { | |||
| 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 { | |||
| // 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\"}") | |||
| @PostMapping("cancel") | |||
| public ResultData cancelOrder(@RequestBody Map<String, String> paramMap) { | |||
| @@ -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; | |||
| } | |||
| @@ -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; | |||
| } | |||
| @@ -93,6 +93,12 @@ public class WxOrder extends TenantEntity { | |||
| @io.swagger.annotations.ApiModelProperty(value="总计支付金额(分),收银台用券时使用",name="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) | |||
| protected List<Integer> statusS; | |||
| @@ -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); | |||
| } | |||
| @@ -8,8 +8,10 @@ import javax.servlet.http.HttpServletResponse; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.dto.OrderComposeSaveDto; | |||
| import com.iformall.domain.dto.OrderSaveDto; | |||
| import com.iformall.domain.po.WxCUserBasicInfo; | |||
| import com.iformall.domain.po.WxComposeOrder; | |||
| import com.iformall.domain.po.WxCoupon; | |||
| import com.iformall.domain.po.WxCouponOrder; | |||
| import com.iformall.domain.po.WxMerchant; | |||
| @@ -192,7 +194,7 @@ public interface WxOrderService { | |||
| * @param coupon | |||
| * @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); | |||
| /** | |||
| @@ -211,10 +213,10 @@ public interface WxOrderService { | |||
| boolean checkCouponIsFree(WxCoupon coupon); | |||
| // 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. 创建有价订单 | |||
| 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 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,6 +10,7 @@ import com.iformall.common.ErrorCode; | |||
| import com.iformall.common.IdWorker; | |||
| import com.iformall.common.Result; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.dto.OrderComposeSaveDto; | |||
| import com.iformall.domain.dto.OrderSaveDto; | |||
| import com.iformall.domain.po.*; | |||
| import com.iformall.domain.po.base.TenantEntity; | |||
| @@ -72,7 +73,7 @@ public class WxGameServiceImpl implements WxGameService { | |||
| @Autowired | |||
| private WxOrderService wxOrderService; | |||
| @Autowired | |||
| @Qualifier("couponDetailRedisTemplate") | |||
| RedisTemplate<String, WxCouponCVo> cdRedisTemplate; | |||
| @@ -444,6 +445,7 @@ public class WxGameServiceImpl implements WxGameService { | |||
| Object data = resultData.data; | |||
| Long orderId = 0L; | |||
| Integer addCredit = 0; | |||
| if(data != null){ | |||
| logger.info("userId:"+userId+",中奖了,"+data.toString()); | |||
| if(data instanceof WxCouponChannelVo){ | |||
| @@ -451,7 +453,13 @@ public class WxGameServiceImpl implements WxGameService { | |||
| OrderSaveDto orderSaveDto = new OrderSaveDto(); | |||
| orderSaveDto.setCouponChannelId(vo.getId()); | |||
| 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){ | |||
| WxOrder order = (WxOrder)resultData1.data; | |||
| @@ -22,6 +22,7 @@ import com.iformall.service.*; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.aop.framework.AopContext; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.beans.factory.annotation.Qualifier; | |||
| 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.IdWorker; | |||
| import com.iformall.common.ResultData; | |||
| import com.iformall.domain.dto.OrderComposeSaveDto; | |||
| import com.iformall.domain.dto.OrderSaveDto; | |||
| import com.iformall.domain.dto.WxSharingOrderDto; | |||
| import com.iformall.domain.po.WxAppinfo; | |||
| import com.iformall.domain.po.WxCUserBasicInfo; | |||
| import com.iformall.domain.po.WxCardInfo; | |||
| import com.iformall.domain.po.WxComposeOrder; | |||
| import com.iformall.domain.po.WxCoupon; | |||
| import com.iformall.domain.po.WxCouponChannel; | |||
| import com.iformall.domain.po.WxCouponMerchant; | |||
| @@ -65,6 +68,7 @@ import com.iformall.mapper.WxAppinfoMapper; | |||
| import com.iformall.mapper.WxCUserBasicInfoMapper; | |||
| import com.iformall.mapper.WxCUserMapper; | |||
| import com.iformall.mapper.WxCardInfoMapper; | |||
| import com.iformall.mapper.WxComposeOrderMapper; | |||
| import com.iformall.mapper.WxCouponChannelMapper; | |||
| import com.iformall.mapper.WxCouponMapper; | |||
| import com.iformall.mapper.WxCouponMerchantMapper; | |||
| @@ -191,11 +195,14 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| @Autowired | |||
| WxCouponChannelService wxCouponChannelService; | |||
| @Autowired | |||
| WxComposeOrderMapper wxComposeOrderMapper; | |||
| @Autowired | |||
| @Qualifier("couponDetailRedisTemplate") | |||
| RedisTemplate<String, WxCouponCVo> cdRedisTemplate; | |||
| @Override | |||
| public PageInfo<WxOrder> listAsPage(WxOrder record, Integer pageIndex, Integer pageSize) { | |||
| 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()); | |||
| return wxOrderMapper.countList(orderQ); | |||
| } 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); | |||
| return wxOrderMapper.countList(orderQ); | |||
| } 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); | |||
| } 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 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中取 | |||
| if(!redisLock.hasCouponStockCache(coupon.getId())) { | |||
| //此处需要加锁,防止并发设置 | |||
| @@ -595,11 +603,11 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| long redisStock = redisLock.getCouponStock(Long.parseLong(couponIdStr)); | |||
| 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) { | |||
| throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY); | |||
| throw new MallinkException(ErrorCode.REMAIN_IS_EMPTY.getCode(),coupon.getTitle()+"["+couponIdStr+"]库存不足"); | |||
| } | |||
| int count = 0; | |||
| @@ -609,42 +617,42 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| try { | |||
| count = getUserOrderCount(user, coupon); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.DB_FAIL); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询未支付订单失败."); | |||
| } | |||
| if (count > 0) { | |||
| logger.error("此券有未支付的订单, couponId: " + couponIdStr + ", count: " + count); | |||
| throw new MallinkException(ErrorCode.ORDER_UNPAID); | |||
| throw new MallinkException(ErrorCode.ORDER_UNPAID.getCode(),"["+coupon.getTitle()+"]您有未支付的订单."); | |||
| } | |||
| } | |||
| //检查拼团中的数量 | |||
| try { | |||
| count = getUserOrderGroupCount(user, coupon); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.DB_FAIL); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询拼团中订单错误."); | |||
| } | |||
| if (count >= coupon.getUseLimitQuantity()) { | |||
| logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count); | |||
| throw new MallinkException(ErrorCode.ORDER_IS_LIMITED); | |||
| throw new MallinkException(ErrorCode.ORDER_IS_LIMITED.getCode(),"["+coupon.getTitle()+"]购买超限."); | |||
| } | |||
| // 检查用户已购买数量 | |||
| try { | |||
| count = getUserCouponOrderCount(user, coupon); | |||
| } catch (Exception e) { | |||
| throw new MallinkException(ErrorCode.DB_FAIL); | |||
| throw new MallinkException(ErrorCode.DB_FAIL.getCode(),"["+coupon.getTitle()+"]查询待使用订单错误."); | |||
| } | |||
| if (count >= coupon.getUseLimitQuantity()) { | |||
| 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 { | |||
| //减库存,从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 ) { | |||
| 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()); | |||
| } catch (RuntimeException 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 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 valid_date = null; | |||
| int limit_days = Constant.WX_LIMIT_DAYS; | |||
| @@ -1269,7 +1278,7 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| } else { | |||
| // 减库存操作 | |||
| try { | |||
| stockReduce(user, coupon, couponIdStr); | |||
| stockReduce(user, coupon, couponIdStr,1); | |||
| }catch(Exception e) { | |||
| throw new MallinkException(ErrorCode.COUPON_STOCK_ERR.getCode(), e.getMessage()); | |||
| } | |||
| @@ -1958,74 +1967,119 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| @Qualifier("cUserBasicInfoRedisTemplate") | |||
| RedisTemplate<String, WxCUserBasicInfo> cUserBasicInfoRedisTemplate; | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| @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 | |||
| public boolean checkCouponIsFree(WxCoupon coupon) { | |||
| return coupon.getSalePrice() == 0; | |||
| } | |||
| @Override | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| public WxOrder saveFreeOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId,EnumPayWay payWay) { | |||
| // 1. check user info and coupon info | |||
| userCouponMerchantCheck(user, coupon); | |||
| if (coupon.checkIsCreditCoupon()) { | |||
| //若用户剩余积分比积分售价低则不能支付 | |||
| if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { | |||
| throw new MallinkException(ErrorCode.CREDIT_NOT_ENOUGH); | |||
| } | |||
| } | |||
| // 2. 减库存操作 | |||
| @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()); | |||
| stockReduce(user, coupon, couponIdStr); | |||
| proxy.stockReduce(user, coupon, couponIdStr,couponNumber); | |||
| // 3. 当积分券或者积分停车券时 则进行积分支付 | |||
| // 当积分券或者积分停车券时 则进行积分支付 | |||
| Integer orderType; | |||
| if (coupon.checkIsCreditCoupon()) { | |||
| creditPay(user, coupon); | |||
| proxy.creditPay(user, coupon); | |||
| orderType = EnumOrderType.CREDIT.getCode(); | |||
| } else { | |||
| orderType = EnumOrderType.COUPON.getCode(); | |||
| @@ -2040,28 +2094,96 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| record.setPayment(0); | |||
| record.setFormId(formId); | |||
| record.setOrderGroupId(0L); | |||
| if (null != composeOrder) { | |||
| record.setComposeOrderId(composeOrder.getId()); | |||
| } | |||
| try { | |||
| saveFreeOrder(record, user, coupon); | |||
| proxy.saveFreeOrder(record, user, coupon); | |||
| } 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 | |||
| try { | |||
| createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null); | |||
| proxy.createCouponOrder(record, user, coupon, couponPasswordId,payWay,null,null); | |||
| } catch (Exception 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; | |||
| } | |||
| @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 | |||
| @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) | |||
| public Long saveOuterOrderForCoupon(WxCUserBasicInfo user, WxCoupon coupon, Long couponChannelId, String formId, Long couponPasswordId) { | |||
| // 1. check user info and coupon info | |||
| userCouponMerchantCheck(user, coupon); | |||
| userCouponMerchantCheck(user, coupon,"此券"); | |||
| if (coupon.checkIsCreditCoupon()) { | |||
| //若用户剩余积分比积分售价低则不能支付 | |||
| if (user.getCredit() == null || user.getCredit() < coupon.getCreditPrice()) { | |||
| @@ -2070,7 +2192,7 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| } | |||
| // 2. 减库存操作 | |||
| String couponIdStr = String.valueOf(coupon.getId()); | |||
| stockReduce(user, coupon, couponIdStr); | |||
| stockReduce(user, coupon, couponIdStr,1); | |||
| // 3. 当积分券或者积分停车券时 则进行积分支付 | |||
| Integer orderType; | |||
| @@ -2114,7 +2236,8 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| * @param user | |||
| * @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(); | |||
| // body | |||
| String bodyStr = ""; | |||
| @@ -2140,35 +2263,26 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| 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) { | |||
| 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())) { | |||
| 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) { | |||
| 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(); | |||
| creditHistory.setCreditNum(coupon.getCreditPrice()); | |||
| @@ -2195,79 +2309,7 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| 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 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 left_total = total; | |||
| @@ -2302,7 +2345,8 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| 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; | |||
| Date curr = new Date(); | |||
| @@ -2341,21 +2385,21 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| 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()); | |||
| if (group.getStatus().equals(EnumOrderStatus.ORDER_STATUS_COOPERATING_COMPLETE.getCode())) { | |||
| 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) { | |||
| 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()); | |||
| 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(); | |||
| @@ -2365,7 +2409,7 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| long count = wxOrderMapper.selectCount(new QueryWrapper(order)); | |||
| if (count > 0) { | |||
| 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 | |||
| public int countUserCouponGroupOrder(Long cuserId, Long couponId,String tenantId) { | |||
| public int countUserCouponGroupOrder(WxCUserBasicInfo wxCUserBasicInfo, Long couponId,String tenantId) { | |||
| WxOrder query = new WxOrder(); | |||
| query.setCUserId(cuserId); | |||
| query.setCUserId(wxCUserBasicInfo.getId()); | |||
| query.setProductId(couponId); | |||
| List<Integer> statusS = new ArrayList<Integer>(); | |||
| statusS.add(EnumOrderStatus.ORDER_STATUS_COOPERATING.getCode()); | |||
| @@ -2404,37 +2448,84 @@ public class WxOrderServiceImpl implements WxOrderService { | |||
| @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); | |||
| String premsg = ""; | |||
| if (singleProduct) { | |||
| premsg = "此券"; | |||
| }else { | |||
| premsg = "第["+curindex+"]张券"; | |||
| } | |||
| 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()); | |||
| if (wxCouponChannel == null) { | |||
| logger.error("couponChannelId find error, " + orderSaveDto.getCouponChannelId()); | |||
| return new ResultData(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF); | |||
| } | |||
| ResultData resultData = couponChannelCheck(orderSaveDto, wxCouponChannel); | |||
| if (resultData != null) return resultData; | |||
| WxCUserBasicInfo wxCUserBasicInfo = wxCUserBasicInfoService.getById(cUserId,tenantEntity.getFinalTenantId()); | |||
| if (wxCUserBasicInfo != null && wxCUserBasicInfo.getStatus().equals(EnumCUserBasicInfoStatus.LOCKED.getCode())) { | |||
| logger.info("会员权益被锁定:cUserId:" + cUserId); | |||
| return new ResultData(ErrorCode.MEMBER_IS_LOCKED); | |||
| throw new MallinkException(ErrorCode.COUPON_CHANNEL_IS_TAKE_OFF.getCode(),premsg+"投放渠道不存在"); | |||
| } | |||
| couponChannelCheck(orderSaveDto, wxCouponChannel,premsg); | |||
| WxCoupon coupon = wxCouponService.getById(wxCouponChannel.getCouponId(),wxCouponChannel.getTenantId()); | |||
| 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())) { | |||
| 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())) { | |||
| 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) { | |||
| 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(); | |||
| if (couponId == null) { | |||
| 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())) { | |||
| Date now = new Date(); | |||
| if (wxCouponChannel.getBeginTime().getTime() > now.getTime()) { | |||
| 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()) { | |||
| 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()) { | |||
| 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; | |||
| try { | |||
| jo = JSONObject.parseObject(coupon.getConditions()); | |||
| } catch (Exception e) { | |||
| logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage()); | |||
| logger.error("购买券条件判断错误:ID=" + coupon.getId() + e.getMessage(),e); | |||
| } | |||
| 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); | |||
| throw new MallinkException(ErrorCode.COUPON_ONLY_FOR_NEW_MEMBER.getCode(),premsg+"【"+coupon.getTitle()+"】限新会员,您已经参加过新会员活动"); | |||
| 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()){ | |||
| 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); | |||
| throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符"); | |||
| } | |||
| 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)) { | |||
| return new ResultData(ErrorCode.COUPON_SCORE_NOT_IN_RANGE); | |||
| throw new MallinkException(ErrorCode.COUPON_SCORE_NOT_IN_RANGE.getCode(),premsg+"【"+coupon.getTitle()+"】您的成长值/等级与要求不符"); | |||
| } | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -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> | |||
| @@ -23,12 +23,13 @@ | |||
| <result column="order_group_id" jdbcType="BIGINT" property="orderGroupId"/> | |||
| <result column="form_id" jdbcType="VARCHAR" property="formId"/> | |||
| <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> | |||
| <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`, | |||
| `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 id="dynamicWhereConditions"> | |||
| @@ -112,6 +113,10 @@ | |||
| <if test=" null != formId "> | |||
| and `form_id` = #{formId} | |||
| </if> | |||
| <if test=" null != composeOrderId "> | |||
| and `compose_order_id` = #{composeOrderId} | |||
| </if> | |||
| <if test=" null != statusS "> | |||
| and `order_status` in | |||