member_order.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <?php
  2. /**
  3. * 我的订单
  4. *
  5. *
  6. *
  7. *
  8. */
  9. //use Shopnc\Tpl;
  10. defined('InShopNC') or exit('Access Invalid!');
  11. class member_orderControl extends mbMemberControl
  12. {
  13. public function __construct()
  14. {
  15. parent::__construct();
  16. }
  17. /**
  18. * 订单列表
  19. */
  20. public function order_listOp()
  21. {
  22. $token = trim($_GET['key']);
  23. if (false == $this->checkToken($token)) {
  24. return joutput_error($this->err_code);
  25. }
  26. $model_order = Model('order');
  27. $condition = array();
  28. $condition['buyer_id'] = $this->member_info['member_id'];
  29. $order_list_array = $model_order->getNormalOrderList($condition, 30, '*', 'order_id desc', '', array('order_address', 'order_goods'));
  30. $order_group_list = array();
  31. $order_pay_sn_array = array();
  32. foreach ($order_list_array as $value) {
  33. //显示取消订单
  34. $value['if_cancel'] = $model_order->getOrderOperateState('buyer_cancel', $value);
  35. //显示收货
  36. $value['if_receive'] = $model_order->getOrderOperateState('receive', $value);
  37. //显示锁定中
  38. $value['if_lock'] = $model_order->getOrderOperateState('lock', $value);
  39. //显示物流跟踪
  40. $value['if_deliver'] = $model_order->getOrderOperateState('deliver', $value);
  41. //商品图
  42. foreach ($value['extend_order_goods'] as $k => $goods_info) {
  43. $value['extend_order_goods'][$k]['goods_image_url'] = cthumb($goods_info['goods_image'], 240, $value['store_id']);
  44. }
  45. $order_group_list[$value['pay_sn']]['order_list'][] = $value;
  46. //如果有在线支付且未付款的订单则显示合并付款链接
  47. if ($value['order_state'] == ORDER_STATE_NEW) {
  48. $order_group_list[$value['pay_sn']]['pay_amount'] += $value['order_amount'] - $value['rcb_amount'] - $value['pd_amount'];
  49. }
  50. $order_group_list[$value['pay_sn']]['add_time'] = $value['add_time'];
  51. //记录一下pay_sn,后面需要查询支付单表
  52. $order_pay_sn_array[] = $value['pay_sn'];
  53. }
  54. $new_order_group_list = array();
  55. foreach ($order_group_list as $key => $value) {
  56. $value['pay_sn'] = strval($key);
  57. $new_order_group_list[] = $value;
  58. }
  59. $page_count = $model_order->gettotalpage();
  60. $array_data = array('order_group_list' => $new_order_group_list);
  61. if (isset($_GET['getpayment']) && $_GET['getpayment'] == "true") {
  62. $model_mb_payment = Model('mb_payment');
  63. $payment_list = $model_mb_payment->getMbPaymentOpenList();
  64. $payment_array = array();
  65. if (!empty($payment_list)) {
  66. foreach ($payment_list as $value) {
  67. $payment_array[] = array('payment_code' => $value['payment_code'], 'payment_name' => $value['payment_name']);
  68. }
  69. }
  70. $array_data['payment_list'] = $payment_array;
  71. }
  72. joutput_data($array_data, mobile_page($page_count));
  73. }
  74. /**
  75. * 订单信息
  76. */
  77. public function order_infoOp()
  78. {
  79. $token = trim($_GET['key']);
  80. if (false == $this->checkToken($token)) {
  81. return joutput_error($this->err_code);
  82. }
  83. $model_order = Model('order');
  84. $condition = array();
  85. $condition['buyer_id'] = $this->member_info['member_id'];
  86. $condition['pay_sn'] = $_POST['pay_sn'];
  87. $order_list_array = $model_order->getNormalOrderList($condition, $this->page, '*', 'order_id desc', '', array('order_address', 'order_goods'));
  88. $array_data = array();
  89. foreach ($order_list_array as $value) {
  90. //显示取消订单
  91. $value['if_cancel'] = $model_order->getOrderOperateState('buyer_cancel', $value);
  92. //显示收货
  93. $value['if_receive'] = $model_order->getOrderOperateState('receive', $value);
  94. //显示锁定中
  95. $value['if_lock'] = $model_order->getOrderOperateState('lock', $value);
  96. //显示物流跟踪
  97. $value['if_deliver'] = $model_order->getOrderOperateState('deliver', $value);
  98. foreach ($value['extend_order_goods'] as $k => $goods_info) {
  99. $value['extend_order_goods'][$k]['goods_image_url'] = cthumb($goods_info['goods_image'], 240, $value['store_id']);
  100. }
  101. $array_data[] = $value;
  102. }
  103. joutput_data(array("order_list" => $array_data));
  104. }
  105. /**
  106. * 取消订单
  107. */
  108. public function order_cancelOp()
  109. {
  110. $token = trim($_GET['key']);
  111. if (false == $this->checkToken($token)) {
  112. return joutput_error($this->err_code);
  113. }
  114. $condition = array();
  115. if (!empty($_POST['order_id'])) {
  116. $order_id = intval($_POST['order_id']);
  117. $condition['order_id'] = $order_id;
  118. } else if (!empty($_POST['order_sn'])) {
  119. $condition['order_sn'] = trim($_POST['order_sn']);
  120. } else {
  121. return joutput_error(errcode::ErrParamter, "请传入order_sn.");
  122. }
  123. $model_order = Model('order');
  124. $logic_order = Logic('order');
  125. $condition['buyer_id'] = $this->member_info['member_id'];
  126. Log::record("buyer_id = {$condition['buyer_id']}", Log::DEBUG);
  127. $order_info = $model_order->getOrderInfo($condition);
  128. // $if_allow = $model_order->getOrderOperateState('buyer_cancel', $order_info);
  129. // if (!$if_allow) {
  130. // return joutput_error(errcode::ErrOrder, '无权操作');
  131. // }
  132. if ($order_info['order_state'] != ORDER_STATE_NEW) {
  133. Log::record("order_state = {$order_info['order_state']}.", Log::ERR);
  134. return joutput_error(errcode::ErrOrder, "已支付和已发货订单不能取消.");
  135. }
  136. $result = $logic_order->changeOrderStateCancel($order_info, 'buyer', $this->member_info['member_name'], '其它原因');
  137. if (!$result['state']) {
  138. return joutput_error(errcode::ErrOrder, $result['msg']);
  139. } else {
  140. joutput_data(array('result' => '1'));
  141. }
  142. }
  143. /**
  144. * 订单确认收货
  145. */
  146. public function order_receiveOp()
  147. {
  148. $token = trim($_GET['key']);
  149. if (false == $this->checkToken($token)) {
  150. return joutput_error($this->err_code);
  151. }
  152. $model_order = Model('order');
  153. $logic_order = Logic('order');
  154. $order_id = intval($_POST['order_id']);
  155. $condition = array();
  156. $condition['order_id'] = $order_id;
  157. $condition['buyer_id'] = $this->member_info['member_id'];
  158. $order_info = $model_order->getOrderInfo($condition);
  159. $if_allow = $model_order->getOrderOperateState('receive', $order_info);
  160. if (!$if_allow) {
  161. return joutput_error(errcode::ErrOrder, '无权操作');
  162. }
  163. $result = $logic_order->changeOrderStateReceive($order_info, 'buyer', $this->member_info['member_name']);
  164. if (!$result['state']) {
  165. return joutput_error(errcode::ErrOrder, $result['msg']);
  166. } else {
  167. joutput_data(array('result' => '1'));
  168. }
  169. }
  170. /**
  171. * 物流跟踪
  172. */
  173. public function search_deliverOp()
  174. {
  175. $token = trim($_GET['key']);
  176. if (false == $this->checkToken($token)) {
  177. return joutput_error($this->err_code);
  178. }
  179. $order_id = intval($_POST['order_id']);
  180. if ($order_id <= 0) {
  181. return joutput_error(errcode::ErrOrder, '订单不存在');
  182. }
  183. $model_order = Model('order');
  184. $condition['order_id'] = $order_id;
  185. $condition['buyer_id'] = $this->member_info['member_id'];
  186. $order_info = $model_order->getOrderInfo($condition, array('order_common', 'order_goods'));
  187. if (empty($order_info) || !in_array($order_info['order_state'], array(ORDER_STATE_SEND, ORDER_STATE_SUCCESS))) {
  188. return joutput_error(errcode::ErrOrder, '订单不存在');
  189. }
  190. $express = rkcache('express', true);
  191. $e_code = $express[$order_info['extend_order_common']['shipping_express_id']]['e_kdn_code'];
  192. $e_name = $express[$order_info['extend_order_common']['shipping_express_id']]['e_name'];
  193. $key = "express_" . $order_info['shipping_code'];
  194. $deliver_info = rkcache($key);
  195. if(empty($deliver_info))
  196. {
  197. //$deliver_info = $this->getOrderTracesByJson('STO', '3304699247030');
  198. $deliver_info = $this->_get_express($e_code, $order_info['shipping_code']);
  199. if ($deliver_info === false) {
  200. return;
  201. }
  202. wkcache($key,$deliver_info,3600);
  203. }
  204. $deliver_info = json_decode($deliver_info, true);
  205. $routes = $deliver_info['Traces'];
  206. krsort($routes);
  207. switch ($deliver_info['State']) {
  208. case '1':
  209. break;
  210. case '2':
  211. $msg = '在途中';
  212. break;
  213. case '3':
  214. $msg = '已签收';
  215. break;
  216. case '4':
  217. $msg = '问题件';
  218. break;
  219. }
  220. Tpl::output('msg_statu', $msg);
  221. Tpl::output('LogisticCode', $deliver_info['LogisticCode']);
  222. Tpl::output('routes', $routes);
  223. Tpl::showpage('express_info');
  224. }
  225. /**
  226. * 从第三方取快递信息
  227. *
  228. */
  229. public function _get_express($e_code, $shipping_code)
  230. {
  231. $url = 'http://www.kuaidi100.com/query?type=' . $e_code . '&postid=' . $shipping_code . '&id=1&valicode=&temp=' . random(4) . '&sessionid=&tmp=' . random(4);
  232. import('function.ftp');
  233. $content = dfsockopen($url);
  234. $content = json_decode($content, true);
  235. if ($content['status'] != 200) {
  236. joutput_error(errcode::ErrOrder, '物流信息查询失败');
  237. return false;
  238. }
  239. $content['data'] = array_reverse($content['data']);
  240. $output = array();
  241. if (is_array($content['data'])) {
  242. foreach ($content['data'] as $k => $v) {
  243. if ($v['time'] == '') continue;
  244. $output[] = $v['time'] . '&nbsp;&nbsp;' . $v['context'];
  245. }
  246. }
  247. if (empty($output)) exit(json_encode(false));
  248. if (strtoupper(CHARSET) == 'GBK') {
  249. $output = Language::getUTF8($output);//网站GBK使用编码时,转换为UTF-8,防止json输出汉字问题
  250. }
  251. return $output;
  252. }
  253. /**
  254. * 获取不同状态下订单数量
  255. */
  256. public function orderCountStateOp()
  257. {
  258. $token = trim($_GET['key']);
  259. if (false == $this->checkToken($token)) {
  260. return joutput_error($this->err_code);
  261. }
  262. $condition = array();
  263. $condition['buyer_id'] = $this->member_info['member_id'];
  264. $result = Model()->table('order')->field('order_state, count(*) as count')->where($condition)->group('order_state')->select();
  265. joutput_data(array('order_count' => $result));
  266. }
  267. /**
  268. * 快递鸟接口方式
  269. * Json方式 查询订单物流轨迹
  270. */
  271. public function getOrderTracesByJson($shipperCode, $logisticCode)
  272. {
  273. $requestData = "{\"OrderCode\":\"\",\"ShipperCode\":\"" . $shipperCode . "\",\"LogisticCode\":\"" . $logisticCode . "\"}";
  274. $datas = array(
  275. 'EBusinessID' => '1256051',
  276. 'RequestType' => '1002',
  277. 'RequestData' => urlencode($requestData),
  278. 'DataType' => '2',
  279. );
  280. $datas['DataSign'] = $this->encrypt($requestData, '6718d260-e2b6-4329-ad78-daff173309ac');
  281. $result = $this->sendPost('http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx', $datas);
  282. return $result;
  283. }
  284. /**
  285. * 快递鸟接口方式
  286. * post提交数据
  287. * @param string $url 请求Url
  288. * @param array $datas 提交的数据
  289. * @return url响应返回的html
  290. */
  291. public function sendPost($url, $datas)
  292. {
  293. $temps = array();
  294. foreach ($datas as $key => $value) {
  295. $temps[] = sprintf('%s=%s', $key, $value);
  296. }
  297. $post_data = implode('&', $temps);
  298. $url_info = parse_url($url);
  299. $httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";
  300. $httpheader .= "Host:" . $url_info['host'] . "\r\n";
  301. $httpheader .= "Content-Type:application/x-www-form-urlencoded\r\n";
  302. $httpheader .= "Content-Length:" . strlen($post_data) . "\r\n";
  303. $httpheader .= "Connection:close\r\n\r\n";
  304. $httpheader .= $post_data;
  305. $fd = fsockopen($url_info['host'], 80);
  306. fwrite($fd, $httpheader);
  307. $gets = "";
  308. while (!feof($fd)) {
  309. if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {
  310. break;
  311. }
  312. }
  313. while (!feof($fd)) {
  314. $gets .= fread($fd, 128);
  315. }
  316. fclose($fd);
  317. return $gets;
  318. }
  319. /**
  320. * 快递鸟接口方式
  321. * 电商Sign签名生成
  322. * @param data
  323. * @param appkey Appkey
  324. * @return DataSign签名
  325. */
  326. public function encrypt($data, $appkey)
  327. {
  328. return urlencode(base64_encode(md5($data . $appkey)));
  329. }
  330. }