Order.php 22 KB

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