diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java index 2f3e2bf10..4a365d672 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxOrderController.java @@ -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()); diff --git a/mallinkAdmin/src/main/resources/db/migration/V202109070001__order.sql b/mallinkAdmin/src/main/resources/db/migration/V202109070001__order.sql new file mode 100644 index 000000000..2c79b32be --- /dev/null +++ b/mallinkAdmin/src/main/resources/db/migration/V202109070001__order.sql @@ -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 '购买券数量'; \ No newline at end of file diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java index 210c690bc..f166f044a 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxCouponPasswordController.java @@ -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); diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java index 39fb2c8ec..1a8e69da1 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOrderController.java @@ -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 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 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 paramMap) { diff --git a/mallinkService/src/main/java/com/iformall/domain/dto/OrderComposeSaveDto.java b/mallinkService/src/main/java/com/iformall/domain/dto/OrderComposeSaveDto.java new file mode 100644 index 000000000..aeaa052a6 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/dto/OrderComposeSaveDto.java @@ -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; + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxComposeOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxComposeOrder.java new file mode 100644 index 000000000..3be038488 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxComposeOrder.java @@ -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 statusS; + + @io.swagger.annotations.ApiModelProperty(value="创建时间/砍价开始时间",name="createDate") + private Date createDate; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java index b890d3cf9..16127b415 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxOrder.java @@ -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 statusS; diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxComposeOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxComposeOrderMapper.java new file mode 100644 index 000000000..7b3c0cd29 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxComposeOrderMapper.java @@ -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 selectById(@Param("id")Long id,@Param("tenantId")String tenantId); + + void updateStatusByOrderGroupId(WxComposeOrder order); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java index 4c770ebd4..3cb35b11f 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxOrderService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxOrderService.java @@ -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 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 composeOrderSaveDto,Long cUserId,EnumPayWay payWay,TenantEntity tenantEntity); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java index a723be87c..b994c4c2e 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxGameServiceImpl.java @@ -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 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 orderSave = new ArrayList(); + 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; diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java index eb4a66030..65cb86d04 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java @@ -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 cdRedisTemplate; - + @Override public PageInfo 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 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 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 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 statusS = new ArrayList(); 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 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; } } diff --git a/mallinkService/src/main/resources/mapper/WxComposeOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxComposeOrderMapper.xml new file mode 100644 index 000000000..42f4badc9 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxComposeOrderMapper.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`parent_tenant_id`,`c_user_id`,`payment_type`,`payment`,`payment_time`,`order_status`,`create_date`,`update_date` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + and `c_user_id` = #{cUserId} + + + + and `payment_type` = #{paymentType} + + + + and `payment` = #{payment} + + + + and `payment_time` = #{paymentTime} + + + + and `order_status` = #{orderStatus} + + + + and `order_status` in + + #{sItem} + + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + + + + + + + + update wx_order set order_status=#{orderStatus} + where order_group_id=#{orderGroupId} and order_status=10 + + and `tenant_id` = #{tenantId} + + + and `parent_tenant_id` = #{parentTenantId} + + + + + update wx_order set order_status=12 where `type`=0 and tenant_id = #{tenantId} and order_status in(10,15) and now()>press_end_date + + + diff --git a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml index c01c32150..136f09e80 100644 --- a/mallinkService/src/main/resources/mapper/WxOrderMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxOrderMapper.xml @@ -23,12 +23,13 @@ - + + `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` @@ -112,6 +113,10 @@ and `form_id` = #{formId} + + + and `compose_order_id` = #{composeOrderId} + and `order_status` in