Buy.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. <?php
  2. # 支付
  3. namespace Mshop\Lib;
  4. use Dever;
  5. class Buy
  6. {
  7. # 获取配置
  8. public $config = array();
  9. # table
  10. public $table = 'shop/buy_order';
  11. public function __construct()
  12. {
  13. $this->config = Dever::db($this->table)->config;
  14. }
  15. # 获取公共的where
  16. public function where($id)
  17. {
  18. $where = array();
  19. $where['shop_id'] = $id;
  20. if (!$where) {
  21. Dever::alert('参数错误');
  22. }
  23. return $where;
  24. }
  25. # 获取订单列表
  26. public function getList($id)
  27. {
  28. $result = array();
  29. $where = $this->where($id);
  30. $mobile = Dever::input('mobile');
  31. if ($mobile) {
  32. $where['mobile'] = $mobile;
  33. }
  34. $status = Dever::input('status');
  35. if ($status) {
  36. $where['status'] = $status;
  37. }
  38. $result['search_value'] = $where;
  39. $result['search_value']['day'] = $day = Dever::input('day');
  40. if ($day) {
  41. $where['start'] = Dever::maketime($day . ' 00:00:00');
  42. $where['end'] = Dever::maketime($day . ' 23:59:59');
  43. }
  44. $result['order'] = Dever::db($this->table)->getAll($where);
  45. if ($result['order']) {
  46. foreach ($result['order'] as $k => $v) {
  47. $result['order'][$k] = $this->getInfo($v);
  48. }
  49. }
  50. $result['search'] = array();
  51. $result['search']['status'] = array
  52. (
  53. array('value' => 1, 'name' => '待支付'),
  54. array('value' => 2, 'name' => '待审核'),
  55. array('value' => 3, 'name' => '待发货'),
  56. array('value' => 4, 'name' => '待收货确认'),
  57. array('value' => 5, 'name' => '已完成'),
  58. array('value' => 6, 'name' => '已完成(有退款)'),
  59. array('value' => '7,8,9', 'name' => '已取消'),
  60. );
  61. return $result;
  62. }
  63. # 查看详情
  64. public function getView($id, $order_id, $show = true)
  65. {
  66. $where = $this->where($id);
  67. $where['id'] = $order_id;
  68. $result = Dever::db($this->table)->find($where);
  69. if (!$result) {
  70. Dever::alert('订单不存在');
  71. }
  72. if ($show) {
  73. $result = $this->getInfo($result, true);
  74. }
  75. return $result;
  76. }
  77. # 获取订单详细信息
  78. public function getInfo($info, $view = false)
  79. {
  80. if ($info['status'] == 1) {
  81. # 15分钟内支付,900秒
  82. $m = 9000;
  83. # 支付倒计时
  84. $info['time'] = time() - $info['cdate'];
  85. if ($info['time'] >= $m) {
  86. # 已过期,自动取消
  87. $info['time'] = -1;
  88. Dever::db($this->table)->update(array('where_id' => $info['id'], 'status' => 11));
  89. $info['status'] = 11;
  90. } else {
  91. $info['time'] = $m - $info['time'];
  92. }
  93. }
  94. $info['status_name'] = $this->config['status'][$info['status']];
  95. $info['goods'] = Dever::db('shop/buy_order_goods')->select(array('order_id' => $info['id']));
  96. $info['shop'] = Dever::db('shop/info')->getOne($info['shop_id']);
  97. $info['cdate'] = date('Y-m-d H:i', $info['cdate']);
  98. $goods_status = Dever::db('shop/buy_order_goods')->config['status'];
  99. if ($view) {
  100. foreach ($info['goods'] as $k => $v) {
  101. $info['goods'][$k]['info'] = Dever::load('goods/lib/info')->getPayInfo($v['goods_id'], $v['sku_id']);
  102. $info['goods'][$k]['status_name'] = $goods_status[$v['status']];
  103. }
  104. } else {
  105. foreach ($info['goods'] as $k => $v) {
  106. $goods = Dever::db('goods/info')->one($v['goods_id']);
  107. $info['goods'][$k]['name'] = $goods['name'];
  108. $info['goods'][$k]['cover'] = $goods['cover'];
  109. $info['goods'][$k]['status_name'] = $goods_status[$v['status']];
  110. }
  111. }
  112. if ($info['fdate']) {
  113. $info['fdate'] = date('Y-m-d H:i', $info['fdate']);
  114. }
  115. if ($info['qfdate']) {
  116. $info['qfdate'] = date('Y-m-d H:i', $info['qfdate']);
  117. }
  118. if ($info['operdate']) {
  119. $info['operdate'] = date('Y-m-d H:i', $info['operdate']);
  120. }
  121. return $info;
  122. }
  123. # 发起支付
  124. public function action($shop, $name, $num, $goods, $price, $info, $refer = '')
  125. {
  126. if (!$shop) {
  127. Dever::alert('错误的门店信息');
  128. }
  129. $order_data['shop_id'] = $shop['id'];
  130. $order_data['mobile'] = $shop['mobile'];
  131. $order_data['name'] = $name;
  132. $order_data['num'] = $num;
  133. $order_data['info'] = $info;
  134. $order_data['price'] = $price;
  135. $order_data['area'] = $shop['area'];
  136. $order_data['province'] = $shop['province'];
  137. $order_data['city'] = $shop['city'];
  138. $order_data['county'] = $shop['county'];
  139. $order_data['town'] = $shop['town'];
  140. $order_data['order_num'] = $this->getOrderId();
  141. $id = Dever::db('shop/buy_order')->insert($order_data);
  142. if (!$id) {
  143. Dever::alert('支付失败');
  144. }
  145. foreach($goods as $k => $v) {
  146. $data['shop_id'] = $shop['id'];
  147. $data['order_id'] = $id;
  148. $data['goods_id'] = $v['id'];
  149. $data['sku_id'] = $v['sku_id'];
  150. $data['price'] = $v['price'];
  151. $data['num'] = $v['buy_num'];
  152. Dever::db('shop/buy_order_goods')->insert($data);
  153. }
  154. if ($price <= 0) {
  155. $param['pay_product_id'] = $id;
  156. $param['pay_order_id'] = $order_data['order_num'];
  157. $param['pay_status'] = 2;
  158. $param['pay_cash'] = $price;
  159. $param['pay_msg'] = '';
  160. $this->success($param);
  161. return array
  162. (
  163. 'order' => '',
  164. 'order_num' => $order_data['order_num'],
  165. 'order_id' => $id,
  166. 'type' => 'pay',
  167. );
  168. }
  169. $param = array
  170. (
  171. 'project_id' => 2,
  172. 'channel_id' => 1,
  173. 'system_source' => 5,
  174. 'uid' => -1,
  175. 'name' => $order_data['name'],
  176. 'cash' => $price,
  177. 'product_id' => $id,
  178. 'order_id' => $order_data['order_num'],
  179. 'refer' => $refer,
  180. );
  181. $receipt = Dever::input('receipt');
  182. if ($receipt) {
  183. $param['receipt'] = $receipt;
  184. }
  185. $result = Dever::load('pay/api.pay', $param);
  186. $result['order_num'] = $order_data['order_num'];
  187. $result['order_id'] = $id;
  188. return $result;
  189. }
  190. # 再次发起支付
  191. public function raction($id, $refer = '')
  192. {
  193. $order = Dever::db('goods/buy_order')->find($id);
  194. if (!$order) {
  195. Dever::alert('订单信息错误');
  196. }
  197. if ($order['status'] > 1) {
  198. Dever::alert('订单已支付或已取消');
  199. }
  200. $param = array
  201. (
  202. 'project_id' => 2,
  203. 'channel_id' => 1,
  204. 'system_source' => 5,
  205. 'uid' => -1,
  206. 'name' => $order['name'],
  207. 'cash' => $order['price'],
  208. 'product_id' => $id,
  209. 'order_id' => $order['order_num'],
  210. 'refer' => $refer,
  211. );
  212. $receipt = Dever::input('receipt');
  213. if ($receipt) {
  214. $param['receipt'] = $receipt;
  215. }
  216. $result = Dever::load('pay/api.pay', $param);
  217. $result['order_num'] = $order['order_num'];
  218. $result['order_id'] = $id;
  219. return $result;
  220. }
  221. # 支付成功回调 安全加密 设置token
  222. public function success_secure_api_token()
  223. {
  224. $project_id = Dever::input('pay_project_id');
  225. $info = Dever::db('pay/project')->one($project_id);
  226. if ($info) {
  227. return $info['key'];
  228. }
  229. return 'shop_buy_dever_2020';
  230. }
  231. # 支付成功回调 安全加密
  232. public function success_secure_api($param = array())
  233. {
  234. $this->success($param);
  235. }
  236. # 支付成功回调
  237. public function success($param = array())
  238. {
  239. $send = $param ? $param : Dever::preInput('pay_');
  240. $product_id = $send['pay_product_id'];
  241. $order_id = $send['pay_order_id'];
  242. $status = $send['pay_status'];
  243. $cash = $send['pay_cash'];
  244. $msg = $send['pay_msg'];
  245. $order = Dever::db('shop/buy_order')->one(array('id' => $product_id, 'time' => time()));
  246. if ($order && $order['status'] == 1) {
  247. if ($status == 2) {
  248. }
  249. $update['status'] = 2;
  250. $update['where_id'] = $order['id'];
  251. Dever::db('shop/buy_order')->update($update);
  252. }
  253. return 'ok';
  254. }
  255. # 生成订单号
  256. public function getOrderId()
  257. {
  258. $where['order_num'] = Dever::order('C');
  259. $state = Dever::db('shop/buy_order')->one($where);
  260. if (!$state) {
  261. return $where['order_num'];
  262. } else {
  263. return $this->getOrderId();
  264. }
  265. }
  266. # 取消订单
  267. public function cancel($id, $order_id)
  268. {
  269. $data = $this->getView($id, $order_id, false);
  270. if ($data['status'] == 1) {
  271. $state = Dever::db('shop/buy_order')->update(array('where_id' => $data['id'], 'status' => 7, 'operdate' => time()));
  272. if ($state) {
  273. }
  274. return 'ok';
  275. } else {
  276. Dever::alert('当前订单状态不允许取消');
  277. }
  278. }
  279. # 申请退款
  280. public function tui_action($shop_id, $order_id, $order_goods_id, $status, $price, $num = false, $desc = '', $pic = '')
  281. {
  282. $data['shop_id'] = $shop_id;
  283. $data['order_id'] = $order_id;
  284. $data['order_goods_id'] = $order_goods_id;
  285. $info = Dever::db('shop/buy_order_tui')->find($data);
  286. $data['status'] = $status;
  287. $data['price'] = $price;
  288. if ($num) {
  289. $data['num'] = $num;
  290. }
  291. $data['desc'] = $desc;
  292. $data['pic'] = $pic;
  293. if ($info) {
  294. $data['where_id'] = $info['id'];
  295. return Dever::db('shop/buy_order_tui')->update($data);
  296. } else {
  297. return Dever::db('shop/buy_order_tui')->insert($data);
  298. }
  299. }
  300. # 全部退款申请
  301. public function tui($id, $order_id, $status = 1, $desc = '', $pic = '')
  302. {
  303. if ($status != 1 && $status != 2) {
  304. Dever::alert('当前订单状态不允许退货退款');
  305. }
  306. $data = $this->getView($id, $order_id, false);
  307. if ($data['status'] == 2) {
  308. $state = $this->tui_action($data['shop_id'], $data['id'], -1, $status, $data['price'], false, $desc, $pic);
  309. return 'ok';
  310. } else {
  311. Dever::alert('当前订单状态不允许退货退款');
  312. }
  313. }
  314. # 获取部分退款的详情
  315. public function tui_one_info($id, $order_id, $order_goods_id)
  316. {
  317. $data = $this->getView($id, $order_id, false);
  318. if ($data['status'] == 4) {
  319. $info = Dever::db('shop/buy_order_goods')->find(array('id' => $order_goods_id, 'order_id' => $data['id'], 'shop_id' => $id));
  320. if ($info && $info['status'] <= 4) {
  321. $info['tui_price'] = $info['price'];
  322. $info['tui_one_price'] = round($info['tui_price'] / $info['num'], 2);
  323. $info['goods'] = Dever::db('goods/info')->find($info['goods_id']);
  324. }
  325. return $info;
  326. } else {
  327. Dever::alert('当前订单状态不允许退货退款');
  328. }
  329. }
  330. # 部分退款申请
  331. public function tui_one($id, $order_id, $order_goods_id, $num = false, $status = 6, $desc = '', $pic = '')
  332. {
  333. if ($status != 5 && $status != 6) {
  334. Dever::alert('当前订单状态不允许退货退款');
  335. }
  336. $data = $this->getView($id, $order_id, false);
  337. if ($data['status'] == 4 || $data['status'] == 5) {
  338. $info = Dever::db('shop/buy_order_goods')->find(array('id' => $order_goods_id, 'order_id' => $data['id'], 'shop_id' => $id));
  339. if ($info && $info['status'] <= 4) {
  340. $info['price'] = $info['price'];
  341. if ($num > 0 && $info['num'] >= $num) {
  342. $price = round($info['price'] / $info['num'], 2);
  343. $info['price'] = round($price * $num, 2);
  344. }
  345. $state = $this->tui_action($data['shop_id'], $data['id'], $order_goods_id, $status, $info['price'], $num, $desc, $pic);
  346. /*
  347. if ($state) {
  348. $this->pay_tui($state, $data, $info['price']);
  349. # 检查这个订单下的商品是不是都退了
  350. $total = Dever::db('shop/buy_order_goods')->total(array('order_id' => $data['id'], 'shop_id' => $id, 'status' => 1));
  351. if ($total <= 0) {
  352. $status += 3;
  353. $state = Dever::db('shop/buy_order')->update(array('where_id' => $data['id'], 'status' => $status, 'tk_desc' => $desc, 'tk_cash' => $info['price'], 'tk_pic' => $pic));
  354. }
  355. }
  356. */
  357. } else {
  358. Dever::alert('当前订单状态不允许退货退款');
  359. }
  360. return 'ok';
  361. } else {
  362. Dever::alert('当前订单状态不允许退货退款');
  363. }
  364. }
  365. # 退款通知
  366. public function pay_tui($state, $data, $price)
  367. {
  368. return;
  369. if ($state) {
  370. $shop = Dever::db('shop/info')->one($data['shop_id']);
  371. $msg_param['type'] = 1;//消息类型1是订单消息
  372. $msg_param['id'] = $data['id'];
  373. $msg_param['name'] = $shop['name'];
  374. $msg_param = Dever::json_encode($msg_param);
  375. $msg = '您有一笔订单已退款,退款将在3个工作日内返回原支付账户';
  376. Dever::load('message/lib/data')->push(-1, $data['uid'], '退款成功通知', $msg, 1, 1, false, $msg_param);
  377. # 退款到原支付账户 待处理
  378. }
  379. }
  380. # 展示订单详情
  381. public function show()
  382. {
  383. $id = Dever::input('order_id');
  384. $config = Dever::db('shop/buy_order')->config;
  385. $info = Dever::db('shop/buy_order')->one($id);
  386. $shop = Dever::db('shop/info')->find($info['shop_id']);
  387. $html = '[基本信息]:<table class="layui-table"><thead><tr><th style="width:20%">项目</th><th style="width:80%">详情</th></tr> </thead><tbody>';
  388. $html .= '<tr>
  389. <td>订单号</td>
  390. <td>'.$this->table(false, array(array($info['order_num']))).'</td>
  391. </tr>';
  392. $html .= '<tr>
  393. <td>门店信息</td>
  394. <td>'.$this->table(false, array(array('门店名称:' . $shop['name'], '联系人:' . $shop['truename'], '联系电话:' . $shop['mobile']))).'</td>
  395. </tr>';
  396. $html .= '<tr>
  397. <td>订单信息</td>
  398. <td>'.$this->table(array('订单状态', '金额', '数量'), array(array($config['status'][$info['status']], $info['price'], $info['num']))).'</td>
  399. </tr>';
  400. # 增加仓库和工厂信息
  401. $html .= '</tbody></table>';
  402. $html .= '[商品清单]:';
  403. $head = array('商品名称', '商品属性', '商品价格', '商品数量');
  404. $body = array();
  405. $goods = Dever::db('shop/buy_order_goods')->select(array('order_id' => $info['id']));
  406. foreach ($goods as $k => $v) {
  407. $goods_info = Dever::load('goods/lib/info')->getInfoBySku($v['goods_id'], $v['sku_id']);
  408. $body[$k] = array
  409. (
  410. $goods_info['name'],
  411. $v['price'],
  412. $v['price'],
  413. $v['num'],
  414. );
  415. }
  416. $html .= $this->table($head, $body);
  417. return $html;
  418. }
  419. private function table($head, $data)
  420. {
  421. $html = '';
  422. if ($head) {
  423. $html = '<table class="layui-table">';
  424. $html .= '<thead><tr>';
  425. foreach ($head as $k => $v) {
  426. $html .= '<th>'.$v.'</th>';
  427. }
  428. $html .= '</tr></thead>';
  429. $html .= '<tbody>';
  430. foreach ($data as $k => $v) {
  431. $html .= '<tr>';
  432. foreach ($v as $k1 => $v1) {
  433. $html .= '<td>'.$v1.'</td>';
  434. }
  435. $html .= '</tr>';
  436. }
  437. $html .= '</tbody>';
  438. $html .= '</table>';
  439. } else {
  440. foreach ($data as $k => $v) {
  441. $html .= '';
  442. foreach ($v as $k1 => $v1) {
  443. $html .= $v1 . '&nbsp;&nbsp;&nbsp;&nbsp;';
  444. }
  445. $html .= '';
  446. }
  447. }
  448. return $html;
  449. }
  450. # 采购订单审核 拆单
  451. public function audit()
  452. {
  453. $order_id = Dever::input('id');
  454. $info = Dever::db('shop/buy_order')->find($order_id);
  455. $goods = Dever::db('shop/buy_order_goods')->select(array('order_id' => $order_id));
  456. print_r($goods);die;
  457. $shop = Dever::db('shop/info')->find($info['shop_id']);
  458. # 获取门店分配的仓库和工厂
  459. $shop_store = Dever::db('shop/store')->select(array('shop_id' => $shop['id']));
  460. $store = array();
  461. $distance = array();
  462. # 按照距离排序
  463. foreach ($shop_store as $k => $v) {
  464. $info = Dever::db('store/info')->find($v['store_id']);
  465. if ($info && $info['status'] == 1) {
  466. $distance[] = $info['distance'] = Dever::distance($shop['lng'], $shop['lat'], $info['lng'], $info['lat']);
  467. $store[] = $info;
  468. }
  469. }
  470. array_multisort($distance, SORT_ASC, SORT_NUMERIC, $store);
  471. $shop_factory = Dever::db('shop/factory')->select(array('shop_id' => $shop['id']));
  472. $factory = array();
  473. $distance = array();
  474. # 按照距离排序
  475. foreach ($shop_factory as $k => $v) {
  476. $info = Dever::db('factory/info')->find($v['factory_id']);
  477. if ($info && $info['status'] == 1) {
  478. $distance[] = $info['distance'] = Dever::distance($shop['lng'], $shop['lat'], $info['lng'], $info['lat']);
  479. $factory[] = $info;
  480. }
  481. }
  482. array_multisort($distance, SORT_ASC, SORT_NUMERIC, $factory);
  483. if ($store) {
  484. $num = 0;
  485. foreach ($goods as $k => $v) {
  486. # 开始找仓库
  487. $find = $this->store($order_id, $shop, $store, $v);
  488. if (!$find[1]) {
  489. # 仓库没有,找厂家
  490. if ($factory) {
  491. $find = $this->factory($order_id, $shop, $factory, $v);
  492. }
  493. if (!$find[1]) {
  494. # 下单失败 缺货
  495. Dever::db('shop/buy_order_goods')->update(array('where_id' => $v['id'], 'status' => 4));
  496. # 要退款吧
  497. }
  498. }
  499. if ($find[1]) {
  500. $num++;
  501. Dever::db('shop/buy_order_goods')->update(array('where_id' => $v['id'], 'status' => 2, 'type' => $find[0], 'type_id' => implode(',', $find[1])));
  502. }
  503. }
  504. if ($num > 0) {
  505. Dever::db('shop/buy_order')->update(array('where_id' => $info['id'], 'status' => 3));
  506. } else {
  507. Dever::db('shop/buy_order')->update(array('where_id' => $info['id'], 'status' => 7));
  508. }
  509. }
  510. }
  511. private function store($order_id, $shop, $store, $goods, $state = 2)
  512. {
  513. $find = array();
  514. $id = array();
  515. foreach ($store as $k => $v) {
  516. $where['store_id'] = $v['id'];
  517. $where['goods_id'] = $goods['goods_id'];
  518. $where['sku_id'] = ($goods['sku_id'] && $goods['sku_id'] > 0) ? $goods['sku_id'] : -1;
  519. $sku = Dever::db('store/goods_sku')->getOne($where);
  520. if ($sku) {
  521. if ($goods['num'] <= $sku['total']) {
  522. # 如果库存符合,直接下单即可,生成仓库订单
  523. $state = Dever::load('store/lib/order')->pay($order_id, $shop['id'], $where['store_id'], $goods['price'], $goods['num'], $where['goods_id'], $where['sku_id']);
  524. if ($state) {
  525. $id[] = $where['store_id'];
  526. break;
  527. }
  528. } elseif ($state == 1 && $sku['total'] > 0) {
  529. # 如果库存不够,从这个仓库扣下一部分,剩余的从另外仓库处理
  530. $goods['num'] = $goods['num'] - $sku['total'];
  531. # 生成仓库订单
  532. $state = Dever::load('store/lib/order')->pay($order_id, $shop['id'], $where['store_id'], $goods['price'], $sku['total'], $where['goods_id'], $where['sku_id']);
  533. if (!$state) {
  534. $goods['num'] = $goods['num'] + $sku['total'];
  535. } else {
  536. $id[] = $where['store_id'];
  537. }
  538. continue;
  539. } else {
  540. # 直接切换到下一个仓库处理
  541. continue;
  542. }
  543. }
  544. }
  545. return array(1, $id);
  546. }
  547. private function factory($order_id, $shop, $factory, $goods)
  548. {
  549. $find = array();
  550. $id = array();
  551. foreach ($factory as $k => $v) {
  552. $where['factory_id'] = $v['id'];
  553. $where['goods_id'] = $goods['goods_id'];
  554. $where['sku_id'] = ($goods['sku_id'] && $goods['sku_id'] > 0) ? $goods['sku_id'] : -1;
  555. $sku = Dever::db('factory/goods_sku')->getOne($where);
  556. if ($sku) {
  557. $state = Dever::load('factory/lib/order')->pay($order_id, $shop['id'], $where['factory_id'], $goods['price'], $goods['num'], $where['goods_id'], $where['sku_id']);
  558. if ($state) {
  559. $id[] = $where['factory_id'];
  560. break;
  561. }
  562. } else {
  563. continue;
  564. }
  565. }
  566. return array(2, $id);
  567. }
  568. }