ListController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/4
  6. * Time: 上午9:09
  7. */
  8. namespace app\backend\modules\order\controllers;
  9. use app\backend\modules\goods\models\GoodsOption;
  10. use app\backend\modules\member\models\MemberParent;
  11. use app\backend\modules\order\models\Order;
  12. use app\backend\modules\order\models\OrderGoods;
  13. use app\backend\modules\order\models\OrderJoinOrderGoods;
  14. use app\common\components\BaseController;
  15. use app\common\helpers\PaginationHelper;
  16. use app\common\services\ExportService;
  17. use app\common\services\member\level\LevelUpgradeService;
  18. use app\common\services\OrderExportService;
  19. use Illuminate\Support\Facades\DB;
  20. use Yunshop\Diyform\models\DiyformDataModel;
  21. use Yunshop\Diyform\models\DiyformOrderContentModel;
  22. use Yunshop\Diyform\models\DiyformTypeModel;
  23. use Yunshop\Diyform\models\OrderGoodsDiyForm;
  24. use Yunshop\TeamDividend\models\TeamDividendLevelModel;
  25. class ListController extends BaseController
  26. {
  27. /**
  28. * 页码
  29. */
  30. const PAGE_SIZE = 10;
  31. /**
  32. * @var Order
  33. */
  34. protected $orderModel;
  35. public function preAction()
  36. {
  37. parent::preAction();
  38. $params = \YunShop::request()->get();
  39. $this->orderModel = $this->getOrder()->orders($params['search']);
  40. $order_sn = \YunShop::request()->get('order_sn');
  41. if ($order_sn)
  42. {
  43. $this->orderModel->where('order_sn',$order_sn)->get();
  44. }
  45. }
  46. protected function getOrder()
  47. {
  48. return Order::isPlugin()->pluginId();
  49. }
  50. /**
  51. * @return string
  52. * @throws \Throwable
  53. */
  54. public function index()
  55. {
  56. $this->export($this->orderModel);
  57. $this->directExport($this->orderModel);
  58. return view('order.index', $this->getData())->render();
  59. }
  60. /**
  61. * @return string
  62. * @throws \Throwable
  63. */
  64. public function waitPay()
  65. {
  66. $this->orderModel->waitPay();
  67. $this->export($this->orderModel->waitPay());
  68. $this->directExport($this->orderModel->waitPay());
  69. return view('order.index', $this->getData())->render();
  70. }
  71. /**
  72. * @return string
  73. * @throws \Throwable
  74. */
  75. public function waitSend()
  76. {
  77. // 会员排序
  78. $sort = request()->search['sort'];
  79. $condition = [];
  80. if ($sort == 1) {
  81. $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.uid', 'desc'];
  82. $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
  83. }
  84. $this->orderModel->waitSend();
  85. $this->export($this->orderModel->waitSend());
  86. $this->directExport($this->orderModel->waitSend());
  87. return view('order.index', $this->getData($condition))->render();
  88. //return view('order.index', $this->getData())->render();
  89. }
  90. /**
  91. * 催发货
  92. * @return string
  93. */
  94. public function expeditingSend()
  95. {
  96. // 会员排序
  97. $sort = request()->search['sort'];
  98. $condition = [];
  99. if ($sort == 1) {
  100. $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.uid', 'desc'];
  101. $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
  102. }
  103. $condition['expediting_delivery'] = 1;
  104. $this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery');
  105. $this->export($this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery'));
  106. $this->directExport($this->orderModel->waitSend()->whereHas('hasOneExpeditingDelivery'));
  107. return view('order.index', $this->getData($condition))->render();
  108. }
  109. /**
  110. * @return string
  111. * @throws \Throwable
  112. */
  113. public function waitReceive()
  114. {
  115. $this->orderModel->waitReceive();
  116. $this->export($this->orderModel->waitReceive());
  117. $this->directExport($this->orderModel->waitReceive());
  118. return view('order.index', $this->getData())->render();
  119. }
  120. /**
  121. * @return string
  122. * @throws \Throwable
  123. */
  124. public function completed()
  125. {
  126. $this->orderModel->completed();
  127. $this->export($this->orderModel->completed());
  128. $this->directExport($this->orderModel->completed());
  129. return view('order.index', $this->getData())->render();
  130. }
  131. /**
  132. * @return string
  133. * @throws \Throwable
  134. */
  135. public function cancelled()
  136. {
  137. $this->orderModel->cancelled();
  138. $this->export($this->orderModel->cancelled());
  139. $this->directExport($this->orderModel->cancelled());
  140. return view('order.index', $this->getData())->render();
  141. }
  142. protected function getData($condition = [])
  143. {
  144. $sort = request()->search['sort'];
  145. if ($sort == 1 && (!$condition || !$condition['order_by'])) {
  146. $condition['order_by'][] = [$this->orderModel->getModel()->getTable() . '.id', 'desc'];
  147. }
  148. /*$params = [
  149. 'search' => [
  150. 'ambiguous' => [
  151. 'field' => 'order_goods',
  152. 'string' => '春',
  153. ],
  154. 'pay_type' => 1,
  155. 'time_range' => [
  156. 'field' => 'create_time',
  157. 'range' => [1458425047, 1498425047]
  158. ]
  159. ]
  160. ];*/
  161. $requestSearch = \YunShop::request()->get('search');
  162. $requestSearch['plugin'] = 'fund';
  163. if ($requestSearch) {
  164. $requestSearch = array_filter($requestSearch, function ($item) {
  165. return !empty($item);
  166. });
  167. }
  168. $list['total_price'] = $this->orderModel->sum('yz_order.price');
  169. $list['dispatch_price'] = $this->orderModel->sum('yz_order.dispatch_price');
  170. $build = $this->orderModel;
  171. if ($condition['expediting_delivery']) {
  172. $build->whereHas('hasOneExpeditingDelivery');
  173. }
  174. if ($sort == 1) {
  175. foreach ($condition['order_by'] as $item) {
  176. $build->orderBy(...$item);
  177. }
  178. } else {
  179. $build->orderBy($this->orderModel->getModel()->getTable() . '.id', 'desc');
  180. }
  181. $page = $build->paginate(self::PAGE_SIZE);
  182. foreach ($page as $item) {
  183. $item->canRefund = $item->canRefund();
  184. }
  185. $list += $page->toArray();
  186. // foreach ($list['data'] as &$item){
  187. // $item['has_many_order_goods'][0]['thumb'] = $item['has_many_order_goods'][0]['thumb'] ?: yz_tomedia($list['data'][0]['has_many_order_goods'][0]['goods']['thumb']);
  188. // }
  189. // dd($list['data'][0]['has_many_order_goods'][0]['thumb'],yz_tomedia($list['data'][0]['has_many_order_goods'][0]['goods']['thumb']));
  190. //总数据数 页数 每页显示数据量
  191. $pager = PaginationHelper::show($list['total'], $list['current_page'], $list['per_page']);
  192. $data = [
  193. 'list' => $list,
  194. 'total_price' => $list['total_price'],
  195. 'dispatch_price' => $list['dispatch_price'],
  196. 'pager' => $pager,
  197. 'requestSearch' => $requestSearch,
  198. 'var' => \YunShop::app()->get(),
  199. 'url' => request('route'),
  200. 'include_ops' => 'order.ops',
  201. 'detail_url' => 'order.detail',
  202. 'route' => request()->route,
  203. ];
  204. return $data;
  205. }
  206. public function export($orders)
  207. {
  208. set_time_limit(30);
  209. if (\YunShop::request()->export == 1) {
  210. $export_page = request()->export_page ? request()->export_page : 1;
  211. //清除之前没有导出的文件
  212. if ($export_page == 1) {
  213. $fileNameArr = file_tree(storage_path('exports'));
  214. foreach ($fileNameArr as $val) {
  215. if (file_exists(storage_path('exports/' . basename($val)))) {
  216. unlink(storage_path('exports/') . basename($val)); // 路径+文件名称
  217. }
  218. }
  219. }
  220. $orders = $orders->with([
  221. 'discounts',
  222. 'deductions',
  223. ])->orderBy($this->orderModel->getModel()->getTable() . '.id', 'desc');
  224. $export_model = new OrderExportService($orders, $export_page);
  225. if (!$export_model->builder_model->isEmpty()) {
  226. $file_name = date('Ymdhis', time()) . '订单导出' . $export_page;//返现记录导出
  227. $export_data[0] = $this->getColumns();
  228. foreach ($export_model->builder_model->toArray() as $key => $item) {
  229. $address = explode(' ', $item['address']['address']);
  230. $fistOrder = $item['has_many_first_order'] ? '首单' : '';
  231. if ($item['dispatch_type_id'] == \app\common\models\DispatchType::PACKAGE_DELIVER && app('plugins')->isEnabled('package-deliver')) {
  232. $deliverOrder = \Yunshop\PackageDeliver\model\PackageDeliverOrder::where('order_id', $item['id'])
  233. ->with(['hasOneDeliver', 'hasOneDeliverClerk'])
  234. ->first();
  235. if ($deliverOrder->hasOneDeliverClerk) {
  236. $package_deliver_name = '[UID:' . $deliverOrder->hasOneDeliverClerk->uid . ']' . $deliverOrder->hasOneDeliverClerk->realname;
  237. } else {
  238. $package_deliver_name = '后台确认';
  239. }
  240. } else {
  241. $package_deliver_name = '';
  242. }
  243. $form = $this->getFormDataByOderId($item['id']);
  244. $goods = [];
  245. foreach ($item['has_many_order_goods'] as $v) {
  246. $goods[] = [
  247. $v['title'],
  248. $v['goods_option_title'],
  249. $v['goods_sn'],
  250. $v['total'],
  251. isset($form[$v['goods_id']]) ? $form[$v['goods_id']] : '',
  252. ];
  253. }
  254. $realname = $item['has_many_member_certified']['realname'] ?: $item['belongs_to_member']['realname'];
  255. $idcard = $item['has_many_member_certified']['idcard'] ?: $item['belongs_to_member']['idcard'];
  256. $export_data[$key + 1] = [
  257. $item['id'],
  258. $item['order_sn'],
  259. $item['has_one_order_pay']['pay_sn'],
  260. $item['belongs_to_member']['uid'],
  261. $this->getNickname($item['belongs_to_member']['nickname']),
  262. $item['address']['realname'],
  263. $item['address']['mobile'],
  264. !empty($address[0]) ? $address[0] : '',
  265. !empty($address[1]) ? $address[1] : '',
  266. !empty($address[2]) ? $address[2] : '',
  267. $item['address']['address'],
  268. $goods,
  269. $item['pay_type_name'],
  270. $this->getExportDiscount($item, 'deduction'),
  271. $this->getExportDiscount($item, 'coupon'),
  272. $this->getExportDiscount($item, 'enoughReduce'),
  273. $this->getExportDiscount($item, 'singleEnoughReduce'),
  274. $item['goods_price'],
  275. $item['dispatch_price'],
  276. $item['price'],
  277. $this->getGoods($item, 'cost_price'),
  278. $item['status_name'],
  279. $item['create_time'],
  280. !empty(strtotime($item['pay_time'])) ? $item['pay_time'] : '',
  281. !empty(strtotime($item['send_time'])) ? $item['send_time'] : '',
  282. !empty(strtotime($item['finish_time'])) ? $item['finish_time'] : '',
  283. $item['express']['express_company_name'],
  284. '[' . $item['express']['express_sn'] . ']',
  285. $item['has_one_order_remark']['remark'],
  286. $item['note'],
  287. $fistOrder,
  288. $realname,
  289. ' '.$idcard,
  290. $package_deliver_name,
  291. ];
  292. }
  293. $export_model->export($file_name, $export_data, 'order.list.index');
  294. }
  295. }
  296. }
  297. public function directExport($orders)
  298. {
  299. if (\YunShop::request()->direct_export == 1) {
  300. $export_page = request()->export_page ? request()->export_page : 1;
  301. $orders = $orders->with([
  302. 'discounts',
  303. 'deductions',
  304. 'hasManyParentTeam' => function ($q) {
  305. $q->whereHas('hasOneTeamDividend')
  306. ->with(['hasOneTeamDividend' => function ($q) {
  307. $q->with(['hasOneLevel']);
  308. },
  309. ])
  310. ->with('hasOneMember')
  311. // ->orderBy('id', 'desc')
  312. ->orderBy('level', 'asc');
  313. },
  314. ]);
  315. $export_model = new OrderExportService($orders, $export_page);
  316. $team_list = TeamDividendLevelModel::getList()->get();
  317. $levelId = [];
  318. $level_name = [];
  319. foreach ($team_list as $level) {
  320. $level_name[] = $level->level_name;
  321. $levelId[] = $level->id;
  322. }
  323. if (!$export_model->builder_model->isEmpty()) {
  324. $file_name = date('Ymdhis', time()) . '订单导出' . $export_page;//返现记录导出
  325. $export_data[0] = array_merge($level_name, $this->getColumns());
  326. foreach ($export_model->builder_model->toArray() as $key => $item) {
  327. $level = $this->getLevel($item, $levelId);
  328. $export_data[$key + 1] = $level;
  329. $address = explode(' ', $item['address']['address']);
  330. $form = $this->getFormDataByOderId($item['id']);
  331. $goods = [];
  332. foreach ($item['has_many_order_goods'] as $v) {
  333. $goods[] = [
  334. $v['title'],
  335. $v['goods_option_title'],
  336. $v['goods_sn'],
  337. $v['total'],
  338. isset($form[$v['goods_id']]) ? $form[$v['goods_id']] : '',
  339. ];
  340. }
  341. array_push($export_data[$key + 1],
  342. $item['id'],
  343. $item['order_sn'],
  344. $item['has_one_order_pay']['pay_sn'],
  345. $item['belongs_to_member']['uid'],
  346. $this->getNickname($item['belongs_to_member']['nickname']),
  347. $item['address']['realname'],
  348. $item['address']['mobile'],
  349. !empty($address[0]) ? $address[0] : '',
  350. !empty($address[1]) ? $address[1] : '',
  351. !empty($address[2]) ? $address[2] : '',
  352. $item['address']['address'],
  353. $goods,
  354. $item['pay_type_name'],
  355. $this->getExportDiscount($item, 'deduction'),
  356. $this->getExportDiscount($item, 'coupon'),
  357. $this->getExportDiscount($item, 'enoughReduce'),
  358. $this->getExportDiscount($item, 'singleEnoughReduce'),
  359. $item['goods_price'],
  360. $item['dispatch_price'],
  361. $item['price'],
  362. $this->getGoods($item, 'cost_price'),
  363. $item['status_name'],
  364. $item['create_time'],
  365. !empty(strtotime($item['pay_time'])) ? $item['pay_time'] : '',
  366. !empty(strtotime($item['send_time'])) ? $item['send_time'] : '',
  367. !empty(strtotime($item['finish_time'])) ? $item['finish_time'] : '',
  368. $item['express']['express_company_name'],
  369. '[' . $item['express']['express_sn'] . ']',
  370. $item['has_one_order_remark']['remark'],
  371. $item['note']
  372. );
  373. }
  374. $export_model->export($file_name, $export_data, 'order.list.index', 'direct_export');
  375. }
  376. }
  377. }
  378. public function getLevel($member, $levelId)
  379. {
  380. $data = [];
  381. foreach ($levelId as $k => $value) {
  382. foreach ($member['has_many_parent_team'] as $key => $parent) {
  383. if ($parent['has_one_team_dividend']['has_one_level']['id'] == $value) {
  384. $data[$k] = $parent['has_one_member']['nickname'] . ' ' . $parent['has_one_member']['realname'] . ' ' . $parent['has_one_member']['mobile'];
  385. break;
  386. }
  387. }
  388. $data[$k] = $data[$k] ? : '';
  389. }
  390. return $data;
  391. }
  392. public function getFormDataByOderId($order_id)
  393. {
  394. $result = [];
  395. $set = \app\common\modules\shop\ShopConfig::current()->get('shop-foundation.order.order_detail.diyform');
  396. if(!$set){
  397. return $result;
  398. }
  399. $orderGoods = \app\common\models\OrderGoods::where('order_id', $order_id)->get()->toArray();
  400. $orderGoodsIds = array_column($orderGoods, 'id');
  401. $orderGoods = array_column($orderGoods, null, 'id');
  402. $diyForms = OrderGoodsDiyForm::whereIn('order_goods_id', $orderGoodsIds)->get()->toArray();
  403. $dataIds = array_column($diyForms, 'diyform_data_id');
  404. $diyForms = array_column($diyForms, null, 'diyform_data_id');
  405. $datas = DiyformDataModel::whereIn('id', $dataIds)->get()->toArray();
  406. $item = [];
  407. foreach ($datas as $detail) {
  408. if ($detail) {
  409. $form = DiyformTypeModel::find($detail['form_id']);
  410. }
  411. $fields = iunserializer($form['fields']);
  412. foreach ($detail['form_data'] as $k => $v){
  413. if ($fields[$k]['data_type'] == 5) {
  414. continue;
  415. }
  416. if(is_array($v)){
  417. $v = implode(',', $v);
  418. }
  419. $item[] = $fields[$k]['tp_name'] . ':' . $v;
  420. }
  421. $result[$orderGoods[$diyForms[$detail['id']]['order_goods_id']]['goods_id']] = implode("\r\n", $item);
  422. }
  423. return $result;
  424. }
  425. protected function getColumns()
  426. {
  427. return ["订单id", "订单编号", "支付单号", "会员ID", "粉丝昵称", "会员姓名", "联系电话", '省', '市', '区', "收货地址",
  428. "商品名称", "商品规格", "商品编码", "商品数量", "自定义表单", "支付方式", '抵扣金额', '优惠券优惠', '全场满减优惠',
  429. '单品满减优惠', "商品小计", "运费", "应收款", "成本价", "状态", "下单时间", "付款时间", "发货时间", "完成时间",
  430. "快递公司", "快递单号", "订单备注", "用户备注", "首单", "真实姓名", "身份证", "核销员",
  431. ];
  432. }
  433. protected function getExportDiscount($order, $key)
  434. {
  435. $export_discount = [
  436. 'deduction' => 0, //抵扣金额
  437. 'coupon' => 0, //优惠券优惠
  438. 'enoughReduce' => 0, //全场满减优惠
  439. 'singleEnoughReduce' => 0, //单品满减优惠
  440. ];
  441. foreach ($order['discounts'] as $discount) {
  442. if ($discount['discount_code'] == $key) {
  443. $export_discount[$key] = $discount['amount'];
  444. }
  445. }
  446. if (!$export_discount['deduction']) {
  447. foreach ($order['deductions'] as $k => $v) {
  448. $export_discount['deduction'] += $v['amount'];
  449. }
  450. }
  451. return $export_discount[$key];
  452. }
  453. protected function getGoods($order, $key)
  454. {
  455. $goods_title = '';
  456. $goods_sn = '';
  457. $total = '';
  458. $cost_price = 0;
  459. foreach ($order['has_many_order_goods'] as $goods) {
  460. $res_title = $goods['title'];
  461. $res_title = str_replace('-', ',', $res_title);
  462. $res_title = str_replace('+', ',', $res_title);
  463. $res_title = str_replace('/', ',', $res_title);
  464. $res_title = str_replace('*', ',', $res_title);
  465. $res_title = str_replace('=', ',', $res_title);
  466. if ($goods['goods_option_title']) {
  467. $res_title .= '[' . $goods['goods_option_title'] . ']';
  468. }
  469. $order_goods = OrderGoods::find($goods['id']);
  470. if ($order_goods->goods_option_id) {
  471. $goods_option = GoodsOption::find($order_goods->goods_option_id);
  472. if ($goods_option) {
  473. $goods_sn .= '【' . $goods_option->goods_sn . '】';
  474. }
  475. } else {
  476. $goods_sn .= '【' . $goods['goods_sn'] . '】';
  477. }
  478. $goods_title .= '【' . $res_title . '*' . $goods['total'] . '】';
  479. $total .= '【' . $goods['total'] . '】';
  480. $cost_price += $goods['goods_cost_price'];
  481. }
  482. $res = [
  483. 'goods_title' => $goods_title,
  484. 'goods_sn' => $goods_sn,
  485. 'total' => $total,
  486. 'cost_price' => $cost_price,
  487. ];
  488. return $res[$key];
  489. }
  490. protected function getNickname($nickname)
  491. {
  492. if (substr($nickname, 0, strlen('=')) === '=') {
  493. $nickname = ',' . $nickname;
  494. }
  495. return $nickname;
  496. }
  497. }