Order.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\system\controller\v1;
  4. use app\BaseController;
  5. use app\model\api\MemberDetail;
  6. use app\model\system\Order as OrderModel;
  7. use app\model\system\OrderInfo;
  8. use app\model\system\OrderInfoAsw;
  9. use app\model\system\OrderInfoDd;
  10. use app\model\system\OrderMono;
  11. use app\Request;
  12. use library\services\UtilService;
  13. use library\utils\Region;
  14. use think\db\exception\DbException;
  15. use think\Exception;
  16. use think\facade\Db;
  17. // +----------------------------------------------------------------------
  18. // | [ WE CAN DO IT MORE SIMPLE ]
  19. // +----------------------------------------------------------------------
  20. // | Copyright (c) 2018-2020 rights reserved.
  21. // +----------------------------------------------------------------------
  22. // | Author: TABLE ME
  23. // +----------------------------------------------------------------------
  24. // | Date: 2020-09-06 21:53
  25. // +----------------------------------------------------------------------
  26. class Order extends BaseController
  27. {
  28. /**
  29. * 获取订单数据
  30. * @param Request $request
  31. */
  32. public function getOrderList(Request $request){
  33. $pageSize = 20;
  34. $post = UtilService::getMore(
  35. [
  36. ['page',1],
  37. ['order_id',''],
  38. ['mono',''],
  39. ['platform_id',''],
  40. ['warehouse_id',''],
  41. ['data',[]],
  42. ['orderType',''],
  43. ['timeType',''],
  44. ['uid','']
  45. ],$request
  46. );
  47. $where = $post;
  48. $order = new OrderModel;
  49. list($pageCount,$data) = $order->getList($post['page'],$where,$pageSize,'id desc');
  50. $result = UtilService::getParam([
  51. "id",
  52. ['time','time','date("Y-m-d H:i:s",$1)'],
  53. "order_id",
  54. "mobile",
  55. "avatar",
  56. "order_count",
  57. "all_price",
  58. "status",
  59. "platfrom_name",
  60. "ck_name",
  61. "exp_name",
  62. "site_name",
  63. "pro_title",
  64. "send_count",
  65. "uid",
  66. "pro_img",
  67. "mono",
  68. "err_msg"
  69. ],$data);
  70. return app('json')->success([
  71. 'list' => $result,
  72. 'pageCount' => $pageCount,
  73. 'pageSize' => $pageSize,
  74. 'page' => $post['page']
  75. ]);
  76. }
  77. public function getOrderPushList(Request $request) {
  78. $pageSize = 20;
  79. $post = UtilService::getMore(
  80. [
  81. ['page',1],
  82. ['order_id',''],
  83. ['mono',''],
  84. ['platform_id',''],
  85. ['warehouse_id',''],
  86. ['data',[]],
  87. ['orderType',''],
  88. ['timeType','']
  89. ],$request
  90. );
  91. $where = $post;
  92. $order = new OrderModel;
  93. list($pageCount,$data) = $order->getPushList($post['page'],$where,$pageSize,'id desc');
  94. $result = UtilService::getParam([
  95. "id",
  96. ['time','time','date("Y-m-d H:i:s",$1)'],
  97. "order_id",
  98. "mobile",
  99. "avatar",
  100. "order_count",
  101. "all_price",
  102. "status",
  103. "platfrom_name",
  104. "ck_name",
  105. "exp_name",
  106. "site_name",
  107. "pro_title",
  108. "push_count",
  109. "pro_img",
  110. "is_push",
  111. "pro_img",
  112. "mono",
  113. "err_msg"
  114. ],$data);
  115. return app('json')->success([
  116. 'list' => $result,
  117. 'pageCount' => $pageCount,
  118. 'pageSize' => $pageSize,
  119. 'page' => $post['page']
  120. ]);
  121. }
  122. /**
  123. * 导出数据
  124. * @param Request $request
  125. */
  126. public function orderDown(Request $request) {
  127. $post = UtilService::getMore([['id','','empty','参数错误'],],$request);
  128. $where = [];
  129. $idsAr = explode(',',$post['id'].'');
  130. $where['id'] = $idsAr;
  131. $data = (new OrderInfo)->getAllList($where,'id desc');
  132. $tAr = [];
  133. foreach ($data as $v) {
  134. $d = [];
  135. $d['name'] = $v['name'];
  136. $d['mobile'] = $v['mobile'];
  137. $d['out_order_id'] = $v['out_order_id'];
  138. $d['in_order_id'] = $v['in_order_id'];
  139. $d['address'] = $v['address'];
  140. $d['exp_name'] = $v['exp_name'];
  141. $d['exp_number'] = $v['exp_number'];
  142. $d['pro_name'] = $v['pro_name'];
  143. $d['pro_code'] = $v['csno'];
  144. $d['pro_price'] = $v['pro_price'];
  145. $d['platform_name'] = $v['platform_name'];
  146. $d['time'] =date('Y-m-d H:i:s',$v['time']);
  147. $d['count'] = 1;
  148. $d['money'] = $v['money'];
  149. $d['exp_price'] = $v['exp_price'];
  150. $tAr[] = $d;
  151. }
  152. return app('json')->success($tAr);
  153. }
  154. /**
  155. * 子订单数据
  156. * @param Request $request
  157. */
  158. public function orderSubItem(Request $request) {
  159. $pageSize = 20;
  160. $post = UtilService::getMore(
  161. [
  162. ['id',''],
  163. ['page',1],
  164. ['order_id',''],
  165. ['mobile',''],
  166. ['name','']
  167. ],$request
  168. );
  169. $where = $post;
  170. $where['id'] = $post['id'];
  171. list($pageCount,$data) = (new OrderInfo)->getList($post['page'],$where,$pageSize,"*","id desc");
  172. $result = UtilService::getParam([
  173. "id",
  174. "exp_name",
  175. "order_id",
  176. "out_order_id",
  177. "name",
  178. "mobile",
  179. "address",
  180. "is_push",
  181. "mono",
  182. "time",
  183. "send_time",
  184. "exp_number",
  185. "msg_err",
  186. "money",
  187. "status",
  188. "pro_title"
  189. ],$data);
  190. return app('json')->success([
  191. 'list' => $result,
  192. 'pageCount' => $pageCount,
  193. 'pageSize' => $pageSize,
  194. 'page' => $post['page']
  195. ]);
  196. }
  197. /**
  198. * 售后列表
  199. * @param Request $request
  200. */
  201. public function orderMonoList(Request $request) {
  202. $pageSize = 10;
  203. $post = UtilService::getMore(
  204. [
  205. ['page',1],
  206. ['timeType',''],
  207. ['aswStatus','']
  208. ],$request
  209. );
  210. $tx = new OrderInfoAsw();
  211. $where = $post;
  212. list($pageCount,$data) = $tx->getList($post['page'],$where,$pageSize,"*");
  213. $result = UtilService::getParam([
  214. "id",
  215. "o_id",
  216. "mono",
  217. "status",
  218. "cl_time",
  219. "cl_admin_time",
  220. "out_order_id",
  221. "name",
  222. "mobile",
  223. "address",
  224. "time",
  225. "send_time",
  226. "exp_number",
  227. 'msg_mono',
  228. 'msg_img',
  229. 'admin_id',
  230. "exp_name"
  231. ],$data);
  232. foreach ($result as $k=>$v){
  233. $result[$k]['msg_img_ar'] = empty($v["msg_img"])?[]:explode(",",$v["msg_img"]);
  234. }
  235. return app('json')->success([
  236. 'list' => $result,
  237. 'pageCount' => $pageCount,
  238. 'pageSize' => $pageSize,
  239. 'page' => $post['page']
  240. ]);
  241. }
  242. /**
  243. * 订单撤销数据
  244. * @param Request $request
  245. */
  246. public function orderMonoCancel(Request $request){
  247. $post = UtilService::getMore(
  248. [
  249. ['id',"","empty","参数错误"],
  250. ['mono',""]
  251. ],$request
  252. );
  253. (new OrderInfoAsw)->where('id',$post['id'])->delete();
  254. return app('json')->success('撤销成功');
  255. }
  256. public function orderMonoHandle(Request $request){
  257. $post = UtilService::getMore(
  258. [
  259. ['id',"","empty","参数错误"],
  260. ['msg_mono',""],
  261. ['msg_img',""],
  262. ],$request
  263. );
  264. $post["admin_time"]=NOW_TIME;
  265. $post["status"]=1;
  266. $post["admin_id"]=$request->adminInfo["id"];
  267. $id = $post['id'];
  268. unset($post['id']);
  269. (new OrderInfoAsw)->where('id',$id)->save($post);
  270. return app('json')->success('处理成功');
  271. }
  272. /**
  273. * 底单申请列表
  274. * @param Request $request
  275. */
  276. public function orderDdList(Request $request) {
  277. $pageSize = 10;
  278. $post = UtilService::getMore(
  279. [
  280. ['page',1],
  281. ['timeType',''],
  282. ['aswStatus','']
  283. ],$request
  284. );
  285. $tx = new OrderInfoDd();
  286. $where = $post;
  287. list($pageCount,$data) = $tx->getList($post['page'],$where,$pageSize,"*");
  288. $result = UtilService::getParam([
  289. "id",
  290. "o_id",
  291. "mono",
  292. "status",
  293. "cl_time",
  294. "cl_admin_time",
  295. "out_order_id",
  296. "name",
  297. "mobile",
  298. "address",
  299. "time",
  300. "send_time",
  301. "exp_number",
  302. 'msg_mono',
  303. 'msg_img',
  304. 'admin_id',
  305. "exp_name"
  306. ],$data);
  307. foreach ($result as $k=>$v){
  308. $result[$k]['msg_img_ar'] = empty($v["msg_img"])?[]:explode(",",$v["msg_img"]);
  309. }
  310. return app('json')->success([
  311. 'list' => $result,
  312. 'pageCount' => $pageCount,
  313. 'pageSize' => $pageSize,
  314. 'page' => $post['page']
  315. ]);
  316. }
  317. /*
  318. * 底单申请处理
  319. */
  320. public function orderDdHandle(Request $request){
  321. $post = UtilService::getMore(
  322. [
  323. ['id',"","empty","参数错误"],
  324. ['msg_img',""],
  325. ],$request
  326. );
  327. $post["admin_time"]=NOW_TIME;
  328. $post["status"]=1;
  329. $post["admin_id"]=$request->adminInfo["id"];
  330. $id = $post['id'];
  331. unset($post['id']);
  332. (new OrderInfoDd)->where('id',$id)->save($post);
  333. return app('json')->success('处理成功');
  334. }
  335. /**
  336. * 退款功能
  337. * @param Request $request
  338. */
  339. public function orderTui(Request $request){
  340. $post = UtilService::getMore(
  341. [
  342. ['o_id',"","empty","参数错误"],
  343. ['mono',""],
  344. ],$request
  345. );
  346. //订单
  347. $order = (new OrderModel)->where('id',$post['o_id'])->find();
  348. if(empty($order)) {
  349. return app('json')->fail("找不到订单,无法退款");
  350. }
  351. if($order['status'] == 0 || $order['status'] == -2) {
  352. return app('json')->fail("当前订单状态,无法退款!");
  353. }
  354. try {
  355. if (empty($order['all_price'])) {
  356. return app('json')->fail('抱歉,无退款的订单');
  357. }
  358. $count = (new OrderInfo)->where('o_id',$order['id'])->count();
  359. //退款金额
  360. $book = (new MemberDetail)->refund($order['all_price'],$order['uid'],[
  361. 'order_id' => $order['order_id'],
  362. 'count' => $count,
  363. 'money' => $order['all_price']
  364. ],$order['sassid']);
  365. //改订单状态
  366. (new OrderModel)->where('id',$order['id'])->save(['status' => -2]);
  367. (new OrderInfo)->where('o_id', $order['id'])->save(['status'=> -2]);
  368. //生成操作记录
  369. (new OrderMono)->insert([
  370. 'o_id' => $order['id'],
  371. 'mono' => "退款金额:{$order['all_price']},退款笔数:{$count}".(empty($post['mono']) ? '' : (',反馈内容:'.$post['mono'])),
  372. 'time' => time(),
  373. 'admin_id' => $request->adminInfo["id"],
  374. 'type' => 'refund',
  375. 'money' => $order['all_price']
  376. ]);
  377. return app('json')->success('退款成功');
  378. } catch (DbException $db) {
  379. return app('json')->success('操作失败');
  380. }
  381. }
  382. /**
  383. * 子订单退款
  384. * @param Request $request
  385. */
  386. public function subOrderTui(Request $request){
  387. $post = UtilService::getMore(
  388. [
  389. ['id',"","empty","参数错误"],
  390. ['mono',""],
  391. ],$request
  392. );
  393. //订单
  394. $order = (new OrderInfo)->where('id',$post['id'])->find();
  395. if(empty($order)) {
  396. return app('json')->fail("找不到订单,无法退款");
  397. }
  398. if($order['status'] == 0 || $order['status'] == -2) {
  399. return app('json')->fail("当前订单状态,无法退款!");
  400. }
  401. try {
  402. //退款金额
  403. $res1 = (new MemberDetail)->refund($order['money'],$order['uid'],[
  404. 'order_id' => $order['in_order_id'],
  405. 'count' => 1,
  406. 'money' => $order['money']
  407. ],$order['sassid']);
  408. $res2 = (new OrderInfo)->where('id', $order['id'])->save(['status'=>-2]);
  409. //生成操作记录
  410. $res3 = (new OrderMono)->insert([
  411. 'o_id' => $order['id'],
  412. 'mono' => "退款金额:{$order['money']},退款笔数:1".(empty($post['mono']) ? '' : (',反馈内容:'.$post['mono'])),
  413. 'time' => time(),
  414. 'admin_id' => $request->adminInfo["id"],
  415. 'type' => 'sub_refund',
  416. 'money' => $order['money']
  417. ]);
  418. if($res1 && $res2 && $res3){
  419. return app('json')->success('退款成功');
  420. }
  421. } catch (DbException $db) {
  422. return app('json')->success('操作失败');
  423. }
  424. }
  425. /**
  426. * 订单异常
  427. * @param Request $request
  428. */
  429. public function orderYc(Request $request) {
  430. $post = UtilService::getMore(
  431. [
  432. ['o_id',"","empty","参数错误"],
  433. ['mono',""],
  434. ],$request
  435. );
  436. //订单
  437. $order = (new OrderModel)->where('id',$post['o_id'])->find();
  438. if(empty($order)) {
  439. return app('json')->fail("找不到订单,无法处理");
  440. }
  441. try {
  442. //改订单
  443. (new OrderModel)->where('id',$order['id'])->save([
  444. 'status' => 9,
  445. "err_msg" => $post['mono']
  446. ]);
  447. //生成操作记录
  448. (new OrderMono)->insert([
  449. 'o_id' => $order['id'],
  450. 'mono' => "异常处理内容:".$post['mono'],
  451. 'time' => time(),
  452. 'admin_id' => $request->admin['id'],
  453. 'type' => 'yc',
  454. 'money' => 0
  455. ]);
  456. return app('json')->success('处理成功');
  457. } catch (DbException $db) {
  458. return app('json')->success('操作失败');
  459. }
  460. }
  461. /**
  462. * 订单发货
  463. * @param Request $request
  464. */
  465. public function orderFahuo(Request $request) {
  466. $post = UtilService::getMore(
  467. [
  468. ['o_id',"","empty","参数错误"],
  469. ['mono',""],
  470. ],$request
  471. );
  472. //订单
  473. $order = (new OrderModel)->where('id',$post['o_id'])->find();
  474. if(empty($order)) {
  475. return app('json')->fail("找不到订单,无法处理");
  476. }
  477. if($order['status'] < 1) {
  478. return app('json')->fail("当前订单无法处理");
  479. }
  480. $monoAr = explode(PHP_EOL,$post['mono']);
  481. if(empty($monoAr)) {
  482. return app('json')->fail("无发货数据");
  483. }
  484. $tAr = [];
  485. $orderInfo = new OrderInfo;
  486. foreach ($monoAr as $v) {
  487. $bool = false;
  488. $exp = explode('-',$v);
  489. if(count($exp) == 2) {
  490. $mobile = $exp[0];
  491. $number = $exp[1];
  492. if(!empty($number)) {
  493. $bool = $orderInfo
  494. ->where('o_id',$order['id'])
  495. ->where('mobile',$mobile)
  496. ->save(['exp_number'=>$number,'status'=>2,'send_time'=>time()]);
  497. }
  498. }
  499. $tAr[] = ['txt'=>$v,'status'=>$bool];
  500. }
  501. if($order['status'] == 1) {
  502. (new OrderModel)->where('id',$post['o_id'])->save([
  503. 'status' => 2
  504. ]);
  505. }
  506. return app('json')->success($tAr);
  507. }
  508. /**
  509. * 揽件预警
  510. * @param Request $request
  511. */
  512. public function orderWarningList(Request $request){
  513. $pageSize = 20;
  514. $post = UtilService::getMore(
  515. [
  516. ['page',1],
  517. ['orderType',''],
  518. ['order_id',''],
  519. ['exp_number',''],
  520. ['warehouse_id',''],
  521. ['data',[]]
  522. ],$request
  523. );
  524. $where = $post;
  525. list($pageCount,$data) = (new OrderInfo)->getWarningList($where,$post['page'],$pageSize);
  526. $result = UtilService::getParam([
  527. 'id',
  528. 'order_id',
  529. 'in_order_id',
  530. ['pay_time','pay_time','date("Y-m-d H:i:s",$1)'],
  531. ['send_time','send_time','date("Y-m-d H:i:s",$1)'],
  532. ['in_send_time','send_time','time() - $1'],
  533. 'exp_name',
  534. 'exp_number',
  535. 'name',
  536. 'mobile',
  537. 'address',
  538. 'site_name',
  539. 'warehouse_name',
  540. 'user_mobile',
  541. 'user_avatar'
  542. ],$data);
  543. return app('json')->success([
  544. 'list' => $result,
  545. 'pageCount' => $pageCount,
  546. 'pageSize' => $pageSize,
  547. 'page' => $post['page']
  548. ]);
  549. }
  550. public function queryOrderNum($id)
  551. {
  552. //3天内的 | 8小时查询一次
  553. $time = strtotime('-3 day');
  554. //8小时之内不查询
  555. $timeLast = strtotime('-8 hour');
  556. //8小时查询一次
  557. $time2 = strtotime('-8 hour');
  558. $count = (new OrderInfo)
  559. ->where('status', 2)
  560. ->where('exp_status', 0)
  561. ->where('send_time', '<', $timeLast)
  562. ->where('send_time', '>', $time)
  563. ->where('exp_g_time', '<=', $time2)
  564. ->where('warehouse_id', $id)
  565. ->count();
  566. return app('json')->success(['count' => $count]);
  567. }
  568. public function expInquiry(Request $request)
  569. {
  570. $post = UtilService::getMore(
  571. [
  572. ['page',1],
  573. ['id','']
  574. ],$request
  575. );
  576. //3天内的 | 8小时查询一次
  577. $time = strtotime('-3 day');
  578. //8小时之内不查询
  579. $timeLast = strtotime('-8 hour');
  580. //8小时查询一次
  581. $time2 = strtotime('-8 hour');
  582. $data = (new OrderInfo)
  583. ->where('status', 2)
  584. ->where('exp_status', 0)
  585. ->where('send_time', '<', $timeLast)
  586. ->where('send_time', '>', $time)
  587. ->where('exp_g_time', '<=', $time2)
  588. ->where('warehouse_id', $post['id'])
  589. ->page($post['page'], 100)
  590. ->select()
  591. ->toArray();
  592. foreach ($data as $v) {
  593. file_put_contents("log/exp_" . date("Ymd") . ".log", $v['exp_number'] . ' ' . $v['name'] . ' ' . $v['address'] . ' 发货时间:' . date('Y-m-d H:i:s', $v['send_time']) . PHP_EOL, FILE_APPEND);
  594. $this->setActionData($v);
  595. }
  596. file_put_contents("log/exp_" . date("Ymd") . ".log", "-----------------------------------------页码[" . $post['page'] . "]-------------------------------------", FILE_APPEND);
  597. return app('json')->success('查询物流成功!');
  598. }
  599. /**
  600. * @param $data
  601. */
  602. private function setActionData($oData){
  603. $exp = new \library\lib\expInfo;
  604. $ocode = Db::name("express")->where('id',$oData['exp_id'])->value('ocode');
  605. $data = $exp->showapiExpInfo(trim($oData['exp_number']),empty($ocode) ? 'auto' : $ocode);
  606. if(empty($data['showapi_res_body'])) {
  607. OrderInfo::where('id',$oData['id'])->save(['exp_g_time' => time()]);
  608. return ;
  609. }
  610. $expData = empty($data['showapi_res_body']['data']) ? [] : $data['showapi_res_body']['data'];
  611. $signFor = 0;
  612. $signTime = 0;
  613. $inAr = ['揽收','收件'];
  614. foreach ($expData as $v) {
  615. $bAr = array_filter($inAr,function ($item) use($v){
  616. if(strpos($v['context'],$item) !== false) {
  617. return true;
  618. }
  619. return false;
  620. });
  621. if(!empty($bAr)) {
  622. $signFor = 1;
  623. $signTime = strtotime($v['time']);
  624. break;
  625. }
  626. }
  627. //超过5次信息算【揽收】
  628. if(count($expData) > 2) {
  629. $signFor = 1;
  630. $signTime = time();
  631. }
  632. if($signFor) {
  633. //存储数据
  634. OrderInfo::where('id',$oData['id'])
  635. ->save([
  636. 'exp_status' => $signFor,
  637. 'exp_time' => $signTime,
  638. 'exp_msg' =>json_encode($expData),
  639. 'exp_g_time' => time()
  640. ]);
  641. } else {
  642. OrderInfo::where('id',$oData['id'])->save(['exp_g_time' => time()]);
  643. }
  644. file_put_contents("log/exp_" . date("Ymd") . ".log", '['.$oData['id'].']已查询物流,' . ($signFor ? '已揽件' : '未揽件').PHP_EOL, FILE_APPEND);
  645. }
  646. }