ExportList.php 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\utils;
  8. use app\models\Goods;
  9. use app\models\Order;
  10. use app\models\OrderDetail;
  11. use app\models\OrderRefund;
  12. use app\models\OrderStateFlow;
  13. use yii\helpers\Json;
  14. use app\modules\admin\models\ShareOrderForm;
  15. class ExportList
  16. {
  17. public $order_type = 0; // 0--商城 1--秒杀 2--拼团 3--预约 4--积分商城 5--分销
  18. public $is_offline; // 0--非自提 1--自提
  19. public $is_delivery;
  20. public $fields;
  21. public $type; // 0--非售后 1--售后
  22. public function getList()
  23. {
  24. $list = [
  25. [
  26. 'key' => 'order_no',
  27. 'value' => '订单编号',
  28. 'hidden' => false,
  29. 'selected' => 0,
  30. 'type' => [0, 1],
  31. ],
  32. [
  33. 'key' => 'nickname',
  34. 'value' => '下单用户',
  35. 'hidden' => false,
  36. 'selected' => 0,
  37. 'type' => [0, 1],
  38. ],
  39. [
  40. 'key' => 'good_name',
  41. 'value' => '商品名称',
  42. 'hidden' => false,
  43. 'selected' => 0,
  44. 'type' => [0, 1],
  45. ],
  46. [
  47. 'key' => 'attr',
  48. 'value' => '商品规格',
  49. 'hidden' => false,
  50. 'selected' => 0,
  51. 'order_type' => [0, 1, 2, 4, 5],
  52. 'type' => [0, 1],
  53. ],
  54. [
  55. 'key' => 'good_num',
  56. 'value' => '商品数量',
  57. 'hidden' => false,
  58. 'selected' => 0,
  59. 'order_type' => [0, 1, 2, 4, 5],
  60. 'type' => [0, 1],
  61. ],
  62. [
  63. 'key' => 'good_no',
  64. 'value' => '商品货号',
  65. 'hidden' => false,
  66. 'selected' => 0,
  67. 'order_type' => [0, 1, 2, 4],
  68. 'type' => [0, 1],
  69. ],
  70. [
  71. 'key' => 'name',
  72. 'value' => '收件人',
  73. 'selected' => 0,
  74. 'hidden' => false,
  75. 'order_type' => [0, 1, 2, 4, 5],
  76. 'type' => [0, 1],
  77. ],
  78. [
  79. 'key' => 'mobile',
  80. 'value' => '收件电话',
  81. 'hidden' => false,
  82. 'selected' => 0,
  83. 'order_type' => [0, 1, 2, 4, 5],
  84. 'type' => [0, 1],
  85. ],
  86. [
  87. 'key' => 'address',
  88. 'value' => '收件地址',
  89. 'hidden' => false,
  90. 'selected' => 0,
  91. 'order_type' => [0, 1, 2, 4, 5],
  92. 'type' => [0, 1],
  93. ],
  94. [
  95. 'key' => 'cost_price',
  96. 'value' => '成本价',
  97. 'hidden' => false,
  98. 'selected' => 0,
  99. 'order_type' => [0],
  100. 'type' => [0],
  101. ],
  102. [
  103. 'key' => 'total_price',
  104. 'value' => '总金额',
  105. 'hidden' => false,
  106. 'selected' => 0,
  107. 'type' => [0],
  108. ],
  109. [
  110. 'key' => 'pay_price',
  111. 'value' => '实际付款',
  112. 'hidden' => false,
  113. 'selected' => 0,
  114. 'type' => [0],
  115. ],
  116. [
  117. 'key' => 'integral',
  118. 'value' => '积分',
  119. 'hidden' => false,
  120. 'selected' => 0,
  121. 'type' => [4],
  122. ],
  123. [
  124. 'key' => 'express_price',
  125. 'value' => '运费',
  126. 'hidden' => true,
  127. 'selected' => 0,
  128. 'order_type' => [0, 1, 2, 4, 5],
  129. 'type' => [0],
  130. ],
  131. [
  132. 'key' => 'express_no',
  133. 'value' => '快递单号',
  134. 'hidden' => true,
  135. 'selected' => 0,
  136. 'order_type' => [0, 1, 2, 4, 5],
  137. 'type' => [0],
  138. ],
  139. [
  140. 'key' => 'express',
  141. 'value' => '快递公司',
  142. 'hidden' => true,
  143. 'selected' => 0,
  144. 'order_type' => [0, 1, 2, 4, 5],
  145. 'type' => [0],
  146. ],
  147. [
  148. 'key' => 'clerk_name',
  149. 'value' => '核销人',
  150. 'hidden' => true,
  151. 'selected' => 0,
  152. 'type' => [0],
  153. ],
  154. [
  155. 'key' => 'shop_name',
  156. 'value' => '核销门店',
  157. 'hidden' => true,
  158. 'selected' => 0,
  159. 'type' => [0],
  160. ],
  161. [
  162. 'key' => 'created_at',
  163. 'value' => '下单时间',
  164. 'hidden' => false,
  165. 'selected' => 0,
  166. 'type' => [0],
  167. ],
  168. [
  169. 'key' => 'pay_type',
  170. 'value' => '支付方式',
  171. 'hidden' => false,
  172. 'selected' => 0,
  173. 'type' => [0],
  174. ],
  175. [
  176. 'key' => 'order_status',
  177. 'value' => '订单状态',
  178. 'hidden' => true,
  179. 'selected' => 0,
  180. 'type' => [0],
  181. ],
  182. [
  183. 'key' => 'apply_delete',
  184. 'value' => '申请状态',
  185. 'hidden' => false,
  186. 'selected' => 0,
  187. 'order_type' => [0, 1, 2, 4],
  188. 'type' => [0],
  189. ],
  190. [
  191. 'key' => 'trade_status',
  192. 'value' => '订单流转状态',
  193. 'hidden' => false,
  194. 'selected' => 0,
  195. 'type' => [0],
  196. ],
  197. [
  198. 'key' => 'status',
  199. 'value' => '拼团状态',
  200. 'hidden' => false,
  201. 'selected' => 0,
  202. 'order_type' => [2],
  203. 'type' => [0],
  204. ],
  205. [
  206. 'key' => 'is_pay',
  207. 'value' => '付款状态',
  208. 'hidden' => false,
  209. 'selected' => 0,
  210. 'type' => [0],
  211. ],
  212. [
  213. 'key' => 'pay_time',
  214. 'value' => '付款时间',
  215. 'hidden' => false,
  216. 'selected' => 0,
  217. 'type' => [0],
  218. ],
  219. [
  220. 'key' => 'send_time',
  221. 'value' => '发货时间',
  222. 'hidden' => false,
  223. 'selected' => 0,
  224. 'order_type' => [0, 1, 2, 4],
  225. 'type' => [0],
  226. ],
  227. [
  228. 'key' => 'confirm_time',
  229. 'value' => '收货时间',
  230. 'hidden' => false,
  231. 'selected' => 0,
  232. 'order_type' => [0, 1, 2, 4],
  233. 'type' => [0],
  234. ],
  235. [
  236. 'key' => 'content',
  237. 'value' => '备注/表单',
  238. 'hidden' => false,
  239. 'selected' => 0,
  240. 'type' => [0],
  241. ],
  242. [
  243. 'key' => 'words',
  244. 'value' => '买家留言',
  245. 'hidden' => false,
  246. 'selected' => 0,
  247. 'order_type' => [0, 1, 2, 4, 5],
  248. 'type' => [0],
  249. ],
  250. [
  251. 'key' => 'is_use',
  252. 'value' => '使用状态',
  253. 'hidden' => false,
  254. 'selected' => 0,
  255. 'order_type' => [3],
  256. 'type' => [0],
  257. ],
  258. [
  259. 'key' => 'use_time',
  260. 'value' => '使用时间',
  261. 'hidden' => false,
  262. 'selected' => 0,
  263. 'order_type' => [3],
  264. 'type' => [0],
  265. ],
  266. [
  267. 'key' => 'refund_type',
  268. 'value' => '售后类型',
  269. 'hidden' => false,
  270. 'selected' => 0,
  271. 'order_type' => [0, 1, 2, 4],
  272. 'type' => [1],
  273. ],
  274. [
  275. 'key' => 'refund_price',
  276. 'value' => '退款金额',
  277. 'hidden' => false,
  278. 'selected' => 0,
  279. 'order_type' => [0, 1, 2, 4],
  280. 'type' => [1],
  281. ],
  282. [
  283. 'key' => 'refund_desc',
  284. 'value' => '申请理由',
  285. 'hidden' => false,
  286. 'selected' => 0,
  287. 'order_type' => [0, 1, 2, 4],
  288. 'type' => [1],
  289. ],
  290. [
  291. 'key' => 'refund_status',
  292. 'value' => '状态',
  293. 'hidden' => false,
  294. 'selected' => 0,
  295. 'order_type' => [0, 1, 2, 4, 5],
  296. 'type' => [1],
  297. ],
  298. [
  299. 'key' => 'refund_refuse_desc',
  300. 'value' => '售后拒绝理由',
  301. 'hidden' => false,
  302. 'selected' => 0,
  303. 'order_type' => [0, 1, 2, 4],
  304. 'type' => [1],
  305. ],
  306. [
  307. 'key' => 'refund_time',
  308. 'value' => '售后申请时间',
  309. 'hidden' => false,
  310. 'selected' => 0,
  311. 'order_type' => [0, 1, 2, 4],
  312. 'type' => [1],
  313. ],
  314. [
  315. 'key' => 'user_send_express',
  316. 'value' => '用户发货快递公司',
  317. 'hidden' => false,
  318. 'selected' => 0,
  319. 'order_type' => [0, 1, 2, 4, 5],
  320. 'type' => [1],
  321. ],
  322. [
  323. 'key' => 'user_send_express_no',
  324. 'value' => '用户发货快递单号',
  325. 'hidden' => false,
  326. 'selected' => 0,
  327. 'order_type' => [0, 1, 2, 4, 5],
  328. 'type' => [1],
  329. ],
  330. [
  331. 'key' => 'rebate',
  332. 'value' => '自购返利',
  333. 'hidden' => false,
  334. 'selected' => 0,
  335. 'order_type' => [5],
  336. 'type' => [0, 1],
  337. ],
  338. [
  339. 'key' => 'share_commission_first',
  340. 'value' => '一级分销商',
  341. 'hidden' => false,
  342. 'selected' => 0,
  343. 'order_type' => [5],
  344. 'type' => [0, 1],
  345. ],
  346. [
  347. 'key' => 'share_commission_second',
  348. 'value' => '二级分销商',
  349. 'hidden' => false,
  350. 'selected' => 0,
  351. 'order_type' => [5],
  352. 'type' => [0, 1],
  353. ],
  354. [
  355. 'key' => 'share_commission_third',
  356. 'value' => '三级分销商',
  357. 'hidden' => false,
  358. 'selected' => 0,
  359. 'order_type' => [5],
  360. 'type' => [0, 1],
  361. ],
  362. [
  363. 'key' => 'merchant_remark',
  364. 'value' => '商家备注',
  365. 'hidden' => false,
  366. 'selected' => 0,
  367. 'order_type' => [0, 1, 2, 3],
  368. 'type' => [0, 1],
  369. ],
  370. ];
  371. foreach ($list as $i => $item) {
  372. if (isset($item['order_type']) && !in_array($this->order_type, $item['order_type'])) {
  373. unset($list[$i]);
  374. continue;
  375. }
  376. if (isset($item['type']) && !in_array($this->type, $item['type'])) {
  377. unset($list[$i]);
  378. continue;
  379. }
  380. }
  381. return $list;
  382. }
  383. /**
  384. * @param $data array 需要处理的数据
  385. */
  386. public function dataTransform($data)
  387. {
  388. $newFields = [];
  389. $pay_type_list = ['微信支付', '微信支付', '货到付款', '余额支付'];
  390. foreach ($this->fields as &$item) {
  391. if ($this->is_offline == 1) {
  392. if (in_array($item['key'], ['clerk_name', 'shop_name'])) {
  393. $item['selected'] = 1;
  394. }
  395. } else {
  396. if (in_array($item['key'], ['express_price', 'express_no', 'express'])) {
  397. $item['selected'] = 1;
  398. }
  399. }
  400. if (isset($item['selected']) && $item['selected'] == 1) {
  401. $newFields[$item['key']] = $item['value'];
  402. }
  403. }
  404. $newList = [];
  405. foreach ($data as $datum) {
  406. $newItem = [];
  407. $newItem['order_no'] = $datum->order_no;
  408. $newItem['nickname'] = $datum->user->nickname;
  409. $newItem['platform'] = $datum->user->platform ? '支付宝' : '微信';
  410. $newItem['total_price'] = $datum->total_price;
  411. $newItem['pay_price'] = $datum->pay_price;
  412. $newItem['pay_type'] = $pay_type_list[$datum->pay_type];
  413. $newItem['is_pay'] = $datum['is_pay'] == 1 ? "已付款" : "未付款";
  414. $newItem['created_at'] = date('Y-m-d H:i', $datum['created_at']);
  415. $newItem['pay_time'] = $datum->pay_time ? date('Y-m-d H:i', $datum->pay_time) : '';
  416. //是否到店自提 0--否 1--是
  417. if ((isset($datum['is_offline']) && $datum['is_offline']) || (isset($datum['offline']) && $datum['offline'] == 2) || $this->order_type == 3) {
  418. $newItem['clerk_name'] = $datum->clerk ? $datum->clerk->nickname : '';
  419. $newItem['shop_name'] = $datum->shop ? $datum->shop->name : '';
  420. } else {
  421. $newItem['express_price'] = $datum->express_price;
  422. $newItem['express_no'] = $datum->express_no;
  423. $newItem['express'] = $datum->express;
  424. }
  425. $newItem['name'] = $datum->name;
  426. $newItem['mobile'] = $datum->mobile;
  427. $newItem['address'] = $datum->address;
  428. $newItem['apply_delete'] = ($datum['apply_delete'] == Order::ORDER_APPLY_DELETE) ? ($datum['trade_status'] == Order::ORDER_FLOW_CANCEL || $datum['is_delete'] == Order::IS_DELETE_TRUE ? '取消成功' : '取消中') : "无";
  429. $newItem['trade_status'] = OrderStateFlow::getFlowWords($datum['trade_status']);
  430. $newItem['send_time'] = $datum->send_time ? date('Y-m-d H:i', $datum->send_time) : '';
  431. $newItem['confirm_time'] = $datum->confirm_time ? date('Y-m-d H:i', $datum->confirm_time) : '';
  432. $newItem['words'] = isset($datum->words) ? $datum->words : '';
  433. $newItem['goods_list'] = $this->getOrderGoodsList($datum->id);
  434. if ($datum->orderForm) {
  435. $str = '';
  436. foreach ($datum->orderForm as $key => $item) {
  437. $str .= $item['key'] . ':' . $item['value'] . ',';
  438. }
  439. $newItem['content'] = rtrim($str, ',');
  440. } else {
  441. $newItem['content'] = $datum->content;
  442. }
  443. $newList[] = $newItem;
  444. }
  445. Export::order_3($newList, $newFields);
  446. }
  447. // 商城订单详情
  448. private function getOrderGoodsList($order_id)
  449. {
  450. $orderDetailList = OrderDetail::find()->alias('od')
  451. ->leftJoin(['g' => Goods::tableName()], 'od.goods_id=g.id')
  452. ->where([
  453. 'od.is_delete' => 0,
  454. 'od.order_id' => $order_id,
  455. ])->select(['od.*', 'g.name', 'g.unit', 'g.attr goods_attr'])->asArray()->all();
  456. foreach ($orderDetailList as $i => &$item) {
  457. $item['attr_list'] = Json::decode($item['attr']);
  458. $item['good_no'] = $this->getGoodNo($item['attr_list'], $item['goods_attr']);
  459. }
  460. return $orderDetailList;
  461. }
  462. public function shareExportData($data, $field)
  463. {
  464. $newData = [];
  465. foreach ($data as $item) {
  466. $d = [];
  467. $d['order_no'] = $item['order_no'];
  468. $d['nickname'] = $item['nickname'];
  469. $d['price'] = $item['price'];
  470. $d['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  471. $d['bank_name'] = $item['bank_name'];
  472. $d['name'] = $item['name'];
  473. $d['pay_type'] = $item['pay_type'];
  474. $d['platform'] = $item['platform'] ? '支付宝' : '微信';
  475. $d['bank_card'] = $item['mobile'];
  476. $d['pay_time'] = isset($item['pay_time']) ? date('Y-m-d H:i:s', $item['pay_time']) : '';
  477. switch ($item['pay_type']) {
  478. case 0:
  479. $d['pay_type'] = '待打款';
  480. break;
  481. case 1:
  482. $d['pay_type'] = '微信自动打款';
  483. break;
  484. case 2:
  485. $d['pay_type'] = '手动打款';
  486. break;
  487. default:
  488. $d['pay_type'] = '未知';
  489. break;
  490. }
  491. switch ($item['type']) {
  492. case 0:
  493. $d['type'] = '微信支付';
  494. break;
  495. case 1:
  496. $d['type'] = '支付宝支付';
  497. break;
  498. case 2:
  499. $d['type'] = '银行卡';
  500. break;
  501. case 3:
  502. $d['type'] = '余额';
  503. break;
  504. default:
  505. $d['type'] = '未知';
  506. break;
  507. }
  508. $newData[] = $d;
  509. }
  510. $newFields = [];
  511. foreach ($field as $item) {
  512. if ($item['selected']) {
  513. $newFields[$item['key']] = $item['value'];
  514. }
  515. }
  516. Export::order_3($newData, $newFields);
  517. }
  518. /**
  519. * 分销订单导出
  520. */
  521. public function shareOrderExportData($sql)
  522. {
  523. $handle = fopen('php://temp', 'rwb');
  524. $newFields = [];
  525. foreach ((array)$this->fields as $item) {
  526. if (isset($item['selected']) && $item['selected'] == 1) {
  527. $newFields[$item['key']] = $item['value'];
  528. }
  529. }
  530. $EXCEL_OUT = Export::order_title($newFields);
  531. fwrite($handle, $EXCEL_OUT);
  532. $limit = 1000;
  533. $count = \Yii::$app->db->createCommand("select count(*) " . $sql)->queryScalar();
  534. $select = "SELECT `al`.*,u.nickname,u.platform ";
  535. for ($i = 0; $i < $count; $i += $limit) {
  536. $list = \Yii::$app->db->createCommand($select . $sql . " ORDER BY created_at DESC LIMIT {$limit} OFFSET {$i}")->queryAll();
  537. $shareOrderForm = new ShareOrderForm();
  538. $shareOrderForm->store_id = get_store_id();
  539. $data = $shareOrderForm->transform($list);
  540. $pay_type_list = ['微信支付', '微信支付', '货到付款', '余额支付'];
  541. foreach ((array)$this->fields as &$item) {
  542. if ($this->is_offline == 1) {
  543. if (in_array($item['key'], ['clerk_name', 'shop_name'])) {
  544. $item['selected'] = 1;
  545. }
  546. } else {
  547. if (in_array($item['key'], ['express_price', 'express_no', 'express'])) {
  548. $item['selected'] = 1;
  549. }
  550. }
  551. if (isset($item['selected']) && $item['selected'] == 1) {
  552. $newFields[$item['key']] = $item['value'];
  553. }
  554. }
  555. $newList = [];
  556. foreach ($data as $datum) {
  557. $newItem = [];
  558. $newItem['order_no'] = $datum['order_no'];
  559. $newItem['nickname'] = $datum['nickname'];
  560. $newItem['platform'] = $datum['platform'] ? '支付宝' : '微信';
  561. $newItem['total_price'] = $datum['total_price'];
  562. $newItem['pay_price'] = $datum['pay_price'];
  563. $newItem['pay_type'] = $pay_type_list[$datum['pay_type']];
  564. $newItem['is_pay'] = $datum['is_pay'] == 1 ? "已付款" : "未付款";
  565. $newItem['created_at'] = $datum['created_at'];
  566. $newItem['pay_time'] = $datum['pay_time'] > 0 ? date('Y-m-d H:i:s', $datum['pay_time']) : '';
  567. $newItem['platform'] = $datum['platform'] ? '支付宝' : '微信';
  568. $newItem['express_price'] = $datum['express_price'];
  569. $newItem['name'] = $datum['name'];
  570. $newItem['mobile'] = $datum['mobile'];
  571. $newItem['address'] = $datum['address'];
  572. $newItem['express_no'] = $datum['express_no'];
  573. $newItem['express'] = $datum['express'];
  574. $newItem['goods_list'] = $datum['goods_list'];
  575. $newItem['words'] = $datum['words'];
  576. $newItem['remark'] = $datum['remark'];
  577. $newItem['rebate'] = $datum['rebate'];
  578. $share = isset($datum['share']) ? '昵称:' . $datum['share']['nickname'] . ',姓名:' . $datum['share']['name'] . ',手机号:' . $datum['share']['mobile'] . ',佣金:' . floatval($datum['first_price']) . '|' : '';
  579. if ($share) {
  580. $newItem['share_commission_first'] = $share;
  581. }
  582. $share1 = isset($datum['share_1']) ? '昵称:' . $datum['share_1']['nickname'] . ',姓名:' . $datum['share_1']['name'] . ',手机号:' . $datum['share_1']['mobile'] . ',佣金:' . floatval($datum['second_price']) . '|' : '';
  583. if ($share1) {
  584. $newItem['share_commission_second'] = $share1;
  585. }
  586. $share2 = isset($datum['share_2']) ? '昵称:' . $datum['share_2']['nickname'] . ',姓名:' . $datum['share_2']['name'] . ',手机号:' . $datum['share_2']['mobile'] . ',佣金:' . floatval($datum['third_price']) . '|' : '';
  587. if ($share2) {
  588. $newItem['share_commission_third'] = $share2;
  589. }
  590. $newList[] = $newItem;
  591. }
  592. $EXCEL_OUT = Export::order_new($newList, $newFields);
  593. fwrite($handle, $EXCEL_OUT);
  594. }
  595. $name = date('YmdHis', time()) . rand(1000, 9999); //导出文件名称
  596. \Yii::$app->response->sendStreamAsFile($handle, $name . '.csv');
  597. }
  598. /**
  599. * 用户信息导出
  600. */
  601. public function UserExportData($list)
  602. {
  603. $handle = fopen('php://temp', 'rwb');
  604. $newFields = $this->dataFields();
  605. $newFields['platform'] = '所属平台';
  606. $fieldVals = implode(',', array_values($newFields)) . "\n";
  607. $EXCEL_OUT = mb_convert_encoding($fieldVals, 'GBK', 'UTF-8');
  608. fwrite($handle, $EXCEL_OUT);
  609. foreach ($list as $item) {
  610. $arr = [];
  611. $arr['id'] = $item['id'];
  612. $arr['open_id'] = trim("\"\t" . $item['wechat_open_id'] . "\"");
  613. $arr['nickname'] = $item['nickname'];
  614. $arr['binding'] = $item['binding'];
  615. $arr['contact_way'] = $item['contact_way'];
  616. $arr['comments'] = $item['comments'];
  617. $arr['created_at'] = trim("\"\t" . date('Y-m-d H:i:s', $item['created_at']) . "\"");
  618. $clerk = $item['is_clerk'] ? '核销员|' : '';
  619. $level = isset($item['l_name']) ? $item['l_name'] : '普通会员';
  620. $arr['identity'] = $clerk . $level;
  621. $arr['order_count'] = $item['order_count'] ? $item['order_count'] : 0;
  622. $order = empty($item['orderConsume']) ? 0 : floatval($item['orderConsume']);
  623. $pt = empty($item['ptOrderConsume']) ? 0 : floatval($item['ptOrderConsume']);
  624. $yy = empty($item['yyOrderConsume']) ? 0 : floatval($item['yyOrderConsume']);
  625. $ms = empty($item['msOrderConsume']) ? 0 : floatval($item['msOrderConsume']);
  626. $integral = empty($item['integralOrderConsume']) ? 0 : floatval($item['integralOrderConsume']);
  627. $arr['consume_count'] = $order + $pt + $yy + $ms + $integral;
  628. $arr['coupon_count'] = $item['coupon_count'] ? $item['coupon_count'] : 0;
  629. $arr['card_count'] = $item['card_count'] ? $item['card_count'] : 0;
  630. $arr['integral'] = $item['integral'];
  631. $arr['money'] = $item['money'];
  632. $arr['platform'] = $item['platform'] ? '支付宝' : '微信';
  633. $fieldVals = implode(',', array_values($arr)) . "\n";
  634. $EXCEL_OUT = mb_convert_encoding($fieldVals, 'GBK', 'UTF-8');
  635. fwrite($handle, $EXCEL_OUT);
  636. }
  637. $name = date('YmdHis', time()) . rand(1000, 9999); //导出文件名称
  638. \Yii::$app->response->sendStreamAsFile($handle, $name . '.csv');
  639. // Export::order_3($newList, $newFields);
  640. }
  641. /**
  642. * 分销信息导出
  643. */
  644. public function ShareInfoExportData($list)
  645. {
  646. $newFields = $this->dataFields();
  647. $newList = [];
  648. foreach ($list as $item) {
  649. $arr = [];
  650. $arr['id'] = $item['id'];
  651. $arr['nickname'] = $item['nickname'];
  652. $arr['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  653. $arr['time'] = date('Y-m-d H:i:s', $item['time']);
  654. $arr['name'] = $item['name'];
  655. $arr['mobile'] = $item['mobile'];
  656. $arr['platform'] = $item['platform'] ? '支付宝' : '微信';
  657. $arr['total_price'] = $item['total_price'];
  658. $arr['price'] = $item['price'];
  659. $arr['parent_nickname'] = $item['parent_nickname'] ? $item['parent_nickname'] : '总店';
  660. $arr['seller_comments'] = $item['seller_comments'];
  661. switch ($item['status']) {
  662. case 0:
  663. $arr['status'] = '待审核';
  664. break;
  665. case 1:
  666. $arr['status'] = '审核通过';
  667. break;
  668. case 2:
  669. $arr['status'] = '审核未通过';
  670. break;
  671. default:
  672. $arr['status'] = '未知';
  673. break;
  674. }
  675. $arr['lower_user'] = '一级:' . $item['first'] . '| 二级:' . $item['second'] . '| 三级:' . $item['third'];
  676. $order = $item['order_count'] ? $item['order_count'] : 0;
  677. $ms = $item['ms_order_count'] ? $item['ms_order_count'] : 0;
  678. $pt = $item['pt_order_count'] ? $item['pt_order_count'] : 0;
  679. $yy = $item['yy_order_count'] ? $item['yy_order_count'] : 0;
  680. $arr['order'] = '商城订单:' . $order . '| 秒杀订单:' . $ms . '| 拼团订单:' . $pt . '| 预约订单:' . $yy;
  681. $newList[] = $arr;
  682. }
  683. Export::order_3($newList, $newFields);
  684. }
  685. /**
  686. * 分销信息导出
  687. */
  688. public function MchReportFormsExportData($list)
  689. {
  690. $newFields = $this->dataFields();
  691. $newList = [];
  692. foreach ($list as $item) {
  693. $arr = [];
  694. $arr['id'] = $item['id'];
  695. $arr['name'] = $item['name'];
  696. $arr['good_name'] = $item['good_name'];
  697. $arr['sales_volume'] = $item['sales_volume'];
  698. $arr['sales_price'] = $item['sales_price'];
  699. $newList[] = $arr;
  700. }
  701. Export::dataNew($newList, $newFields);
  702. }
  703. /**
  704. * 售后订单导出 数据处理
  705. */
  706. public function refundForm($data)
  707. {
  708. $newFields = [];
  709. foreach ($this->fields as $item) {
  710. if (isset($item['selected']) && $item['selected'] == 1) {
  711. $newFields[$item['key']] = $item['value'];
  712. }
  713. }
  714. $newList = [];
  715. foreach ($data as $item) {
  716. $newItem = $item;
  717. $goods_no = $this->getGoodNo(Json::decode($item['attr']), $item['goods_attr']);
  718. $newItem['goods_list'] = [
  719. [
  720. 'name' => $item['goods_name'],
  721. 'attr' => $item['attr'],
  722. 'good_num' => $item['num'],
  723. 'good_no' => $goods_no,
  724. ]
  725. ];
  726. switch ($item['refund_type']) {
  727. case 1:
  728. $newItem['refund_type'] = "退货退款";
  729. break;
  730. case 2:
  731. $newItem['refund_type'] = "换货";
  732. break;
  733. default:
  734. $newItem['refund_type'] = "";
  735. break;
  736. }
  737. switch ($item['refund_status']) {
  738. case 0:
  739. $newItem['refund_status'] = "待处理";
  740. break;
  741. case 1:
  742. $newItem['refund_status'] = "已同意退款退货";
  743. break;
  744. case 2:
  745. $newItem['refund_status'] = "已同意换";
  746. break;
  747. case 3:
  748. $newItem['refund_status'] = "已拒绝";
  749. break;
  750. default:
  751. $newItem['refund_status'] = "";
  752. break;
  753. }
  754. $newItem['refund_time'] = date('Y-m-d H:i', $item['created_at']);
  755. $newList[] = $newItem;
  756. }
  757. Export::order_3($newList, $newFields);
  758. }
  759. private function getGoodNo($attr, $goods_attr)
  760. {
  761. $good_no = '';
  762. if (!$goods_attr) {
  763. return $good_no;
  764. }
  765. $ok = false;
  766. $attr_id_list = [];
  767. foreach ($attr as $item) {
  768. $attr_id_list[] = intval($item['attr_id']);
  769. if (isset($item['no'])) {
  770. $good_no = $item['no'];
  771. $ok = true;
  772. break;
  773. }
  774. }
  775. if (!$ok) {
  776. sort($attr_id_list);
  777. $attr_rows = json_decode($goods_attr, true);
  778. if (empty($attr_rows)) {
  779. $good_no = '';
  780. }
  781. foreach ($attr_rows as $i => $attr_row) {
  782. $key = [];
  783. foreach ($attr_row['attr_list'] as $j => $attr) {
  784. $key[] = $attr['attr_id'];
  785. }
  786. sort($key);
  787. if (!array_diff($attr_id_list, $key)) {
  788. if ($attr_row['no']) {
  789. $good_no = $attr_row['no'];
  790. }
  791. }
  792. }
  793. }
  794. return $good_no;
  795. }
  796. public function dataTransform_new($query)
  797. {
  798. $handle = fopen('php://temp', 'rwb');
  799. $newFields = $this->dataFields();
  800. $EXCEL_OUT = Export::order_title($newFields);
  801. fwrite($handle, $EXCEL_OUT);
  802. $limit = 100;
  803. $count = $query->count();
  804. for ($i = 0; $i < $count; $i += $limit) {
  805. $query->select('o.*');
  806. $query->with(['user', 'clerk', 'shop', 'orderDetail', 'orderForm']);
  807. $data = $query->limit($limit)->offset($i)->orderBy('o.created_at DESC')->asArray()->all();
  808. $data = $this->data_new($data);
  809. $EXCEL_OUT = Export::order_new($data, $newFields);
  810. fwrite($handle, $EXCEL_OUT);
  811. }
  812. $name = date('YmdHis', time()) . rand(1000, 9999); //导出文件名称
  813. \Yii::$app->response->sendStreamAsFile($handle, $name . '.csv');
  814. }
  815. // 获取需要导出的字段
  816. private function dataFields()
  817. {
  818. $newFields = [];
  819. foreach ($this->fields as &$item) {
  820. if ($this->is_offline == 1) {
  821. if (in_array($item['key'], ['clerk_name', 'shop_name'])) {
  822. $item['selected'] = 1;
  823. }
  824. } else {
  825. if (in_array($item['key'], ['express_price', 'express_no', 'express'])) {
  826. $item['selected'] = 1;
  827. }
  828. }
  829. if (isset($item['selected']) && $item['selected'] == 1) {
  830. $newFields[$item['key']] = $item['value'];
  831. }
  832. }
  833. return $newFields;
  834. }
  835. /**
  836. * @param $data array 需要处理的数据 临时处理
  837. */
  838. private function data_new(&$data)
  839. {
  840. $pay_type_list = ['微信支付', '微信支付', '货到付款', '余额支付'];
  841. $newList = [];
  842. foreach ($data as &$datum) {
  843. $newItem = [];
  844. $newItem['order_no'] = $datum['order_no'];
  845. $newItem['nickname'] = $datum['user']['nickname'];
  846. // $newItem['platform'] = $datum->user['platform'] ? '支付宝' : '微信';
  847. $costPriceCount = 0;
  848. if ($datum['orderDetail']) {
  849. foreach ($datum['orderDetail'] as $item) {
  850. $costPriceCount += isset($item['cost_price']) ? $item['cost_price'] * $item['num'] : 0;
  851. }
  852. }
  853. $newItem['cost_price'] = $costPriceCount;
  854. $newItem['total_price'] = $datum['total_price'];
  855. $newItem['pay_price'] = $datum['pay_price'];
  856. $newItem['pay_type'] = $pay_type_list[$datum['pay_type']];
  857. $newItem['is_pay'] = $datum['is_pay'] == 1 ? "已付款" : "未付款";
  858. $newItem['created_at'] = date('Y-m-d H:i', $datum['created_at']);
  859. $newItem['pay_time'] = $datum['pay_time'] ? date('Y-m-d H:i', $datum['pay_time']) : '';
  860. $newItem['merchant_remark'] = $datum['seller_comments'];
  861. //是否到店自提 0--否 1--是
  862. if ((isset($datum['is_offline']) && $datum['is_offline']) || (isset($datum['offline']) && $datum['offline'] == 2) || $this->order_type == 3) {
  863. $newItem['clerk_name'] = $datum['clerk'] ? $datum['clerk']['nickname'] : '';
  864. $newItem['shop_name'] = $datum['shop'] ? $datum['shop']['name'] : '';
  865. } else {
  866. $newItem['express_price'] = $datum['express_price'];
  867. $newItem['express_no'] = $datum['express_no'];
  868. $newItem['express'] = $datum['express'];
  869. }
  870. if ($datum['trade_status'] == Order::ORDER_FLOW_CANCEL) {
  871. $newItem['order_status'] = '订单已取消';
  872. } else {
  873. $orderRefund = OrderRefund::find()->where(['order_id' => $datum['id']])
  874. ->select('status')->one();
  875. if ($orderRefund) {
  876. switch ($orderRefund->status) {
  877. case 0:
  878. $newItem['order_status'] = '待商家处理';
  879. break;
  880. case 1:
  881. $newItem['order_status'] = '同意并已退款';
  882. break;
  883. case 2:
  884. $newItem['order_status'] = '已同意换货';
  885. break;
  886. case 3:
  887. $newItem['order_status'] = '已拒绝换货';
  888. break;
  889. default:
  890. $newItem['order_status'] = '待处理';
  891. break;
  892. }
  893. } else {
  894. // $newItem['order_status'] = '订单已完成';
  895. $newItem['order_status'] = $datum['trade_status'] == Order::ORDER_FLOW_CONFIRM ? '已完成' : '进行中';
  896. }
  897. }
  898. $newItem['name'] = $datum['name'];
  899. $newItem['mobile'] = $datum['mobile'];
  900. $newItem['address'] = $datum['address'];
  901. $newItem['send_time'] = $datum['send_time'] ? date('Y-m-d H:i', $datum['send_time']) : '';
  902. $newItem['confirm_time'] = $datum['confirm_time'] ? date('Y-m-d H:i', $datum['confirm_time']) : '';
  903. $newItem['words'] = isset($datum['words']) ? $datum['words'] : '';
  904. $newItem['apply_delete'] = ($datum['apply_delete'] == Order::ORDER_APPLY_DELETE) ? ($datum['trade_status'] == Order::ORDER_FLOW_CANCEL || $datum['is_delete'] == Order::IS_DELETE_TRUE ? '取消成功' : '取消中') : "无";
  905. $newItem['trade_status'] = OrderStateFlow::getFlowWords($datum['trade_status']);
  906. $newItem['goods_list'] = $this->getOrderGoodsListNew($datum['orderDetail']);
  907. if ($datum['orderForm']) {
  908. $str = '';
  909. foreach ($datum['orderForm'] as $key => $item) {
  910. $str .= $item['key'] . ':' . $item['value'] . ',';
  911. }
  912. $newItem['content'] = rtrim($str, ',');
  913. } else {
  914. $newItem['content'] = $datum['content'];
  915. }
  916. $newList[] = $newItem;
  917. }
  918. return $newList;
  919. }
  920. /**
  921. * 拼团订单详情
  922. */
  923. private function getOrderGoodsListNew($list)
  924. {
  925. foreach ($list as $i => $order_detail) {
  926. $list[$i]['attr_list'] = Json::decode($order_detail['attr']);
  927. $list[$i]['good_no'] = $this->getGoodNo($list[$i]['attr_list'], $order_detail['goods_attr']);
  928. }
  929. return $list;
  930. }
  931. }