Order.php 21 KB

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