PageRenderTime 81ms CodeModel.GetById 52ms RepoModel.GetById 2ms app.codeStats 0ms

/includes/order.base.php

https://github.com/wallage/ecmall
PHP | 405 lines | 230 code | 45 blank | 130 comment | 20 complexity | 613557d989f5fb7d6691f4c22e74d383 MD5 | raw file
  1. <?php
  2. !defined('ROOT_PATH') && exit('Forbidden');
  3. /**
  4. * 订单类型基类
  5. *
  6. * @author Garbin
  7. * @usage none
  8. */
  9. class BaseOrder extends Object
  10. {
  11. function __construct($params)
  12. {
  13. $this->BaseOrder($params);
  14. }
  15. function BaseOrder($params)
  16. {
  17. if (!empty($params))
  18. {
  19. foreach ($params as $key => $value)
  20. {
  21. $this->$key = $value;
  22. }
  23. }
  24. }
  25. /**
  26. * 获取订单类型名称
  27. *
  28. * @author Garbin
  29. * @return string
  30. */
  31. function get_name()
  32. {
  33. return $this->_name;
  34. }
  35. /**
  36. * 获取订单详情
  37. *
  38. * @author Garbin
  39. * @param int $order_id
  40. * @param array $order_info
  41. * @return array
  42. */
  43. function get_order_detail($order_id, $order_info)
  44. {
  45. if (!$order_id)
  46. {
  47. return array();
  48. }
  49. /* 订单基本信息 */
  50. $data['order_info'] = $order_info;
  51. return array('data' => $data, 'template' => 'normalorder.view.html');
  52. }
  53. /**
  54. * 获取该商品类型在购物流程中的表单模板及数据
  55. *
  56. * @author Garbin
  57. * @return array
  58. */
  59. function get_order_form()
  60. {
  61. return array();
  62. }
  63. /**
  64. * 处理表单提交上来后的数据,并插入订单表
  65. *
  66. * @author Garbin
  67. * @param array $data
  68. * @return int
  69. */
  70. function submit_order($data)
  71. {
  72. return 0;
  73. }
  74. /**
  75. * 响应支付通知
  76. *
  77. * @author Garbin
  78. * @param int $order_id
  79. * @param array $notify_result
  80. * @return bool
  81. */
  82. function respond_notify($order_id, $notify_result)
  83. {
  84. $model_order =& m('order');
  85. $where = "order_id = {$order_id}";
  86. $data = array('status' => $notify_result['target']);
  87. switch ($notify_result['target'])
  88. {
  89. case ORDER_ACCEPTED:
  90. $where .= ' AND status=' . ORDER_PENDING; //只有待付款的订单才会被修改为已付款
  91. $data['pay_time'] = gmtime();
  92. break;
  93. case ORDER_SHIPPED:
  94. $where .= ' AND status=' . ORDER_ACCEPTED; //只有等待发货的订单才会被修改为已发货
  95. $data['ship_time'] = gmtime();
  96. break;
  97. case ORDER_FINISHED:
  98. $where .= ' AND status=' . ORDER_SHIPPED; //只有已发货的订单才会被自动修改为交易完成
  99. $data['finished_time'] = gmtime();
  100. break;
  101. case ORDER_CANCLED: //任何情况下都可以关闭
  102. /* 加回商品库存 */
  103. $model_order->change_stock('+', $order_id);
  104. break;
  105. }
  106. return $model_order->edit($where, $data);
  107. }
  108. /**
  109. * 获取收货人信息
  110. *
  111. * @author Garbin
  112. * @param int $user_id
  113. * @return array
  114. */
  115. function _get_my_address($user_id)
  116. {
  117. if (!$user_id)
  118. {
  119. return array();
  120. }
  121. $address_model =& m('address');
  122. return $address_model->find('user_id=' . $user_id);
  123. }
  124. /**
  125. * 获取配送方式
  126. *
  127. * @author Garbin
  128. * @param int $store_id
  129. * @return array
  130. */
  131. function _get_shipping_methods($store_id)
  132. {
  133. if (!$store_id)
  134. {
  135. return array();
  136. }
  137. $shipping_model =& m('shipping');
  138. return $shipping_model->find('enabled=1 AND store_id=' . $store_id);
  139. }
  140. /**
  141. * 获取支付方式
  142. *
  143. * @author Garbin
  144. * @param int $store_id
  145. * @return array
  146. */
  147. function _get_payments($store_id)
  148. {
  149. if (!$store_id)
  150. {
  151. return array();
  152. }
  153. $payment_model =& m('payment');
  154. return $payment_model->get_enabled($store_id);
  155. }
  156. /**
  157. * 生成订单号
  158. *
  159. * @author Garbin
  160. * @return string
  161. */
  162. function _gen_order_sn()
  163. {
  164. /* 选择一个随机的方案 */
  165. mt_srand((double) microtime() * 1000000);
  166. $timestamp = gmtime();
  167. $y = date('y', $timestamp);
  168. $z = date('z', $timestamp);
  169. $order_sn = $y . str_pad($z, 3, '0', STR_PAD_LEFT) . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
  170. $model_order =& m('order');
  171. $orders = $model_order->find('order_sn=' . $order_sn);
  172. if (empty($orders))
  173. {
  174. /* 否则就使用这个订单号 */
  175. return $order_sn;
  176. }
  177. /* 如果有重复的,则重新生成 */
  178. return $this->_gen_order_sn();
  179. }
  180. /**
  181. * 验证收货人信息是否合法
  182. *
  183. * @author Garbin
  184. * @param array $consignee
  185. * @return void
  186. */
  187. function _valid_consignee_info($consignee)
  188. {
  189. if (!$consignee['consignee'])
  190. {
  191. $this->_error('consignee_empty');
  192. return false;
  193. }
  194. if (!$consignee['region_id'])
  195. {
  196. $this->_error('region_empty');
  197. return false;
  198. }
  199. if (!$consignee['address'])
  200. {
  201. $this->_error('address_empty');
  202. return false;
  203. }
  204. if (!$consignee['phone_tel'] && !$consignee['phone_mob'])
  205. {
  206. $this->_error('phone_required');
  207. return false;
  208. }
  209. if (!$consignee['shipping_id'])
  210. {
  211. $this->_error('shipping_required');
  212. return false;
  213. }
  214. return $consignee;
  215. }
  216. /**
  217. * 获取商品列表
  218. *
  219. * @author Garbin
  220. * @param int $order_id
  221. * @return array
  222. */
  223. function _get_goods_list($order_id)
  224. {
  225. if (!$order_id)
  226. {
  227. return array();
  228. }
  229. $ordergoods_model =& m('ordergoods');
  230. return $ordergoods_model->find("order_id={$order_id}");
  231. }
  232. /**
  233. * 获取扩展信息
  234. *
  235. * @author Garbin
  236. * @param int $order_id
  237. * @return array
  238. */
  239. function _get_order_extm($order_id)
  240. {
  241. if (!$order_id)
  242. {
  243. return array();
  244. }
  245. $orderextm_model =& m('orderextm');
  246. return $orderextm_model->get($order_id);
  247. }
  248. /**
  249. * 获取订单操作日志
  250. *
  251. * @author Garbin
  252. * @param int $order_id
  253. * @return array
  254. */
  255. function _get_order_logs($order_id)
  256. {
  257. if (!$order_id)
  258. {
  259. return array();
  260. }
  261. $model_orderlog =& m('orderlog');
  262. return $model_orderlog->find("order_id = {$order_id}");
  263. }
  264. /**
  265. * 处理订单基本信息,返回有效的订单信息数组
  266. *
  267. * @author Garbin
  268. * @param array $goods_info
  269. * @param array $post
  270. * @return array
  271. */
  272. function _handle_order_info($goods_info, $post)
  273. {
  274. /* 默认都是待付款 */
  275. $order_status = ORDER_PENDING;
  276. /* 买家信息 */
  277. $visitor =& env('visitor');
  278. $user_id = $visitor->get('user_id');
  279. $user_name = $visitor->get('user_name');
  280. /* 返回基本信息 */
  281. return array(
  282. 'order_sn' => $this->_gen_order_sn(),
  283. 'type' => $goods_info['type'],
  284. 'extension' => $this->_name,
  285. 'seller_id' => $goods_info['store_id'],
  286. 'seller_name' => addslashes($goods_info['store_name']),
  287. 'buyer_id' => $user_id,
  288. 'buyer_name' => addslashes($user_name),
  289. 'buyer_email' => $visitor->get('email'),
  290. 'status' => $order_status,
  291. 'add_time' => gmtime(),
  292. 'goods_amount' => $goods_info['amount'],
  293. 'discount' => isset($goods_info['discount']) ? $goods_info['discount'] : 0,
  294. 'anonymous' => intval($post['anonymous']),
  295. 'postscript' => trim($post['postscript']),
  296. );
  297. }
  298. /**
  299. * 处理收货人信息,返回有效的收货人信息
  300. *
  301. * @author Garbin
  302. * @param array $goods_info
  303. * @param array $post
  304. * @return array
  305. */
  306. function _handle_consignee_info($goods_info, $post)
  307. {
  308. /* 验证收货人信息填写是否完整 */
  309. $consignee_info = $this->_valid_consignee_info($post);
  310. if (!$consignee_info)
  311. {
  312. return false;
  313. }
  314. /* 计算配送费用 */
  315. $shipping_model =& m('shipping');
  316. $shipping_info = $shipping_model->get("shipping_id={$consignee_info['shipping_id']} AND store_id={$goods_info['store_id']} AND enabled=1");
  317. if (empty($shipping_info))
  318. {
  319. $this->_error('no_such_shipping');
  320. return false;
  321. }
  322. /* 配送费用=首件费用+超出的件数*续件费用 */
  323. $shipping_fee = $shipping_info['first_price'] + ($goods_info['quantity'] - 1) * $shipping_info['step_price'];
  324. return array(
  325. 'consignee' => $consignee_info['consignee'],
  326. 'region_id' => $consignee_info['region_id'],
  327. 'region_name' => $consignee_info['region_name'],
  328. 'address' => $consignee_info['address'],
  329. 'zipcode' => $consignee_info['zipcode'],
  330. 'phone_tel' => $consignee_info['phone_tel'],
  331. 'phone_mob' => $consignee_info['phone_mob'],
  332. 'shipping_id' => $consignee_info['shipping_id'],
  333. 'shipping_name' => addslashes($shipping_info['shipping_name']),
  334. 'shipping_fee' => $shipping_fee,
  335. );
  336. }
  337. /**
  338. * 获取一级地区
  339. *
  340. * @author Garbin
  341. * @param none
  342. * @return void
  343. */
  344. function _get_regions()
  345. {
  346. $model_region =& m('region');
  347. $regions = $model_region->get_list(0);
  348. if ($regions)
  349. {
  350. $tmp = array();
  351. foreach ($regions as $key => $value)
  352. {
  353. $tmp[$key] = $value['region_name'];
  354. }
  355. $regions = $tmp;
  356. }
  357. return $regions;
  358. }
  359. }
  360. ?>