Buyvirtual.php 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165
  1. <?php
  2. namespace app\common\logic;
  3. use think\facade\Db;
  4. /**
  5. * ============================================================================
  6. * DSMall多用户商城
  7. * ============================================================================
  8. * 版权所有 2014-2028 长沙德尚网络科技有限公司,并保留所有权利。
  9. * 网站地址: http://www.csdeshang.com
  10. * ----------------------------------------------------------------------------
  11. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
  12. * 不允许对程序代码以任何形式任何目的的再发布。
  13. * ============================================================================
  14. * 逻辑层模型
  15. */
  16. class Buyvirtual
  17. {
  18. /**
  19. * 虚拟商品购买第一步,得到购买数据(商品、店铺、会员)
  20. * @param int $goods_id 商品ID
  21. * @param int $quantity 购买数量
  22. * @param int $member_id 会员ID
  23. * @return array
  24. */
  25. public function getBuyStep1Data($goods_id, $quantity, $member_id)
  26. {
  27. return $this->getBuyStepData($goods_id, $quantity, $member_id);
  28. }
  29. /**
  30. * 虚拟商品购买第二步,得到购买数据(商品、店铺、会员)
  31. * @param int $goods_id 商品ID
  32. * @param int $quantity 购买数量
  33. * @param int $member_id 会员ID
  34. * @return array
  35. */
  36. public function getBuyStep2Data($goods_id, $quantity, $member_id, $extra = [])
  37. {
  38. return $this->getBuyStepData($goods_id, $quantity, $member_id, $extra);
  39. }
  40. /**
  41. * 得到虚拟商品购买数据(商品、店铺、会员)
  42. * @param int $goods_id 商品ID
  43. * @param int $quantity 购买数量
  44. * @param int $member_id 会员ID
  45. * @return array
  46. */
  47. public function getBuyStepData($goods_id, $quantity, $member_id, $extra = [])
  48. {
  49. $goods_info = model('goods')->getGoodsOnlineInfoAndPromotionById($goods_id);
  50. if (empty($goods_info)) {
  51. return ds_callback(false, '该商品不符合购买条件,可能的原因有:下架、不存在、过期等');
  52. }
  53. if ($goods_info['is_virtual'] != 1 || $goods_info['virtual_indate'] < TIMESTAMP) {
  54. return ds_callback(false, '该商品不符合购买条件,可能的原因有:下架、不存在、过期等');
  55. }
  56. if ($goods_info['virtual_limit'] > $goods_info['goods_storage']) {
  57. $goods_info['virtual_limit'] = $goods_info['goods_storage'];
  58. }
  59. if (isset($extra['pintuan_id']) && intval($extra['pintuan_id']) > 0) {
  60. //如果是特定拼团商品,则只按照拼团的规则进行处理
  61. model('buy_1', 'logic')->getPintuanInfo($goods_info, $quantity, $extra, $member_id);
  62. } else {
  63. //取得抢购信息
  64. $goods_info = $this->_getGroupbuyInfo($goods_info);
  65. }
  66. $quantity = abs(intval($quantity));
  67. $quantity = $quantity == 0 ? 1 : $quantity;
  68. $quantity = $quantity > $goods_info['virtual_limit'] ? $goods_info['virtual_limit'] : $quantity;
  69. if ($quantity > $goods_info['goods_storage']) {
  70. return ds_callback(false, '该商品库存不足');
  71. }
  72. $goods_info['quantity'] = $quantity;
  73. $goods_info['goods_total'] = ds_price_format($goods_info['goods_price'] * $goods_info['quantity']);
  74. $goods_info['goods_original_total'] = ds_price_format($goods_info['goods_original_price'] * $goods_info['quantity']);
  75. $goods_info['goods_discount_total'] = ds_price_format($goods_info['goods_original_total'] - $goods_info['goods_total']);
  76. $goods_info['goods_image_url'] = goods_cthumb($goods_info['goods_image'], 240, $goods_info['store_id']);
  77. $return = [];
  78. $return['goods_info'] = $goods_info;
  79. $return['store_info'] = model('store')->getStoreOnlineInfoByID($goods_info['store_id'], 'store_name,store_id,member_id');
  80. $return['member_info'] = model('member')->getMemberInfoByID($member_id);
  81. // $pd_payment_info = model('payment')->getPaymentOpenInfo(array('payment_code'=>'predeposit'));
  82. // if (empty($pd_payment_info)) {
  83. // $return['member_info']['available_predeposit'] = 0;
  84. // $return['member_info']['available_rc_balance'] = 0;
  85. // }
  86. //返回店铺可用的代金券
  87. $return['store_voucher_list'] = [];
  88. if (config('ds_config.voucher_allow')) {
  89. $voucher_model = model('voucher');
  90. $condition = [];
  91. $condition[] = ['voucher_store_id', '=', $goods_info['store_id']];
  92. $condition[] = ['voucher_owner_id', '=', $member_id];
  93. $return['store_voucher_list'] = $voucher_model->getCurrentAvailableVoucher($condition, $goods_info['goods_total']);
  94. }
  95. return ds_callback(true, '', $return);
  96. }
  97. /**
  98. * 虚拟商品购买第三步
  99. * @param array $post 接收POST数据,必须传入goods_id:商品ID,quantity:购买数量,buyer_phone:接收手机,buyer_msg:买家留言
  100. * @param int $member_id
  101. * @return array
  102. */
  103. public function buyStep3($post, $member_id)
  104. {
  105. $result = $this->getBuyStepData($post['goods_id'], $post['quantity'], $member_id, $post);
  106. if (!$result['code'])
  107. return $result;
  108. $goods_info = $result['data']['goods_info'];
  109. $member_info = $result['data']['member_info'];
  110. $goods_info['store_voucher_list'] = isset($result['data']['store_voucher_list']) ? $result['data']['store_voucher_list'] : [];
  111. //应付总金额计算
  112. $pay_total = $goods_info['goods_price'] * $goods_info['quantity'];
  113. $store_id = $goods_info['store_id'];
  114. $store_goods_total_list = [$store_id => $pay_total];
  115. $pay_total = $store_goods_total_list[$store_id];
  116. //整理数据
  117. $input = [];
  118. $input['quantity'] = $goods_info['quantity'];
  119. $input['buyer_phone'] = $post['buyer_phone'];
  120. $input['buyer_msg'] = $post['buyer_msg'];
  121. $input['pay_total'] = $pay_total;
  122. $input['order_from'] = $post['order_from'];
  123. $input['pintuan_id'] = isset($post['pintuan_id']) ? $post['pintuan_id'] : 0;
  124. $input['pintuangroup_id'] = isset($post['pintuangroup_id']) ? $post['pintuangroup_id'] : 0;
  125. $goods_model = model('goods');
  126. $input['voucher'] = isset($post['voucher']) ? $post['voucher'] : '';
  127. try {
  128. //开始事务
  129. Db::startTrans();
  130. //生成订单
  131. $order_info = $this->_createOrder($input, $goods_info, $member_info);
  132. // var_dump($order_info);exit();
  133. if (!$order_info) {
  134. Db::rollback();
  135. return false;
  136. }
  137. //处理卡券相关数据
  138. //生成推广记录
  139. $this->addOrderInviter($order_info);
  140. //提交事务
  141. Db::commit();
  142. } catch (Exception $e) {
  143. //回滚事务
  144. Db::rollback();
  145. return ds_callback(false, $e->getMessage());
  146. }
  147. //变更库存和销量
  148. \mall\queue\QueueClient::push('createOrderUpdateStorage', [$goods_info['goods_id'] => $goods_info['quantity']]);
  149. //更新抢购信息
  150. $this->_updateGroupBuy($goods_info);
  151. return ds_callback(true, '', ['order_id' => $order_info['order_id'], 'order_sn' => $order_info['order_sn']]);
  152. }
  153. /**
  154. * 生成推广记录
  155. * @param array $order_list
  156. */
  157. public function addOrderInviter($order = [])
  158. {
  159. if (!config('ds_config.inviter_open')) {
  160. return;
  161. }
  162. if (empty($order) || !is_array($order))
  163. return;
  164. $inviter_ratio_1 = config('ds_config.inviter_ratio_1');
  165. $inviter_ratio_2 = config('ds_config.inviter_ratio_2');
  166. $inviter_ratio_3 = config('ds_config.inviter_ratio_3');
  167. $orderinviter_model = model('orderinviter');
  168. $order_id = $order['order_id'];
  169. $goods = $order;
  170. //查询商品的分销信息
  171. $goods_common_info = Db::name('goodscommon')->alias('gc')->join('goods g', 'g.goods_commonid=gc.goods_commonid')->where('g.goods_id=' . $goods['goods_id'])->field('gc.goods_commonid,gc.inviter_open,gc.inviter_ratio')->find();
  172. if (!$goods_common_info['inviter_open']) {
  173. return;
  174. }
  175. $goods_amount = $goods['goods_price'] * $goods['goods_num'] * $goods_common_info['inviter_ratio'] / 100;
  176. $inviter_ratios = [
  177. $inviter_ratio_1,
  178. $inviter_ratio_2,
  179. $inviter_ratio_3,
  180. ];
  181. //判断买家是否是分销员
  182. if (config('ds_config.inviter_return')) {
  183. if (Db::name('inviter')->where('inviter_state=1 AND inviter_id=' . $order['buyer_id'])->value('inviter_id')) {
  184. if (isset($inviter_ratios[0]) && floatval($inviter_ratios[0]) > 0) {
  185. $money_1 = round($inviter_ratios[0] / 100 * $goods_amount, 2);
  186. if ($money_1 > 0) {
  187. //生成推广记录
  188. Db::name('orderinviter')->insert([
  189. 'orderinviter_addtime' => TIMESTAMP,
  190. 'orderinviter_store_name' => $order['store_name'],
  191. 'orderinviter_goods_amount' => $goods_amount,
  192. 'orderinviter_goods_quantity' => $goods['goods_num'],
  193. 'orderinviter_order_type' => 1,
  194. 'orderinviter_store_id' => $goods['store_id'],
  195. 'orderinviter_goods_commonid' => $goods_common_info['goods_commonid'],
  196. 'orderinviter_goods_id' => $goods['goods_id'],
  197. 'orderinviter_level' => 1,
  198. 'orderinviter_goods_name' => $goods['goods_name'],
  199. 'orderinviter_order_id' => $order_id,
  200. 'orderinviter_order_sn' => $order['order_sn'],
  201. 'orderinviter_member_id' => $order['buyer_id'],
  202. 'orderinviter_member_name' => $order['buyer_name'],
  203. 'orderinviter_money' => $money_1,
  204. 'orderinviter_remark' => '获得分销员返佣,佣金比例' . $inviter_ratios[0] . '%,订单号' . $order['order_sn'],
  205. ]);
  206. }
  207. }
  208. }
  209. }
  210. //一级推荐人
  211. $inviter_1_id = Db::name('member')->where('member_id', $order['buyer_id'])->value('inviter_id');
  212. if (!$inviter_1_id || !Db::name('inviter')->where('inviter_state=1 AND inviter_id=' . $inviter_1_id)->value('inviter_id')) {
  213. return;
  214. }
  215. $inviter_1 = Db::name('member')->where('member_id', $inviter_1_id)->field('inviter_id,member_id,member_name')->find();
  216. if ($inviter_1 && isset($inviter_ratios[0]) && floatval($inviter_ratios[0]) > 0) {
  217. $money_1 = round($inviter_ratios[0] / 100 * $goods_amount, 2);
  218. if ($money_1 > 0) {
  219. //生成推广记录
  220. Db::name('orderinviter')->insert([
  221. 'orderinviter_addtime' => TIMESTAMP,
  222. 'orderinviter_store_name' => $order['store_name'],
  223. 'orderinviter_goods_amount' => $goods_amount,
  224. 'orderinviter_goods_quantity' => $goods['goods_num'],
  225. 'orderinviter_order_type' => 1,
  226. 'orderinviter_store_id' => $goods['store_id'],
  227. 'orderinviter_goods_commonid' => $goods_common_info['goods_commonid'],
  228. 'orderinviter_goods_id' => $goods['goods_id'],
  229. 'orderinviter_level' => 1,
  230. 'orderinviter_goods_name' => $goods['goods_name'],
  231. 'orderinviter_order_id' => $order_id,
  232. 'orderinviter_order_sn' => $order['order_sn'],
  233. 'orderinviter_member_id' => $inviter_1['member_id'],
  234. 'orderinviter_member_name' => $inviter_1['member_name'],
  235. 'orderinviter_money' => $money_1,
  236. 'orderinviter_remark' => '获得一级推荐佣金,佣金比例' . $inviter_ratios[0] . '%,推荐关系' . $inviter_1['member_name'] . '->' . $order['buyer_name'] . ',订单号' . $order['order_sn'],
  237. ]);
  238. }
  239. }
  240. if (config('ds_config.inviter_level') <= 1) {
  241. return;
  242. }
  243. //二级推荐人
  244. $inviter_2_id = Db::name('member')->where('member_id', $inviter_1_id)->value('inviter_id');
  245. if (!$inviter_2_id || !Db::name('inviter')->where('inviter_state=1 AND inviter_id=' . $inviter_2_id)->value('inviter_id')) {
  246. return;
  247. }
  248. $inviter_2 = Db::name('member')->where('member_id', $inviter_2_id)->field('inviter_id,member_id,member_name')->find();
  249. if ($inviter_2 && isset($inviter_ratios[1]) && floatval($inviter_ratios[1]) > 0) {
  250. $money_2 = round($inviter_ratios[1] / 100 * $goods_amount, 2);
  251. if ($money_2 > 0) {
  252. //生成推广记录
  253. Db::name('orderinviter')->insert([
  254. 'orderinviter_addtime' => TIMESTAMP,
  255. 'orderinviter_store_name' => $order['store_name'],
  256. 'orderinviter_goods_amount' => $goods_amount,
  257. 'orderinviter_goods_quantity' => $goods['goods_num'],
  258. 'orderinviter_order_type' => 1,
  259. 'orderinviter_store_id' => $goods['store_id'],
  260. 'orderinviter_goods_commonid' => $goods_common_info['goods_commonid'],
  261. 'orderinviter_goods_id' => $goods['goods_id'],
  262. 'orderinviter_level' => 2,
  263. 'orderinviter_goods_name' => $goods['goods_name'],
  264. 'orderinviter_order_id' => $order_id,
  265. 'orderinviter_order_sn' => $order['order_sn'],
  266. 'orderinviter_member_id' => $inviter_2['member_id'],
  267. 'orderinviter_member_name' => $inviter_2['member_name'],
  268. 'orderinviter_money' => $money_2,
  269. 'orderinviter_remark' => '获得二级推荐佣金,佣金比例' . $inviter_ratios[1] . '%,推荐关系' . $inviter_2['member_name'] . '->' . $inviter_1['member_name'] . '->' . $order['buyer_name'] . ',订单号' . $order['order_sn'],
  270. ]);
  271. }
  272. }
  273. if (config('ds_config.inviter_level') <= 2) {
  274. return;
  275. }
  276. //三级推荐人
  277. $inviter_3_id = Db::name('member')->where('member_id', $inviter_2_id)->value('inviter_id');
  278. if (!$inviter_3_id || !Db::name('inviter')->where('inviter_state=1 AND inviter_id=' . $inviter_3_id)->value('inviter_id')) {
  279. return;
  280. }
  281. $inviter_3 = Db::name('member')->where('member_id', $inviter_3_id)->field('inviter_id,member_id,member_name')->find();
  282. if ($inviter_3 && isset($inviter_ratios[2]) && floatval($inviter_ratios[2]) > 0) {
  283. $money_3 = round($inviter_ratios[2] / 100 * $goods_amount, 2);
  284. if ($money_3 > 0) {
  285. //生成推广记录
  286. Db::name('orderinviter')->insert([
  287. 'orderinviter_addtime' => TIMESTAMP,
  288. 'orderinviter_store_name' => $order['store_name'],
  289. 'orderinviter_goods_amount' => $goods_amount,
  290. 'orderinviter_goods_quantity' => $goods['goods_num'],
  291. 'orderinviter_order_type' => 1,
  292. 'orderinviter_store_id' => $goods['store_id'],
  293. 'orderinviter_goods_commonid' => $goods_common_info['goods_commonid'],
  294. 'orderinviter_goods_id' => $goods['goods_id'],
  295. 'orderinviter_level' => 3,
  296. 'orderinviter_goods_name' => $goods['goods_name'],
  297. 'orderinviter_order_id' => $order_id,
  298. 'orderinviter_order_sn' => $order['order_sn'],
  299. 'orderinviter_member_id' => $inviter_3['member_id'],
  300. 'orderinviter_member_name' => $inviter_3['member_name'],
  301. 'orderinviter_money' => $money_3,
  302. 'orderinviter_remark' => '获得三级推荐佣金,佣金比例' . $inviter_ratios[2] . '%,推荐关系' . $inviter_3['member_name'] . '->' . $inviter_2['member_name'] . '->' . $inviter_1['member_name'] . '->' . $order['buyer_name'] . ',订单号' . $order['order_sn'],
  303. ]);
  304. }
  305. }
  306. }
  307. /**
  308. * 生成订单
  309. * @param array $input 表单数据
  310. * @param unknown $goods_info 商品数据
  311. * @param unknown $member_info 会员数据
  312. * @throws Exception
  313. * @return array
  314. */
  315. private function _createOrder($input, $goods_info, $member_info)
  316. {
  317. extract($input);
  318. $vrorder_model = model('vrorder');
  319. //存储生成的订单,函数会返回该数组
  320. $order_list = [];
  321. $order = [];
  322. $order_code = [];
  323. //验证代金券
  324. if (!empty($input['voucher'])) {
  325. if (preg_match_all('/^(\d+)\|(\d+)\|([\d.]+)$/', $input['voucher'], $matchs)) {
  326. if (floatval($matchs[3][0]) > 0) {
  327. $input_voucher = [];
  328. $input_voucher['vouchertemplate_id'] = $matchs[1][0];
  329. $input_voucher['voucher_price'] = $matchs[3][0];
  330. $voucher_list = $goods_info['store_voucher_list'];
  331. if (is_array($voucher_list) && isset($voucher_list[$input_voucher['vouchertemplate_id']])) {
  332. $input_voucher['voucher_id'] = $voucher_list[$input_voucher['vouchertemplate_id']]['voucher_id'];
  333. $input_voucher['voucher_code'] = $voucher_list[$input_voucher['vouchertemplate_id']]['voucher_code'];
  334. $input_voucher['voucher_owner_id'] = $voucher_list[$input_voucher['vouchertemplate_id']]['voucher_owner_id'];
  335. $input_voucher['voucher_price'] = floatval($input_voucher['voucher_price']);
  336. $pay_total = bcsub($pay_total, $input_voucher['voucher_price'], 2);
  337. if ($pay_total < 0) {
  338. $pay_total = 0;
  339. }
  340. } else {
  341. $input_voucher = [];
  342. }
  343. }
  344. }
  345. }
  346. //新增内容
  347. $order['order_state'] = ORDER_STATE_NEW;
  348. $orderAmount = $input['pay_total']; //初始订单金额
  349. $order['deduction_amount'] = 0;
  350. //这里开始新增
  351. $orderSn = makePaySn($member_info['member_id']);
  352. $cardId = input('post.card_id'); //抵扣卡的Id
  353. if (!empty($cardId) || $cardId != 0) {
  354. if (strpos($cardId, ',') !== false) {
  355. $card_ids = explode(',', $cardId);
  356. } else {
  357. $card_ids[] = $cardId;
  358. }
  359. $SubCard = model('Subcard');
  360. foreach ($card_ids as $key => $value) {
  361. $where = [];
  362. $where['id'] = $value;
  363. $where['member_id'] = $member_info['member_id'];
  364. $cardInfo = $SubCard->where($where)->find();
  365. if (!$cardInfo && $cardInfo['card_status'] != 3 && $cardInfo['balance'] != 0) {
  366. continue;
  367. }
  368. if (!empty($cardInfo['bind_cate'])) {
  369. $cateLimits = explode(',', $cardInfo['bind_cate']);
  370. $diff = array_values(array_diff([$goods_info['gc_id']], $cateLimits));
  371. if (!empty($diff)) {
  372. continue;
  373. }
  374. }
  375. $balance = $cardInfo['balance'];
  376. //1.卡的余额要变, 订单金额也要变
  377. if ($balance < $orderAmount - $order['deduction_amount']) {
  378. //余额小于 先冻结起来
  379. $pay_amount = $balance;
  380. $order['deduction_amount'] += $pay_amount;
  381. $unpaid_amount =
  382. $order['card_id'] = $value;
  383. $logic_payment = model('payment', 'logic'); //推送消息记录
  384. $updateInfo = [
  385. 'balance' => 0,
  386. 'card_status' => 3,//用完了
  387. 'freeze' => $cardInfo['freeze'] + $pay_amount, //余额冻结
  388. 'used_count' => $cardInfo['used_count'] + 1,
  389. 'update_time' => time(),
  390. ];
  391. $info = [
  392. 'cardNo' => $cardInfo['card_no'],
  393. 'memberId' => $member_info['member_id'],
  394. 'amount' => $pay_amount,
  395. 'orderNo' => $orderSn,
  396. ];
  397. $logic_payment->payRecordPushNoAmount($info, 1);
  398. } else {
  399. //余额大于等于订单金额
  400. $pay_amount = $orderAmount - $order['deduction_amount'];
  401. $order['deduction_amount'] += $pay_amount;
  402. $order['card_id'] = $cardId;
  403. $order['payment_time'] = TIMESTAMP;
  404. $order['payment_code'] = 'card';
  405. $updateInfo = [
  406. 'balance' => $balance - $pay_amount,
  407. 'card_status' => 2, //状态为使用中
  408. 'freeze' => $cardInfo['freeze'] + $pay_amount, //余额冻结
  409. 'used_count' => $cardInfo['used_count'] + 1,
  410. 'update_time' => time(),
  411. ];
  412. $order['order_state'] = 40; //直接就到了待发货阶段
  413. $logic_payment = model('payment', 'logic'); //推送消息记录
  414. $info = [
  415. 'cardNo' => $cardInfo['card_no'],
  416. 'memberId' => $member_info['member_id'],
  417. 'amount' => $pay_amount,
  418. 'orderNo' => $orderSn,
  419. ];
  420. $logic_payment->payRecordPushNoAmount($info, 1);
  421. }
  422. $res = Db::name('sub_card')->where([
  423. ['id', '=', $value],
  424. ])->update($updateInfo);
  425. $expenseData[$key] = [
  426. 'member_id' => $member_info['member_id'],
  427. 'card_id' => $value,
  428. 'expense_amount' => $pay_amount, //抵消金额
  429. 'order_amount' => $orderAmount,
  430. 'expense_time' => time(),
  431. 'is_vir' => 1,
  432. ];
  433. }
  434. }
  435. //这里结束新增
  436. $order['order_sn'] = $orderSn;
  437. $order['store_id'] = $goods_info['store_id'];
  438. $order['store_name'] = $goods_info['store_name'];
  439. $order['buyer_id'] = $member_info['member_id'];
  440. $order['buyer_name'] = $member_info['member_name'];
  441. $order['buyer_phone'] = $input['buyer_phone'];
  442. $order['buyer_msg'] = $input['buyer_msg'];
  443. $order['add_time'] = TIMESTAMP;
  444. $order['order_amount'] = $orderAmount;
  445. $order['pd_amount'] = 0;
  446. $order['goods_id'] = $goods_info['goods_id'];
  447. $order['goods_name'] = $goods_info['goods_name'];
  448. $order['goods_price'] = $goods_info['goods_price'];
  449. $order['goods_num'] = $input['quantity'];
  450. $order['goods_image'] = $goods_info['goods_image'];
  451. $store_gc_id_commis_rate_list = model('storebindclass')->getStoreGcidCommisRateList([$goods_info]);
  452. $order['commis_rate'] = floatval(@$store_gc_id_commis_rate_list[$goods_info['store_id']][$goods_info['gc_id']]);
  453. $order['gc_id'] = $goods_info['gc_id'];
  454. $order['vr_indate'] = $goods_info['virtual_indate'];
  455. $order['vr_code'] = $goods_info['virtual_code'];
  456. $order['vr_invalid_refund'] = $goods_info['virtual_invalid_refund'];
  457. $order['order_from'] = $input['order_from'];
  458. $order['order_promotion_type'] = 0;
  459. if (isset($goods_info['ifgroupbuy']) && $goods_info['ifgroupbuy'] == 1) {
  460. $order['order_promotion_type'] = 1;
  461. $order['promotions_id'] = $goods_info['groupbuy_id'];
  462. } else if (isset($goods_info['ifpintuan']) && intval($input['pintuan_id']) > 0) {
  463. $order['order_promotion_type'] = 2;
  464. $order['promotions_id'] = $input['pintuangroup_id'];
  465. }
  466. $order_id = $vrorder_model->addVrorder($order);
  467. if (!$order_id) {
  468. ds_json_encode(10001, '订单保存失败');
  469. exit();
  470. }
  471. $order['order_id'] = $order_id;
  472. //存在虚拟商品编号 且 付费金额为 0时 ,获取消费券
  473. if ($order['order_amount'] - $order['deduction_amount'] == 0) {
  474. $result = $vrorder_model->addVrorderCode($order);
  475. if (!$result) {
  476. ds_json_encode(10001, '兑换码获取失败');
  477. exit();
  478. }
  479. // $param = array('order_id' => $order['order_id'], 'buyer_id' => $order['buyer_id'], 'buyer_phone' => $order['buyer_phone']);
  480. // \mall\queue\QueueClient::push('sendVrCode', $param);
  481. }
  482. if (!empty($expenseData)) {
  483. foreach ($expenseData as $key => $value) {
  484. //插入消费记录
  485. $value['order_id'] = $order_id;
  486. $addExpense = Db::name('sub_card_expense')->insert($value);
  487. }
  488. if ($order['deduction_amount'] == $order['order_amount']) {
  489. $logic_payment->paysuccesspush($order, 1);
  490. }
  491. }
  492. $order['order_id'] = $order_id;
  493. if ($order['order_promotion_type'] == 2) {
  494. $res = model('buy_1', 'logic')->updatePintuan($input, $goods_info, $order, 1, $member_info['member_id']);
  495. if (!$order['promotions_id']) {
  496. $vrorder_model->editVrorder(['promotions_id' => $res['pintuangroup_id']], ['order_id' => $order['order_id']]);
  497. }
  498. }
  499. // 提醒[库存报警]
  500. if ($goods_info['goods_storage_alarm'] >= ($goods_info['goods_storage'] - $input['quantity'])) {
  501. $param = [];
  502. $param['common_id'] = $goods_info['goods_commonid'];
  503. $param['sku_id'] = $goods_info['goods_id'];
  504. $ten_param = [$param['common_id'], $param['sku_id']];
  505. $weixin_param = [
  506. 'url' => config('ds_config.h5_site_url') . '/seller/goods_form_2?commonid=' . $goods_info['goods_commonid'] . '&class_id=' . $goods_info['gc_id'],
  507. 'data' => [
  508. "keyword1" => [
  509. "value" => $goods_info['goods_storage'] - $input['quantity'],
  510. "color" => "#333",
  511. ],
  512. "keyword2" => [
  513. "value" => date('Y-m-d H:i'),
  514. "color" => "#333",
  515. ],
  516. ],
  517. ];
  518. \mall\queue\QueueClient::push('sendStoremsg', ['code' => 'goods_storage_alarm', 'store_id' => $goods_info['store_id'], 'param' => $param, 'ali_param' => $param, 'ten_param' => $ten_param, 'weixin_param' => $weixin_param]);
  519. }
  520. //更新使用的代金券状态
  521. if (!empty($input_voucher) && is_array($input_voucher)) {
  522. \mall\queue\QueueClient::push('editVoucherState', [$goods_info['store_id'] => $input_voucher]);
  523. }
  524. return $order;
  525. }
  526. /**
  527. * 更新抢购购买人数和数量
  528. */
  529. private function _updateGroupBuy($goods_info)
  530. {
  531. if (isset($goods_info['ifgroupbuy']) && $goods_info['groupbuy_id']) {
  532. $groupbuy_info = [];
  533. $groupbuy_info['groupbuy_id'] = $goods_info['groupbuy_id'];
  534. $groupbuy_info['quantity'] = $goods_info['quantity'];
  535. \mall\queue\QueueClient::push('editGroupbuySaleCount', $groupbuy_info);
  536. }
  537. }
  538. /**
  539. * 充值卡支付
  540. * 如果充值卡足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
  541. */
  542. private function _rcbPay($order_info, $input, $buyer_info)
  543. {
  544. $available_rcb_amount = floatval($buyer_info['available_rc_balance']);
  545. if ($available_rcb_amount <= 0)
  546. return;
  547. if (!isset($order_info['rcb_amount'])) {
  548. $order_info['rcb_amount'] = 0;
  549. }
  550. if (!isset($order_info['pd_amount'])) {
  551. $order_info['pd_amount'] = 0;
  552. }
  553. $vrorder_model = model('vrorder');
  554. $predeposit_model = model('predeposit');
  555. $order_amount = floatval($order_info['order_amount']);
  556. $data_pd = [];
  557. $data_pd['member_id'] = $buyer_info['member_id'];
  558. $data_pd['member_name'] = $buyer_info['member_name'];
  559. $data_pd['amount'] = $order_amount;
  560. $data_pd['order_sn'] = $order_info['order_sn'];
  561. if ($available_rcb_amount >= $order_amount) {
  562. // 预存款立即支付,订单支付完成
  563. $predeposit_model->changeRcb('order_pay', $data_pd);
  564. $available_rcb_amount -= $order_amount;
  565. // 订单状态 置为已支付
  566. $data_order = [];
  567. $order_info['order_state'] = $data_order['order_state'] = 40;
  568. $data_order['payment_time'] = TIMESTAMP;
  569. $data_order['payment_code'] = 'predeposit';
  570. $data_order['rcb_amount'] = $order_info['order_amount'];
  571. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  572. if (!$result) {
  573. throw new \think\Exception('订单更新失败', 10006);
  574. }
  575. if ($order_info['order_promotion_type'] != 2) {
  576. //发放兑换码
  577. $insert = $vrorder_model->addVrorderCode($order_info);
  578. //发送兑换码到手机
  579. $param = ['order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'], 'buyer_phone' => $order_info['buyer_phone']];
  580. \mall\queue\QueueClient::push('sendVrCode', $param);
  581. // 支付成功发送店铺消息
  582. $param = [];
  583. $param['code'] = 'new_order';
  584. $param['store_id'] = $order_info['store_id'];
  585. $param['ali_param'] = [
  586. 'order_sn' => $order_info['order_sn'],
  587. ];
  588. $param['ten_param'] = [
  589. $order_info['order_sn'],
  590. ];
  591. $param['param'] = $param['ali_param'];
  592. $param['weixin_param'] = [
  593. 'url' => config('ds_config.h5_site_url') . '/seller/vrorder_detail?order_id=' . $order_info['order_id'],
  594. 'data' => [
  595. "keyword1" => [
  596. "value" => $order_info['order_sn'],
  597. "color" => "#333",
  598. ],
  599. "keyword2" => [
  600. "value" => $order_info['goods_name'],
  601. "color" => "#333",
  602. ],
  603. "keyword3" => [
  604. "value" => $order_info['order_amount'],
  605. "color" => "#333",
  606. ],
  607. "keyword4" => [
  608. "value" => date('Y-m-d H:i', $order_info['add_time']),
  609. "color" => "#333",
  610. ],
  611. ],
  612. ];
  613. \mall\queue\QueueClient::push('sendStoremsg', $param);
  614. if (!$insert) {
  615. throw new \think\Exception('兑换码发送失败', 10006);
  616. }
  617. }
  618. } else {
  619. //暂冻结预存款,后面还需要 API彻底完成支付
  620. $data_pd['amount'] = $available_rcb_amount;
  621. $predeposit_model->changeRcb('order_freeze', $data_pd);
  622. //预存款支付金额保存到订单
  623. $data_order = [];
  624. $order_info['rcb_amount'] = $data_order['rcb_amount'] = $available_rcb_amount;
  625. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  626. if (!$result) {
  627. throw new \think\Exception('订单更新失败', 10006);
  628. }
  629. }
  630. return $order_info;
  631. }
  632. /**
  633. * 预存款支付
  634. * 如果预存款足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
  635. */
  636. private function _pdPay($order_info, $input, $buyer_info)
  637. {
  638. if ($order_info['order_state'] == ORDER_STATE_PAY)
  639. return;
  640. $available_pd_amount = floatval($buyer_info['available_predeposit']);
  641. if ($available_pd_amount <= 0)
  642. return;
  643. if (!isset($order_info['rcb_amount'])) {
  644. $order_info['rcb_amount'] = 0;
  645. }
  646. if (!isset($order_info['pd_amount'])) {
  647. $order_info['pd_amount'] = 0;
  648. }
  649. $vrorder_model = model('vrorder');
  650. $predeposit_model = model('predeposit');
  651. //充值卡支付金额
  652. $rcb_amount = isset($order_info['rcb_amount']) ? floatval($order_info['rcb_amount']) : 0;
  653. $order_amount = floatval($order_info['order_amount']) - $rcb_amount;
  654. $data_pd = [];
  655. $data_pd['member_id'] = $buyer_info['member_id'];
  656. $data_pd['member_name'] = $buyer_info['member_name'];
  657. $data_pd['amount'] = $order_amount;
  658. $data_pd['order_sn'] = $order_info['order_sn'];
  659. if ($available_pd_amount >= $order_amount) {
  660. //预存款立即支付,订单支付完成
  661. $predeposit_model->changePd('order_pay', $data_pd);
  662. $available_pd_amount -= $order_amount;
  663. //下单,支付被冻结的充值卡
  664. $pd_amount = $rcb_amount;
  665. if ($pd_amount > 0) {
  666. $data_pd = [];
  667. $data_pd['member_id'] = $buyer_info['member_id'];
  668. $data_pd['member_name'] = $buyer_info['member_name'];
  669. $data_pd['amount'] = $pd_amount;
  670. $data_pd['order_sn'] = $order_info['order_sn'];
  671. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  672. }
  673. // 订单状态 置为已支付
  674. $data_order = [];
  675. $data_order['order_state'] = 40;
  676. $data_order['payment_time'] = TIMESTAMP;
  677. $data_order['payment_code'] = 'predeposit';
  678. $data_order['pd_amount'] = $order_amount;
  679. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  680. if (!$result) {
  681. throw new \think\Exception('订单更新失败', 10006);
  682. }
  683. if ($order_info['order_promotion_type'] != 2) {
  684. //发放兑换码
  685. $result = $vrorder_model->addVrorderCode($order_info);
  686. if (!$result) {
  687. var_dump(1);
  688. exit();
  689. ds_json_encode(10001, '兑换码获取失败');
  690. exit();
  691. }
  692. // //发送兑换码到手机
  693. // $param = array('order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'], 'buyer_phone' => $order_info['buyer_phone']);
  694. // \mall\queue\QueueClient::push('sendVrCode', $param);
  695. // 支付成功发送店铺消息
  696. $param = [];
  697. $param['code'] = 'new_order';
  698. $param['store_id'] = $order_info['store_id'];
  699. $param['ali_param'] = [
  700. 'order_sn' => $order_info['order_sn'],
  701. ];
  702. $param['ten_param'] = [
  703. $order_info['order_sn'],
  704. ];
  705. $param['param'] = $param['ali_param'];
  706. $param['weixin_param'] = [
  707. 'url' => config('ds_config.h5_site_url') . '/seller/vrorder_detail?order_id=' . $order_info['order_id'],
  708. 'data' => [
  709. "keyword1" => [
  710. "value" => $order_info['order_sn'],
  711. "color" => "#333",
  712. ],
  713. "keyword2" => [
  714. "value" => $order_info['goods_name'],
  715. "color" => "#333",
  716. ],
  717. "keyword3" => [
  718. "value" => $order_info['order_amount'],
  719. "color" => "#333",
  720. ],
  721. "keyword4" => [
  722. "value" => date('Y-m-d H:i', $order_info['add_time']),
  723. "color" => "#333",
  724. ],
  725. ],
  726. ];
  727. \mall\queue\QueueClient::push('sendStoremsg', $param);
  728. }
  729. } else {
  730. //暂冻结预存款,后面还需要 API彻底完成支付
  731. $data_pd['amount'] = $available_pd_amount;
  732. $predeposit_model->changePd('order_freeze', $data_pd);
  733. //预存款支付金额保存到订单
  734. $data_order = [];
  735. $data_order['pd_amount'] = $available_pd_amount;
  736. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  737. if (!$result) {
  738. throw new \think\Exception('订单更新失败', 10006);
  739. }
  740. }
  741. }
  742. /**
  743. * 充值卡支付
  744. * 如果充值卡足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
  745. */
  746. public function rcbPay($order_info, $input, $buyer_info)
  747. {
  748. $available_rcb_amount = floatval($buyer_info['available_rc_balance']);
  749. if ($available_rcb_amount <= 0)
  750. return $order_info;
  751. $vrorder_model = model('vrorder');
  752. $predeposit_model = model('predeposit');
  753. $order_amount = round($order_info['order_amount'] - $order_info['rcb_amount'] - $order_info['pd_amount'], 2);
  754. $data_pd = [];
  755. $data_pd['member_id'] = $buyer_info['member_id'];
  756. $data_pd['member_name'] = $buyer_info['member_name'];
  757. $data_pd['amount'] = $order_amount;
  758. $data_pd['order_sn'] = $order_info['order_sn'];
  759. if ($available_rcb_amount >= $order_amount) {
  760. // 预存款立即支付,订单支付完成
  761. $predeposit_model->changeRcb('order_pay', $data_pd);
  762. $available_rcb_amount -= $order_amount;
  763. //支付被冻结的充值卡
  764. $rcb_amount = isset($order_info['rcb_amount']) ? floatval($order_info['rcb_amount']) : 0;
  765. if ($rcb_amount > 0) {
  766. $data_pd = [];
  767. $data_pd['member_id'] = $buyer_info['member_id'];
  768. $data_pd['member_name'] = $buyer_info['member_name'];
  769. $data_pd['amount'] = $rcb_amount;
  770. $data_pd['order_sn'] = $order_info['order_sn'];
  771. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  772. }
  773. // 订单状态 置为已支付
  774. $data_order = [];
  775. $order_info['order_state'] = $data_order['order_state'] = 40;
  776. $data_order['payment_time'] = TIMESTAMP;
  777. $data_order['payment_code'] = 'predeposit';
  778. $data_order['rcb_amount'] = round($order_info['rcb_amount'] + $order_amount, 2);
  779. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  780. if (!$result) {
  781. throw new \think\Exception('订单更新失败', 10006);
  782. }
  783. if ($order_info['order_promotion_type'] != 2) {
  784. //发放兑换码
  785. $insert = $vrorder_model->addVrorderCode($order_info);
  786. //发送兑换码到手机
  787. $param = ['order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'], 'buyer_phone' => $order_info['buyer_phone']];
  788. \mall\queue\QueueClient::push('sendVrCode', $param);
  789. // 支付成功发送店铺消息
  790. $param = [];
  791. $param['code'] = 'new_order';
  792. $param['store_id'] = $order_info['store_id'];
  793. $param['ali_param'] = [
  794. 'order_sn' => $order_info['order_sn'],
  795. ];
  796. $param['ten_param'] = [
  797. $order_info['order_sn'],
  798. ];
  799. $param['param'] = $param['ali_param'];
  800. $param['weixin_param'] = [
  801. 'url' => config('ds_config.h5_site_url') . '/seller/vrorder_detail?order_id=' . $order_info['order_id'],
  802. 'data' => [
  803. "keyword1" => [
  804. "value" => $order_info['order_sn'],
  805. "color" => "#333",
  806. ],
  807. "keyword2" => [
  808. "value" => $order_info['goods_name'],
  809. "color" => "#333",
  810. ],
  811. "keyword3" => [
  812. "value" => $order_info['order_amount'],
  813. "color" => "#333",
  814. ],
  815. "keyword4" => [
  816. "value" => date('Y-m-d H:i', $order_info['add_time']),
  817. "color" => "#333",
  818. ],
  819. ],
  820. ];
  821. \mall\queue\QueueClient::push('sendStoremsg', $param);
  822. if (!$insert) {
  823. throw new \think\Exception('兑换码发送失败', 10006);
  824. }
  825. }
  826. } else {
  827. //暂冻结预存款,后面还需要 API彻底完成支付
  828. $data_pd['amount'] = $available_rcb_amount;
  829. $predeposit_model->changeRcb('order_freeze', $data_pd);
  830. //预存款支付金额保存到订单
  831. $data_order = [];
  832. $order_info['rcb_amount'] = $data_order['rcb_amount'] = round($order_info['rcb_amount'] + $available_rcb_amount, 2);
  833. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  834. if (!$result) {
  835. throw new \think\Exception('订单更新失败', 10006);
  836. }
  837. }
  838. return $order_info;
  839. }
  840. /**
  841. * 预存款支付 主要处理
  842. * 如果预存款足够就单独支付了该订单,如果不足就暂时冻结,等API支付成功了再彻底扣除
  843. */
  844. public function pdPay($order_info, $input, $buyer_info)
  845. {
  846. if ($order_info['order_state'] == ORDER_STATE_PAY)
  847. return $order_info;
  848. $available_pd_amount = floatval($buyer_info['available_predeposit']);
  849. if ($available_pd_amount <= 0)
  850. return $order_info;
  851. $vrorder_model = model('vrorder');
  852. $predeposit_model = model('predeposit');
  853. $order_amount = round($order_info['order_amount'] - $order_info['rcb_amount'] - $order_info['pd_amount'], 2);
  854. $data_pd = [];
  855. $data_pd['member_id'] = $buyer_info['member_id'];
  856. $data_pd['member_name'] = $buyer_info['member_name'];
  857. $data_pd['amount'] = $order_amount;
  858. $data_pd['order_sn'] = $order_info['order_sn'];
  859. if ($available_pd_amount >= $order_amount) {
  860. //预存款立即支付,订单支付完成
  861. $predeposit_model->changePd('order_pay', $data_pd);
  862. $available_pd_amount -= $order_amount;
  863. //下单,支付被冻结的充值卡
  864. $pd_amount = floatval($order_info['rcb_amount']);
  865. if ($pd_amount > 0) {
  866. $data_pd = [];
  867. $data_pd['member_id'] = $buyer_info['member_id'];
  868. $data_pd['member_name'] = $buyer_info['member_name'];
  869. $data_pd['amount'] = $pd_amount;
  870. $data_pd['order_sn'] = $order_info['order_sn'];
  871. $predeposit_model->changeRcb('order_comb_pay', $data_pd);
  872. }
  873. //支付被冻结的预存款
  874. $pd_amount = isset($order_info['pd_amount']) ? floatval($order_info['pd_amount']) : 0;
  875. if ($pd_amount > 0) {
  876. $data_pd = [];
  877. $data_pd['member_id'] = $buyer_info['member_id'];
  878. $data_pd['member_name'] = $buyer_info['member_name'];
  879. $data_pd['amount'] = $pd_amount;
  880. $data_pd['order_sn'] = $order_info['order_sn'];
  881. $predeposit_model->changePd('order_comb_pay', $data_pd);
  882. }
  883. // 订单状态 置为已支付
  884. $data_order = [];
  885. $order_info['order_state'] = $data_order['order_state'] = 40;
  886. $order_info['payment_time'] = $data_order['payment_time'] = TIMESTAMP;
  887. $order_info['payment_code'] = $data_order['payment_code'] = 'predeposit';
  888. $order_info['pd_amount'] = $data_order['pd_amount'] = round($order_info['pd_amount'] + $order_amount, 2);
  889. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  890. if (!$result) {
  891. throw new \think\Exception('订单更新失败', 10006);
  892. }
  893. if ($order_info['order_promotion_type'] != 2) {
  894. //发放兑换码
  895. $vrorder_model->addVrorderCode($order_info);
  896. //发送兑换码到手机
  897. $param = ['order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'], 'buyer_phone' => $order_info['buyer_phone']];
  898. \mall\queue\QueueClient::push('sendVrCode', $param);
  899. // 支付成功发送店铺消息
  900. $param = [];
  901. $param['code'] = 'new_order';
  902. $param['store_id'] = $order_info['store_id'];
  903. $param['ali_param'] = [
  904. 'order_sn' => $order_info['order_sn'],
  905. ];
  906. $param['ten_param'] = [
  907. $order_info['order_sn'],
  908. ];
  909. $param['param'] = $param['ali_param'];
  910. $param['weixin_param'] = [
  911. 'url' => config('ds_config.h5_site_url') . '/seller/vrorder_detail?order_id=' . $order_info['order_id'],
  912. 'data' => [
  913. "keyword1" => [
  914. "value" => $order_info['order_sn'],
  915. "color" => "#333",
  916. ],
  917. "keyword2" => [
  918. "value" => $order_info['goods_name'],
  919. "color" => "#333",
  920. ],
  921. "keyword3" => [
  922. "value" => $order_info['order_amount'],
  923. "color" => "#333",
  924. ],
  925. "keyword4" => [
  926. "value" => date('Y-m-d H:i', $order_info['add_time']),
  927. "color" => "#333",
  928. ],
  929. ],
  930. ];
  931. \mall\queue\QueueClient::push('sendStoremsg', $param);
  932. }
  933. } else {
  934. //暂冻结预存款,后面还需要 API彻底完成支付
  935. $data_pd['amount'] = $available_pd_amount;
  936. $predeposit_model->changePd('order_freeze', $data_pd);
  937. //预存款支付金额保存到订单
  938. $data_order = [];
  939. $order_info['pd_amount'] = $data_order['pd_amount'] = round($order_info['pd_amount'] + $available_pd_amount, 2);
  940. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  941. if (!$result) {
  942. throw new \think\Exception('订单更新失败', 10006);
  943. }
  944. }
  945. return $order_info;
  946. }
  947. /**
  948. * 积分支付
  949. */
  950. public function pointPay($order_info, $input, $buyer_info)
  951. {
  952. $point_ratio = config('app.point_ratio');
  953. $point_amount = floatval($buyer_info['point'] / $point_ratio);
  954. if ($point_amount <= 0)
  955. return $order_info;
  956. $vrorder_model = model('vrorder');
  957. $predeposit_model = model('predeposit');
  958. $order_amount = round($order_info['order_amount'] - $order_info['rcb_amount'] - $order_info['pd_amount'], 2);
  959. $data_point = [];
  960. $data_point['member_id'] = $buyer_info['member_id'];
  961. $data_point['union_id'] = $buyer_info['member_wxunionid'];
  962. $data_point['member_name'] = $buyer_info['member_name'];
  963. $data_point['amount'] = $order_amount;
  964. $data_point['order_sn'] = $order_info['order_sn'];
  965. if ($point_amount >= $order_amount) {
  966. //积分立即支付,订单支付完成
  967. $predeposit_model->changePoint('order_pay', $data_point);
  968. // 订单状态 置为已支付
  969. $data_order = [];
  970. $order_info['order_state'] = $data_order['order_state'] = 40;
  971. $data_order['payment_time'] = TIMESTAMP;
  972. $data_order['payment_code'] = 'predeposit';
  973. $data_order['point_amount'] = round($order_info['point_amount'] + ($order_amount * $point_ratio), 2);
  974. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  975. if (!$result) {
  976. throw new \think\Exception('订单更新失败', 10006);
  977. }
  978. if ($order_info['order_promotion_type'] != 2) {
  979. //发放兑换码
  980. $insert = $vrorder_model->addVrorderCode($order_info);
  981. //发送兑换码到手机
  982. $param = ['order_id' => $order_info['order_id'], 'buyer_id' => $order_info['buyer_id'], 'buyer_phone' => $order_info['buyer_phone']];
  983. \mall\queue\QueueClient::push('sendVrCode', $param);
  984. // 支付成功发送店铺消息
  985. $param = [];
  986. $param['code'] = 'new_order';
  987. $param['store_id'] = $order_info['store_id'];
  988. $param['ali_param'] = [
  989. 'order_sn' => $order_info['order_sn'],
  990. ];
  991. $param['ten_param'] = [
  992. $order_info['order_sn'],
  993. ];
  994. $param['param'] = $param['ali_param'];
  995. $param['weixin_param'] = [
  996. 'url' => config('ds_config.h5_site_url') . '/seller/vrorder_detail?order_id=' . $order_info['order_id'],
  997. 'data' => [
  998. "keyword1" => [
  999. "value" => $order_info['order_sn'],
  1000. "color" => "#333",
  1001. ],
  1002. "keyword2" => [
  1003. "value" => $order_info['goods_name'],
  1004. "color" => "#333",
  1005. ],
  1006. "keyword3" => [
  1007. "value" => $order_info['order_amount'],
  1008. "color" => "#333",
  1009. ],
  1010. "keyword4" => [
  1011. "value" => date('Y-m-d H:i', $order_info['add_time']),
  1012. "color" => "#333",
  1013. ],
  1014. ],
  1015. ];
  1016. \mall\queue\QueueClient::push('sendStoremsg', $param);
  1017. if (!$insert) {
  1018. throw new \think\Exception('兑换码发送失败', 10006);
  1019. }
  1020. }
  1021. } else {
  1022. //暂冻结预存款,后面还需要 API彻底完成支付
  1023. $data_point['amount'] = $point_amount;
  1024. $predeposit_model->changeRcb('order_freeze', $data_point);
  1025. //预存款支付金额保存到订单
  1026. $data_order = [];
  1027. $order_info['point_amount'] = $data_order['point_amount'] = $order_info['point_amount'] + $point_amount * $point_ratio;
  1028. $result = $vrorder_model->editVrorder($data_order, ['order_id' => $order_info['order_id']]);
  1029. if (!$result) {
  1030. throw new \think\Exception('订单更新失败', 10006);
  1031. }
  1032. }
  1033. return $order_info;
  1034. }
  1035. /**
  1036. * 取得抢购信息
  1037. * @param array $goods_info
  1038. * @return array
  1039. */
  1040. private function _getGroupbuyInfo($goods_info = [])
  1041. {
  1042. if (!config('ds_config.groupbuy_allow') || empty($goods_info) || !is_array($goods_info))
  1043. return $goods_info;
  1044. $groupbuy_info = model('groupbuy')->getGroupbuyInfoByGoodsCommonID($goods_info['goods_commonid']);
  1045. if (empty($groupbuy_info))
  1046. return $goods_info;
  1047. // 虚拟抢购数量限制
  1048. if ($groupbuy_info['groupbuy_upper_limit'] > 0 && $groupbuy_info['groupbuy_upper_limit'] < $goods_info['virtual_limit']) {
  1049. $goods_info['virtual_limit'] = $groupbuy_info['groupbuy_upper_limit'];
  1050. }
  1051. $goods_info['goods_price'] = $groupbuy_info['groupbuy_price'];
  1052. $goods_info['groupbuy_id'] = $groupbuy_info['groupbuy_id'];
  1053. $goods_info['ifgroupbuy'] = true;
  1054. return $goods_info;
  1055. }
  1056. }