99use ModStart \Core \Exception \BizException ;
1010use ModStart \Core \Input \InputPackage ;
1111use ModStart \Core \Input \Response ;
12+ use ModStart \Core \Util \SerializeUtil ;
1213use Module \Member \Auth \MemberUser ;
1314use Module \Member \Auth \MemberVip ;
1415use Module \Member \Core \MemberVipPayCenterBiz ;
16+ use Module \Member \Core \MemberVipVoucherBiz ;
17+ use Module \Member \Model \MemberVipOrder ;
1518use Module \Member \Support \MemberLoginCheck ;
1619use Module \Member \Util \MemberVipUtil ;
1720use Module \PayCenter \Support \PayCenterPerform ;
@@ -50,23 +53,45 @@ public function buy()
5053 if (empty ($ memberVip )) {
5154 return Response::generateError ('请选择会员类型 ' );
5255 }
53- $ priceInfoRet = $ this ->calc ( $ vipId );
56+ $ priceInfoRet = $ this ->processCalc ( );
5457 if ($ priceInfoRet ['code ' ]) {
5558 return Response::generateError ($ priceInfoRet ['msg ' ]);
5659 }
5760 $ money = $ priceInfoRet ['data ' ]['price ' ];
5861 if ($ money < 0.01 ) {
5962 return Response::generateError ('支付金额为空0.01 ' );
6063 }
61- $ memberVipOrder = ModelUtil::insert ('member_vip_order ' , [
62- 'status ' => OrderStatus::WAIT_PAY ,
63- 'memberUserId ' => MemberUser::id (),
64- 'vipId ' => $ memberVip ['id ' ],
65- 'payFee ' => $ money ,
66- 'expire ' => $ priceInfoRet ['data ' ]['expire ' ],
67- 'type ' => $ priceInfoRet ['data ' ]['type ' ],
68- ]);
69- BizException::throwsIf ('请安装 PayCenter 模块 ' , !modstart_module_enabled ('PayCenter ' ));
64+ try {
65+ ModelUtil::transactionBegin ();
66+ $ orderParam = [];
67+ if (!empty ($ priceInfoRet ['data ' ]['usedVoucherItems ' ])) {
68+ $ orderParam ['voucherItemIds ' ] = array_column ($ priceInfoRet ['data ' ]['usedVoucherItems ' ], 'id ' );
69+ }
70+ $ memberVipOrder = ModelUtil::insert (MemberVipOrder::class, [
71+ 'status ' => OrderStatus::WAIT_PAY ,
72+ 'memberUserId ' => MemberUser::id (),
73+ 'vipId ' => $ memberVip ['id ' ],
74+ 'payFee ' => $ money ,
75+ 'expire ' => $ priceInfoRet ['data ' ]['expire ' ],
76+ 'type ' => $ priceInfoRet ['data ' ]['type ' ],
77+ 'param ' => SerializeUtil::jsonEncode ($ orderParam ),
78+ ]);
79+ if (!empty ($ priceInfoRet ['data ' ]['usedVoucherItems ' ])) {
80+ MemberVipVoucherBiz::bizer ()->processUpdateUsedItemsInTransactionOrFail (
81+ MemberUser::id (),
82+ $ priceInfoRet ['data ' ]['usedVoucherItems ' ],
83+ 'MemberVipOrder ' ,
84+ $ memberVipOrder ['id ' ]
85+ );
86+ }
87+ ModelUtil::transactionCommit ();
88+ } catch (BizException $ e ) {
89+ ModelUtil::transactionRollback ();
90+ return Response::generateError ($ e ->getMessage ());
91+ } catch (\Exception $ e ) {
92+ ModelUtil::transactionRollback ();
93+ throw $ e ;
94+ }
7095 $ payCenterPerform = app (PayCenterPerform::class);
7196 return $ payCenterPerform ->performSubmitOrder (
7297 MemberVipPayCenterBiz::NAME ,
@@ -76,7 +101,14 @@ public function buy()
76101 );
77102 }
78103
79- public function calc ($ vipId = 0 )
104+ public function calc ()
105+ {
106+ $ ret = $ this ->processCalc ();
107+ unset($ ret ['data ' ]['usedVoucherItems ' ]);
108+ return $ ret ;
109+ }
110+
111+ private static function processCalc ()
80112 {
81113 $ input = InputPackage::buildFromInput ();
82114 if (MemberUser::isNotLogin ()) {
@@ -97,6 +129,20 @@ public function calc($vipId = 0)
97129 if ($ ret ['code ' ]) {
98130 return Response::generateError ($ ret ['msg ' ]);
99131 }
100- return Response::generateSuccessData ($ ret ['data ' ]);
132+ $ data = $ ret ['data ' ];
133+ if (modstart_module_enabled ('Voucher ' )) {
134+ $ voucherId = $ input ->getInteger ('voucherId ' );
135+ if ($ voucherId > 0 ) {
136+ $ bizer = MemberVipVoucherBiz::bizer ();
137+ $ voucherItems = MemberVipVoucherBiz::listValidForMemberWithItemIds (MemberUser::id (), [$ voucherId ]);
138+ $ voucherItems = $ bizer ->processFindUsableItems (MemberUser::id (), $ voucherItems );
139+ $ processResult = $ bizer ->processComputeItems (MemberUser::id (), $ voucherItems , [
140+ 'price ' => $ data ['price ' ],
141+ ]);
142+ $ data ['price ' ] = $ processResult ['price ' ];
143+ $ data ['usedVoucherItems ' ] = $ processResult ['usedVoucherItems ' ];
144+ }
145+ }
146+ return Response::generateSuccessData ($ data );
101147 }
102148}
0 commit comments