vr_order.logic.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. /**
  3. * 虚拟订单行为
  4. *
  5. */
  6. defined('InShopNC') or exit('Access Invalid!');
  7. require_once(BASE_HELPER_PATH . '/vrorder_helper.php');
  8. class vr_orderLogic
  9. {
  10. private static function part_calcer($add_time)
  11. {
  12. $namer = function ($time) {
  13. return 'p' . date('Ym', $time);
  14. };
  15. if (defined('DB_PARTIONED') && DB_PARTIONED) {
  16. if (is_string($add_time)) {
  17. $add_time = intval($add_time);
  18. }
  19. if ($add_time == 0) {
  20. return '';
  21. } else {
  22. return $namer($add_time);
  23. }
  24. } else {
  25. return '';
  26. }
  27. }
  28. /**
  29. * 取消订单
  30. * @param array $order_info
  31. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  32. * @param string $msg 操作备注
  33. * @param boolean $if_queue 是否使用队列
  34. * @return array
  35. */
  36. public function changeOrderStateCancel($order_info, $role, $msg, $if_queue = true,$fRefill = false)
  37. {
  38. try
  39. {
  40. $add_time = $order_info['add_time'];
  41. $model_vr_order = Model('vr_order');
  42. $trans = new trans_wapper($model_vr_order, __METHOD__);
  43. if(!$fRefill)
  44. {
  45. //库存、销量变更
  46. if ($if_queue) {
  47. QueueClient::push('cancelOrderUpdateStorage', [$order_info['goods_id'] => $order_info['goods_num']]);
  48. } else {
  49. Logic('queue')->cancelOrderUpdateStorage([$order_info['goods_id'] => $order_info['goods_num']]);
  50. }
  51. }
  52. $model_pd = Model('predeposit');
  53. //解冻充值卡
  54. $pd_amount = floatval($order_info['rcb_amount']);
  55. if ($pd_amount > 0) {
  56. $data_pd = [];
  57. $data_pd['member_id'] = $order_info['buyer_id'];
  58. $data_pd['member_name'] = $order_info['buyer_name'];
  59. $data_pd['amount'] = $pd_amount;
  60. $data_pd['order_sn'] = $order_info['order_sn'];
  61. $model_pd->changeRcb('order_cancel', $data_pd);
  62. }
  63. //解冻预存款
  64. $pd_amount = floatval($order_info['pd_amount']);
  65. if ($pd_amount > 0) {
  66. $data_pd = [];
  67. $data_pd['member_id'] = $order_info['buyer_id'];
  68. $data_pd['member_name'] = $order_info['buyer_name'];
  69. $data_pd['amount'] = $pd_amount;
  70. $data_pd['order_sn'] = $order_info['order_sn'];
  71. $model_pd->changePd('order_cancel', $data_pd,$fRefill);
  72. }
  73. //更新订单信息
  74. $update_order = [
  75. 'order_state' => ORDER_STATE_CANCEL,
  76. 'pd_amount' => 0,
  77. 'close_time' => time(),
  78. 'close_reason' => $msg
  79. ];
  80. $update = $model_vr_order->partition(self::part_calcer($add_time))->editOrder($update_order, ['order_id' => $order_info['order_id']]);
  81. if (!$update) {
  82. throw new Exception('保存失败');
  83. } elseif(!$fRefill) {
  84. QueueClient::push('OnVrOrderCancel', ['order_sn' => $order_info['order_sn']]);
  85. } else {
  86. }
  87. $trans->commit();
  88. return callback(true, '更新成功');
  89. } catch (Exception $e) {
  90. $trans->rollback();
  91. return callback(false, $e->getMessage());
  92. }
  93. }
  94. /**
  95. * 支付订单
  96. * @param array $order_info
  97. * @param string $role 操作角色 buyer、seller、admin、system 分别代表买家、商家、管理员、系统
  98. * @param string $post
  99. * @return array
  100. */
  101. public function changeOrderStatePay($order_info, $role, $post)
  102. {
  103. try
  104. {
  105. $add_time = $order_info['add_time'];
  106. $model_vr_order = Model('vr_order');
  107. $trans = new trans_wapper($model_vr_order, __METHOD__);
  108. $model_pd = Model('predeposit');
  109. //下单,支付被冻结的充值卡
  110. $rcb_amount = floatval($order_info['rcb_amount']);
  111. if ($rcb_amount > 0) {
  112. $data_pd = [];
  113. $data_pd['member_id'] = $order_info['buyer_id'];
  114. $data_pd['member_name'] = $order_info['buyer_name'];
  115. $data_pd['amount'] = $rcb_amount;
  116. $data_pd['order_sn'] = $order_info['order_sn'];
  117. $model_pd->changeRcb('order_comb_pay', $data_pd);
  118. }
  119. //下单,支付被冻结的预存款
  120. $pd_amount = floatval($order_info['pd_amount']);
  121. if ($pd_amount > 0) {
  122. $data_pd = [];
  123. $data_pd['member_id'] = $order_info['buyer_id'];
  124. $data_pd['member_name'] = $order_info['buyer_name'];
  125. $data_pd['amount'] = $pd_amount;
  126. $data_pd['order_sn'] = $order_info['order_sn'];
  127. $isRefill = $model_pd->isRefill($data_pd['member_id']);
  128. $model_pd->changePd('order_comb_pay', $data_pd,$isRefill);
  129. }
  130. //更新订单状态
  131. $update_order = [];
  132. $update_order['order_state'] = ORDER_STATE_PAY;
  133. $update_order['payment_time'] = $post['payment_time'] ? strtotime($post['payment_time']) : time();
  134. $update_order['payment_code'] = $post['payment_code'];
  135. $update_order['trade_no'] = $post['trade_no'];
  136. $update = $model_vr_order->partition(self::part_calcer($add_time))->editOrder($update_order, ['order_id' => $order_info['order_id']]);
  137. if (!$update) {
  138. throw new Exception(L('nc_common_save_fail'));
  139. }
  140. //发放兑换码
  141. $insert = $model_vr_order->addOrderCode($order_info);
  142. if (!$insert) {
  143. throw new Exception('兑换码发送失败');
  144. }
  145. // 支付成功发送买家消息
  146. $param = [];
  147. $param['code'] = 'order_payment_success';
  148. $param['member_id'] = $order_info['buyer_id'];
  149. $param['param'] = [
  150. 'order_sn' => $order_info['order_sn'],
  151. 'order_url' => urlShop('member_vr_order', 'show_order', ['order_id' => $order_info['order_id']])
  152. ];
  153. QueueClient::push('sendMemberMsg', $param);
  154. // 支付成功发送店铺消息
  155. $param = [];
  156. $param['code'] = 'new_order';
  157. $param['store_id'] = $order_info['store_id'];
  158. $param['param'] = ['order_sn' => $order_info['order_sn']];
  159. QueueClient::push('sendStoreMsg', $param);
  160. $trans->commit();
  161. return callback(true, '更新成功');
  162. } catch (Exception $e) {
  163. $trans->rollback();
  164. return callback(false, $e->getMessage());
  165. }
  166. }
  167. public function changeOrderStateSend($order_id,$fRefill = false,$part = [])
  168. {
  169. $model_vr_order = Model('vr_order');
  170. if($fRefill)
  171. {
  172. $update = $model_vr_order->partition($part)->editOrder(['order_state' => ORDER_STATE_SEND], ['order_id' => $order_id]);
  173. if (!$update) {
  174. return callback(false, '更新失败');
  175. }
  176. }
  177. else
  178. {
  179. $condition = [];
  180. $condition['vr_state'] = 0;
  181. $condition['refund_lock'] = ['in', [0, 1]];
  182. $condition['order_id'] = $order_id;
  183. $condition['vr_indate'] = ['gt', time()];
  184. $order_code_info = $model_vr_order->partition($part)->getOrderCodeInfo($condition, '*', true);
  185. if (!empty($order_code_info)) {
  186. $update = $model_vr_order->editOrder(['order_state' => ORDER_STATE_SEND], ['order_id' => $order_id]);
  187. if (!$update) {
  188. callback(false, '更新失败');
  189. }
  190. }
  191. }
  192. return callback(true, '更新成功');
  193. }
  194. /**
  195. * 完成订单
  196. * @param int $order_id
  197. * @return array
  198. */
  199. public function changeOrderStateSuccess($order_id,$fRefill = false)
  200. {
  201. $model_vr_order = Model('vr_order');
  202. if($fRefill)
  203. {
  204. $update = $model_vr_order->editOrder(['order_state' => ORDER_STATE_SUCCESS, 'finnshed_time' => time()], ['order_id' => $order_id]);
  205. if (!$update) {
  206. return callback(false, '更新失败');
  207. }
  208. }
  209. else
  210. {
  211. $condition = [];
  212. $condition['vr_state'] = 0;
  213. $condition['refund_lock'] = ['in', [0, 1]];
  214. $condition['order_id'] = $order_id;
  215. $condition['vr_indate'] = ['gt', time()];
  216. $order_code_info = $model_vr_order->getOrderCodeInfo($condition, '*', true);
  217. if (!empty($order_code_info)) {
  218. $update = $model_vr_order->editOrder(['order_state' => ORDER_STATE_SUCCESS, 'finnshed_time' => time()], ['order_id' => $order_id]);
  219. if (!$update) {
  220. callback(false, '更新失败');
  221. }
  222. }
  223. $order_info = $model_vr_order->getOrderInfo(['order_id' => $order_id]);
  224. QueueClient::push('OnVrOrderComplete',['order_sn' => $order_info['order_sn']]);
  225. //添加会员积分
  226. if (C('points_isuse') == 1) {
  227. Model('points')->savePointsLog('order',
  228. ['pl_memberid' => $order_info['buyer_id'],
  229. 'pl_membername' => $order_info['buyer_name'],
  230. 'orderprice' => $order_info['order_amount'],
  231. 'order_sn' => $order_info['order_sn'],
  232. 'order_id' => $order_info['order_id']], true);
  233. }
  234. //添加会员经验值
  235. Model('exppoints')->saveExppointsLog('order',
  236. ['exp_memberid' => $order_info['buyer_id'],
  237. 'exp_membername' => $order_info['buyer_name'],
  238. 'orderprice' => $order_info['order_amount'],
  239. 'order_sn' => $order_info['order_sn'],
  240. 'order_id' => $order_info['order_id']]);
  241. }
  242. return callback(true, '更新成功');
  243. }
  244. }