Shop.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\system\controller;
  4. use app\BaseController;
  5. use app\model\api\StoreOrder;
  6. use app\model\api\StoreOrderCartInfo;
  7. use app\Request;
  8. use app\services\AliyunExpressService;
  9. use library\services\UtilService;
  10. use think\facade\Db;
  11. class Shop extends BaseController
  12. {
  13. /**
  14. * 商城订单统计
  15. * @param Request $request
  16. */
  17. public function total(Request $request)
  18. {
  19. $post = UtilService::getMore([
  20. ['status', ''],
  21. ], $request);
  22. $order = Db::name('store_order');
  23. $totalWhere = [];
  24. if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
  25. $totalWhere[] = ['status', '=', (int)$post['status']];
  26. }
  27. //全部
  28. $orderCount = $order->where($totalWhere)->count();
  29. //待支付
  30. $waitPayWhere = $totalWhere;
  31. $waitPayWhere[] = ['status', '=', 0];
  32. $waitPayCount = $order->where($waitPayWhere)->count();
  33. //待发货
  34. $waitSendWhere = $totalWhere;
  35. $waitSendWhere[] = ['status', '=', 1];
  36. $waitSendCount = $order->where($waitSendWhere)->count();
  37. //待收货
  38. $waitAcceptWhere = $totalWhere;
  39. $waitAcceptWhere[] = ['status', '=', 2];
  40. $waitAcceptCount = $order->where($waitAcceptWhere)->count();
  41. //已完成
  42. $okWhere = $totalWhere;
  43. $okWhere[] = ['status', '=', 3];
  44. $okCount = $order->where($okWhere)->count();
  45. //已取消
  46. $closeWhere = $totalWhere;
  47. $closeWhere[] = ['status', '=', -1];
  48. $closeCount = $order->where($closeWhere)->count();
  49. return app('json')->success([
  50. 'orderCount' => $orderCount,
  51. 'waitPayCount' => $waitPayCount,
  52. 'waitSendCount' => $waitSendCount,
  53. 'waitAcceptCount' => $waitAcceptCount,
  54. 'okCount' => $okCount,
  55. 'closeCount' => $closeCount,
  56. ]);
  57. }
  58. /**
  59. * 商城订单列表
  60. * @param Request $request
  61. */
  62. public function list(Request $request)
  63. {
  64. $pageSize = 50;
  65. $post = UtilService::getMore([
  66. ['page', 1],
  67. ['uid', 0],
  68. ['mobile', ''],
  69. ['order_id', ''],
  70. ['status', ''],
  71. ['time', []],
  72. ], $request);
  73. $where = [];
  74. if (!empty($post['uid'])) {
  75. $where[] = ['o.uid', '=', $post['uid']];
  76. } else if (!empty($post['mobile'])) {
  77. $m = Db::name('user')->where('mobile', $post['mobile'])->find();
  78. if (!empty($m)) {
  79. $where[] = ['o.uid', '=', $m['uid']];
  80. }
  81. }
  82. if (!empty($post['order_id'])) {
  83. $where[] = ['o.order_id', '=', $post['order_id']];
  84. }
  85. if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
  86. $where[] = ['o.status', '=', (int)$post['status']];
  87. }
  88. //创建时间
  89. $startTime = '';
  90. $endTime = '';
  91. if (!empty($post['time'][0]) && !empty($post['time'][1])) {
  92. $startTime = strtotime($post['time'][0]);
  93. $endTime = strtotime($post['time'][1]);
  94. $where[] = ['o.time', 'between', "{$startTime},{$endTime}"];
  95. }
  96. // $order = Db::name('store_order');
  97. $order = Db::name('store_order')
  98. ->alias('o')
  99. ->field('o.*,u.mobile,u.nickname')
  100. ->leftJoin('user u', 'u.uid = o.uid')
  101. ->where($where)
  102. ->page((int)$post['page'], $pageSize)
  103. ->order('o.id', 'desc')
  104. ->select()
  105. ->toArray();
  106. // 关联订单商品信息
  107. foreach ($order as &$item) {
  108. $cartInfo = Db::name('store_order_cart_info')
  109. ->where('oid', $item['id'])
  110. ->select()
  111. ->toArray();
  112. foreach ($cartInfo as &$cart) {
  113. if (!empty($cart['cart_info'])) {
  114. $innerCartInfo = json_decode($cart['cart_info'], true);
  115. unset($cart['cart_info']);
  116. $cart = array_merge($cart, $innerCartInfo);
  117. }
  118. }
  119. $item['cart_info'] = $cartInfo;
  120. // 关联收货地址信息
  121. if (!empty($item['address_id'])) {
  122. $address = Db::name('user_address')->where('id', $item['address_id'])->find();
  123. $item['address'] = $address ?: [];
  124. } else {
  125. $item['address'] = [];
  126. }
  127. // $item['address_info'] = Db::name('user_address')->where('id', $item['address_id'])->find();
  128. }
  129. $pageCount = Db::name('store_order')
  130. ->alias('o')
  131. ->leftJoin('user u', 'u.uid = o.uid')
  132. ->where($where)
  133. ->count();
  134. $result = UtilService::getParam([
  135. 'id',
  136. 'order_id',
  137. 'uid',
  138. 'user_phone',
  139. 'address_id',
  140. 'user_address',
  141. // 'mobile',
  142. // 'nickname',
  143. // 'real_name',
  144. // 'tel',
  145. // 'province',
  146. // 'city',
  147. // 'district',
  148. // 'detail',
  149. 'address',
  150. 'cart_info',
  151. 'total_price',
  152. 'pay_price',
  153. 'total_postage',
  154. 'pay_postage',
  155. 'paid',
  156. 'status',
  157. ['create_time', 'create_time', 'date("Y-m-d H:i:s",$1)'],
  158. ['pay_time', 'pay_time', function ($item) {
  159. return empty($item) ? "-" : date('Y-m-d H:i:s', $item);
  160. }],
  161. ['confirm_time', 'confirm_time', function ($item) {
  162. return empty($item) ? "-" : date('Y-m-d H:i:s', $item);
  163. }],
  164. ], $order);
  165. return app('json')->success([
  166. 'list' => $result,
  167. 'pageCount' => $pageCount,
  168. 'pageSize' => $pageSize,
  169. 'page' => $post['page'],
  170. ]);
  171. }
  172. /**
  173. * 商城订单详情
  174. * @param Request $request
  175. */
  176. public function info(Request $request)
  177. {
  178. $post = UtilService::getMore([
  179. ['id', '', 'empty', '参数错误'],
  180. ], $request);
  181. $order = Db::name('store_order')
  182. ->alias('o')
  183. ->field('o.*,u.mobile,u.nickname')
  184. ->leftJoin('user u', 'u.uid = o.uid')
  185. ->where('o.id', $post['id'])
  186. ->find();
  187. if (empty($order)) {
  188. return app('json')->fail('订单不存在');
  189. }
  190. $data = $order;
  191. //获取订单商品
  192. $cartInfo = Db::name('store_order_cart_info')
  193. ->where('oid', $data['id'])
  194. ->select()
  195. ->toArray();
  196. // 解析 cart_info JSON 字段并合并到外层
  197. foreach ($cartInfo as &$item) {
  198. if (!empty($item['cart_info'])) {
  199. $innerCartInfo = json_decode($item['cart_info'], true);
  200. unset($item['cart_info']);
  201. $item = array_merge($item, $innerCartInfo);
  202. } else {
  203. unset($item['cart_info']);
  204. }
  205. }
  206. $data['cart_info'] = $cartInfo;
  207. $data['address_info'] = Db::name('user_address')->where('id', $data['address_id'])->find();
  208. return app('json')->success($data);
  209. }
  210. /**
  211. * 发货
  212. * @param Request $request
  213. */
  214. public function fahuo(Request $request)
  215. {
  216. $post = UtilService::getMore([
  217. ['id', '', 'empty', '参数错误'],
  218. ['express_type', ''],
  219. ['express_code', ''],
  220. ['express_num', ''],
  221. ], $request);
  222. $order = Db::name('store_order')
  223. ->where('id', $post['id'])
  224. ->where('status', 1)
  225. ->find();
  226. if (empty($order)) {
  227. return app('json')->fail('当前订单不可发货');
  228. }
  229. if (empty($post['express_num'])) {
  230. return app('json')->fail('请输入物流单号');
  231. }
  232. $result = Db::name('store_order')->where('id', $post['id'])->update([
  233. 'status' => 2,
  234. 'express_type' => $post['express_type'],
  235. 'express_code' => $post['express_code'],
  236. 'express_num' => $post['express_num'],
  237. 'delivery_time' => time(),
  238. ]);
  239. if ($result) {
  240. return app('json')->success('操作成功');
  241. } else {
  242. return app('json')->fail('操作失败');
  243. }
  244. }
  245. /**
  246. * 查询物流信息
  247. * @param Request $request
  248. */
  249. public function express(Request $request)
  250. {
  251. $post = UtilService::getMore([
  252. ['id', '', 'empty', '参数错误'],
  253. ], $request);
  254. $order = Db::name('store_order')
  255. ->where('id', $post['id'])
  256. ->find();
  257. if (empty($order)) {
  258. return app('json')->fail('订单不存在');
  259. }
  260. if (empty($order['express_num'])) {
  261. return app('json')->fail('暂无物流信息');
  262. }
  263. $service = new AliyunExpressService();
  264. $result = $service->query($order['express_num'], $order['express_code'] ?? '');
  265. if ($result === false) {
  266. return app('json')->fail('物流查询失败,请检查阿里云物流AppCode配置');
  267. }
  268. $data = [
  269. 'express_type' => $order['express_type'] ?? '',
  270. 'express_code' => $order['express_code'] ?? '',
  271. 'express_num' => $order['express_num'],
  272. 'list' => $result['result']['list'] ?? [],
  273. 'status' => $result['result']['deliverystatus'] ?? -1,
  274. 'status_text' => $service->getStatusText((int)($result['result']['deliverystatus'] ?? -1)),
  275. ];
  276. return app('json')->success('查询成功', $data);
  277. }
  278. /**
  279. * 订单备注
  280. * @param Request $request
  281. */
  282. public function mono(Request $request)
  283. {
  284. $post = UtilService::getMore([
  285. ['id', '', 'empty', '参数错误'],
  286. ['remark', '', 'empty', '请输入备注内容'],
  287. ], $request);
  288. $order = Db::name('store_order')->where('id', $post['id'])->find();
  289. if (empty($order)) {
  290. return app('json')->fail('订单不存在');
  291. }
  292. $result = Db::name('store_order')->where('id', $post['id'])->update([
  293. 'remark' => $post['remark'],
  294. ]);
  295. if ($result) {
  296. return app('json')->success('操作成功');
  297. } else {
  298. return app('json')->fail('操作失败');
  299. }
  300. }
  301. }