Order.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. <?php namespace Goods\Lib;
  2. use Dever;
  3. use Place;
  4. class Order
  5. {
  6. # 获取订单信息
  7. public function getInfo($info, $view = false)
  8. {
  9. if ($info['status'] == 1) {
  10. $m = 3600;
  11. # 支付倒计时
  12. $info['time'] = time() - $info['cdate'];
  13. if ($info['time'] >= $m) {
  14. # 已过期,自动取消
  15. $info['time'] = -1;
  16. $this->cancel($info);
  17. $info['status'] = 9;
  18. } else {
  19. $info['time'] = $m - $info['time'];
  20. }
  21. }
  22. $info['cash'] = Dever::load('price', 'place')->getText($info['cash'], 3);
  23. $info['detail'] = $this->getDetail($info['id']);
  24. $info['info'] = '共' . intval($info['num']) . '件商品';
  25. if ($view) {
  26. $this->getView($info);
  27. }
  28. return $info;
  29. }
  30. # 获取订单里每个商品
  31. public function getDetail($id)
  32. {
  33. $result = Dever::db('order_detail', 'goods')->select(array('order_id' => $id), array('col' => 'id,name,pic,sku_name,sku_id,cash,num'));
  34. if ($result) {
  35. foreach ($result as &$v) {
  36. $v['cash'] = Dever::load('price', 'place')->getText($v['cash'], 3);
  37. }
  38. }
  39. return $result;
  40. }
  41. # 获取订单详情
  42. public function getView(&$info)
  43. {
  44. # 收货地址
  45. $info['address'] = Dever::load('address', 'place')->getInfo($info['address_id'], $info['uid']);
  46. # 运费
  47. $info['yun'] = Dever::load('price', 'place')->getText(0, 3);
  48. if (in_array($info['status'], array(3,4,5))) {
  49. $info = Dever::load('express', 'goods')->getInfo($info, $info['address_id']);
  50. $info['status_name'] = Dever::db('order', 'goods')->value('status', $info['status']);
  51. }
  52. $info['status_list'] = array
  53. (
  54. 1 => array
  55. (
  56. 'selected' => false,
  57. 'name' => '待付款',
  58. 'time' => $info['cdate_str'],
  59. ),
  60. 2 => array
  61. (
  62. 'selected' => false,
  63. 'name' => '待发货',
  64. 'time' => $info['pdate_str'] ?? '',
  65. ),
  66. 3 => array
  67. (
  68. 'selected' => false,
  69. 'name' => '待签收',
  70. 'time' => $info['ddate_str'] ?? '',
  71. ),
  72. 4 => array
  73. (
  74. 'selected' => false,
  75. 'name' => '待收货',
  76. 'time' => $info['qdate_str'] ?? '',
  77. ),
  78. 5 => array
  79. (
  80. 'selected' => false,
  81. 'name' => '已完成',
  82. 'time' => $info['fdate_str'] ?? '',
  83. ),
  84. );
  85. foreach ($info['status_list'] as $k => &$v) {
  86. if ($info['status'] >= $k) {
  87. $v['selected'] = true;
  88. }
  89. }
  90. if ($info['status'] == 1) {
  91. $info['status_msg'] = '下单成功,待支付';
  92. } elseif ($info['status'] == 2) {
  93. $info['status_msg'] = '支付成功,待发货';
  94. } elseif ($info['status'] == 3) {
  95. $info['status_msg'] = '配送中,等待签收';
  96. } elseif ($info['status'] == 4) {
  97. $info['status_msg'] = '已签收,等待确认';
  98. } elseif ($info['status'] == 5 || $info['status'] == 6) {
  99. $info['status_msg'] = '订单已完成';
  100. } elseif ($info['status'] > 6) {
  101. $info['status_msg'] = '订单已取消';
  102. }
  103. $info['refund'] = false;
  104. $info['refund_list'] = Dever::db('order_refund', 'goods')->select(array('order_id' => $info['id']));
  105. if ($info['refund_list']) {
  106. foreach ($info['refund_list'] as $k => $v) {
  107. if ($v['status'] < 4) {
  108. $info['refund'] = $v;
  109. }
  110. }
  111. }
  112. if ($info['refund']) {
  113. if ($info['refund']['status'] > 2) {
  114. $info['refund'] = Dever::load('express', 'goods')->getInfo($info['refund'], $info['address_id'], 2);
  115. }
  116. $info['refund']['cdate_str'] = date('Y-m-d H:i:s', $info['refund']['cdate']);
  117. if (isset($info['refund']['sdate']) && $info['refund']['sdate']) {
  118. $info['refund']['sdate_str'] = date('Y-m-d H:i:s', $info['refund']['sdate']);
  119. }
  120. if (isset($info['refund']['ddate']) && $info['refund']['ddate']) {
  121. $info['refund']['ddate_str'] = date('Y-m-d H:i:s', $info['refund']['ddate']);
  122. }
  123. if (isset($info['refund']['fdate']) && $info['refund']['fdate']) {
  124. $info['refund']['fdate_str'] = date('Y-m-d H:i:s', $info['refund']['fdate']);
  125. }
  126. if ($info['refund']['type'] == 1) {
  127. $info['refund_status_list'] = array
  128. (
  129. 1 => array
  130. (
  131. 'selected' => false,
  132. 'name' => '退货退款',
  133. 'time' => $info['refund']['cdate_str'],
  134. ),
  135. 2 => array
  136. (
  137. 'selected' => false,
  138. 'name' => '已审核',
  139. 'time' => $info['refund']['sdate_str'] ?? '',
  140. ),
  141. 3 => array
  142. (
  143. 'selected' => false,
  144. 'name' => '买家已发货',
  145. 'time' => $info['refund']['ddate_str'] ?? '',
  146. ),
  147. 4 => array
  148. (
  149. 'selected' => false,
  150. 'name' => '已完成',
  151. 'time' => $info['refund']['fdate_str'] ?? '',
  152. ),
  153. );
  154. }
  155. if ($info['refund']['type'] == 2) {
  156. $info['refund_status_list'] = array
  157. (
  158. 1 => array
  159. (
  160. 'selected' => false,
  161. 'name' => '仅退款',
  162. 'time' => $info['cdate_str'],
  163. ),
  164. 2 => array
  165. (
  166. 'selected' => false,
  167. 'name' => '已审核',
  168. 'time' => $info['sdate_str'] ?? '',
  169. ),
  170. 4 => array
  171. (
  172. 'selected' => false,
  173. 'name' => '已完成',
  174. 'time' => $info['fdate_str'] ?? '',
  175. ),
  176. );
  177. }
  178. foreach ($info['refund_status_list'] as $k => $v) {
  179. if ($info['refund']['status'] >= $k) {
  180. $info['refund_status_list'][$k]['selected'] = true;
  181. }
  182. }
  183. }
  184. }
  185. # 取消订单
  186. public function cancel($order, $status = 9)
  187. {
  188. if ($order['status'] == 1) {
  189. $state = Dever::db('order', 'goods')->update($order['id'], array('status' => $status, 'fdate' => time()));
  190. if ($state) {
  191. # 恢复库存
  192. $this->resell($order['id']);
  193. }
  194. return 'ok';
  195. }
  196. }
  197. # 支付成功
  198. public function success($order, $status)
  199. {
  200. if ($status == 1) {
  201. $update['status'] = 2;
  202. $msg = '支付成功';
  203. } else {
  204. $update['status'] = 7;
  205. $msg = '支付失败';
  206. }
  207. $update['pdate'] = time();
  208. $state = Dever::db('order', 'goods')->update($order['id'], $update);
  209. Dever::load('log', 'goods')->up(1, $order['uid'], $data['order_id'], $msg);
  210. if ($state && $update['status'] == 7) {
  211. # 恢复库存
  212. $this->resell($order['id']);
  213. }
  214. return $state;
  215. }
  216. # 确认收货
  217. public function finish_commit(){}
  218. public function finish($type = 1, $order)
  219. {
  220. if ($order['status'] >= 3 && $order['status'] <= 6) {
  221. if ($type == 1) {
  222. $uid = $order['uid'];
  223. } else {
  224. $uid = '';
  225. }
  226. # 检查有没有退款
  227. $refund = Dever::db('order_refund', 'goods')->find(array('order_id' => $order['id'], 'refund_status' => 1));
  228. $status = 5;
  229. if ($refund) {
  230. $status = 6;
  231. }
  232. Dever::db('order', 'goods')->update($order['id'], array('status' => $status, 'fdate' => time()));
  233. Dever::load('log', 'goods')->up($type, $uid, $order['id'], '确认收货,订单完成');
  234. }
  235. }
  236. # 恢复库存
  237. public function resell($id)
  238. {
  239. $result = Dever::db('order_detail', 'goods')->select(array('order_id' => $id));
  240. if ($result) {
  241. foreach ($result as $v) {
  242. $state = Dever::load('stock', 'goods')->sell($v['info_id'], $v['sku_id'], $v['num']*-1);
  243. }
  244. }
  245. }
  246. # 后台详情页
  247. public function showManageView($page)
  248. {
  249. # 这里获取基本信息
  250. $db = Dever::db('order', 'goods');
  251. $address = Dever::load('address', 'place')->getInfo($page->info['address_id'], $page->info['uid']);
  252. $user = Dever::db('member', 'place')->find($page->info['uid']);
  253. $desc = '';
  254. $status = $db->value('status', $page->info);
  255. if ($page->info['info']) {
  256. $desc = '备注:' . $page->info['info'];
  257. }
  258. $timeline = array();
  259. $page->info['cdate_str'] = date('Y-m-d H:i:s', $page->info['cdate']);
  260. if (isset($page->info['pdate']) && $page->info['pdate']) {
  261. $page->info['pdate_str'] = date('Y-m-d H:i:s', $page->info['pdate']);
  262. }
  263. if (isset($page->info['ddate']) && $page->info['ddate']) {
  264. $page->info['ddate_str'] = date('Y-m-d H:i:s', $page->info['ddate']);
  265. }
  266. if (isset($page->info['qdate']) && $page->info['qdate']) {
  267. $page->info['qdate_str'] = date('Y-m-d H:i:s', $page->info['qdate']);
  268. }
  269. if (isset($page->info['fdate']) && $page->info['fdate']) {
  270. $page->info['fdate_str'] = date('Y-m-d H:i:s', $page->info['fdate']);
  271. }
  272. $this->getView($page->info);
  273. foreach ($page->info['status_list'] as $k => $v) {
  274. $v['name'] = '['.$v['name'].']';
  275. if ($k == 1) {
  276. $v['name'] .= ' 下单人:' . $user['name'] . '('.$user['mobile'].')' . ' 付款:' . $page->info['cash'] . '元 '. $desc;
  277. } elseif ($k == 2) {
  278. $v['name'] .= ' 收货地址:' . $address['full'];
  279. } elseif ($k == 3) {
  280. if (isset($page->info['express'])) {
  281. $v['name'] .= ' 已发货:' . $page->info['express']['name'] . ',' . $page->info['express']['number'];
  282. }
  283. } elseif ($k == 4) {
  284. if (isset($page->info['express']['log'][0])) {
  285. $v['name'] .= ' ' . $page->info['express']['log'][0]['status'];
  286. }
  287. } elseif ($k == 5 && $page->info['status'] > 6) {
  288. $v['name'] .= ' 订单'.$status.'';
  289. }
  290. if ($v['selected']) {
  291. $v['hollow'] = true;
  292. $v['color'] = '#0bbd87';
  293. $v['type'] = 'primary';
  294. $v['size'] = 'large';
  295. }
  296. $timeline[] = $v;
  297. }
  298. $button = array();
  299. if ($page->info['status'] == 2) {
  300. $button[] = array
  301. (
  302. 'name' => '修改收货信息',
  303. 'type' => 'fastedit',
  304. 'path' => 'sector_place_order/goods_order_address',
  305. 'row' => array
  306. (
  307. 'id' => $page->info['id'],
  308. ),
  309. );
  310. $button[] = array
  311. (
  312. 'name' => '发货',
  313. # fastedit、fastadd、oper、api、link、route
  314. 'type' => 'fastadd',
  315. 'path' => 'sector_place_order/goods_order_express',
  316. 'row' => array
  317. (
  318. 'id' => $page->info['id'],
  319. ),
  320. 'param' => array
  321. (
  322. 'order_id' => $page->info['id'],
  323. ),
  324. );
  325. } elseif ($page->info['status'] == 3 && isset($express)) {
  326. $button[] = array
  327. (
  328. 'name' => '修改快递单号',
  329. # fastedit、fastadd、oper、api、link、route
  330. 'type' => 'fastedit',
  331. 'path' => 'sector_place_order/goods_order_express',
  332. 'row' => array
  333. (
  334. 'id' => $express['id'],
  335. ),
  336. 'param' => array
  337. (
  338. 'order_id' => $page->info['id'],
  339. ),
  340. );
  341. }
  342. if (!$page->info['refund'] && $page->info['status'] >= 2 && $page->info['status'] < 7) {
  343. $button[] = array
  344. (
  345. 'name' => '退款',
  346. 'type' => 'fastadd',
  347. 'path' => 'sector_place_order/goods_order_refund',
  348. 'row' => array
  349. (
  350. 'id' => $page->info['id'],
  351. ),
  352. 'param' => array
  353. (
  354. 'order_id' => $page->info['id'],
  355. ),
  356. );
  357. }
  358. $desc = '';
  359. if ($page->info['refund']) {
  360. $desc = '[退款中]';
  361. $refund = array();
  362. foreach ($page->info['refund_status_list'] as $k => $v) {
  363. $v['name'] = '['.$v['name'].']';
  364. if ($k == 1) {
  365. $v['name'] .= ' 申请原因:' . Dever::db('order_refund', 'goods')->value('desc_type', $page->info['refund']['desc_type']) . ' 申请说明:' . $page->info['refund']['desc'];
  366. } elseif ($k == 2) {
  367. $v['name'] .= ' 审核备注:' . $page->info['refund']['audit_desc'];
  368. } elseif ($k == 3) {
  369. if (isset($page->info['refund']['express'])) {
  370. $v['name'] .= ' 已发货:' . $page->info['refund']['express']['name'] . ',' . $page->info['refund']['express']['number'];
  371. }
  372. }
  373. if ($v['selected']) {
  374. $v['hollow'] = true;
  375. $v['color'] = 'red';
  376. $v['type'] = 'primary';
  377. $v['size'] = 'large';
  378. }
  379. $refund[] = $v;
  380. }
  381. $content[] = array
  382. (
  383. 'name' => '退款进度',
  384. 'type' => 'timeline',
  385. 'content' => $refund,
  386. );
  387. $button = array();
  388. if ($page->info['refund']['status'] == 1) {
  389. $button[] = array
  390. (
  391. 'name' => '退款审核',
  392. 'type' => 'fastedit',
  393. 'path' => 'sector_place_order/goods_order_refund_audit',
  394. 'row' => array
  395. (
  396. 'id' => $page->info['refund']['id'],
  397. ),
  398. 'param' => array
  399. (
  400. 'order_id' => $page->info['id'],
  401. ),
  402. );
  403. }
  404. }
  405. $content[] = array
  406. (
  407. 'name' => '订单进度' . $desc,
  408. 'type' => 'timeline',
  409. 'content' => $timeline,
  410. );
  411. $info[] = array
  412. (
  413. # 类型,desc描述 table表格,表格有head和body即可
  414. 'type' => 'desc',
  415. 'name' => $page->info['order_num'],
  416. # 每行展示数量
  417. 'column' => 1,
  418. # 是否有边框
  419. 'border' => true,
  420. # 排列方向:horizontal横向 vertical纵向
  421. 'direction' => 'horizontal',
  422. # 右侧按钮
  423. 'button' => $button,
  424. # 具体内容
  425. 'content' => $content,
  426. );
  427. $detail = Dever::db('order_detail', 'goods')->select(array('order_id' => $page->info['id']));
  428. if ($detail) {
  429. foreach ($detail as &$v) {
  430. $v['status'] = '正常';
  431. }
  432. }
  433. $log = Dever::load('log', 'goods')->getList($page->info['id']);
  434. $tab = array
  435. (
  436. 'active' => 't1',
  437. 'content' => array
  438. (
  439. 't1' => array
  440. (
  441. 'name' => '商品清单',
  442. 'type' => 'table',
  443. 'border' => true,
  444. #'height' => '200',
  445. 'head' => array
  446. (
  447. array
  448. (
  449. 'key' => 'name',
  450. 'name' => '名称',
  451. 'fixed' => 'fixed',
  452. ),
  453. array
  454. (
  455. 'key' => 'sku_name',
  456. 'name' => '规格',
  457. 'fixed' => 'fixed',
  458. ),
  459. array
  460. (
  461. 'key' => 'cash',
  462. 'name' => '金额',
  463. 'fixed' => 'fixed',
  464. ),
  465. array
  466. (
  467. 'key' => 'num',
  468. 'name' => '数量',
  469. 'fixed' => 'fixed',
  470. ),
  471. array
  472. (
  473. 'key' => 'status',
  474. 'name' => '状态',
  475. 'fixed' => 'fixed',
  476. ),
  477. ),
  478. 'button' => array(),
  479. 'body' => $detail,
  480. ),
  481. 't2' => array
  482. (
  483. 'name' => '操作记录',
  484. 'type' => 'table',
  485. 'border' => true,
  486. #'height' => '200',
  487. 'head' => array
  488. (
  489. array
  490. (
  491. 'key' => 'type',
  492. 'name' => '身份',
  493. 'fixed' => 'fixed',
  494. ),
  495. array
  496. (
  497. 'key' => 'name',
  498. 'name' => '名称',
  499. 'fixed' => 'fixed',
  500. ),
  501. array
  502. (
  503. 'key' => 'mobile',
  504. 'name' => '联系电话',
  505. 'fixed' => 'fixed',
  506. ),
  507. array
  508. (
  509. 'key' => 'desc',
  510. 'name' => '详情',
  511. 'fixed' => 'fixed',
  512. ),
  513. array
  514. (
  515. 'key' => 'cdate_str',
  516. 'name' => '时间',
  517. 'fixed' => 'fixed',
  518. ),
  519. ),
  520. 'button' => array(),
  521. 'body' => $log,
  522. ),
  523. )
  524. );
  525. return array('info' => $info, 'tab' => $tab);
  526. }
  527. }