Order.php 20 KB

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