Export.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  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\Mch;
  9. use app\models\Order;
  10. use app\models\OrderForm;
  11. use app\models\Shop;
  12. use app\models\User;
  13. use yii\data\Pagination;
  14. class Export
  15. {
  16. /**
  17. * excel导出
  18. */
  19. const EXPORT = 'EXPORT';
  20. //导出 header
  21. public static function exportHeader($EXCEL_OUT)
  22. {
  23. header("Content-type:text/csv");
  24. header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
  25. header('Expires:0');
  26. header('Pragma:public');
  27. echo $EXCEL_OUT;
  28. }
  29. //判断是否含有英文逗号,英文引号
  30. public static function Check($str)
  31. {
  32. $str = str_replace(array("\r\n", "\r", "\n"), "", $str);
  33. if (strpos($str, ',')) {
  34. if (strpos($str, "\"") || strpos($str, "\"") == 0) {
  35. $str = str_replace("\"", "\"\"", $str);
  36. }
  37. $str = "\"" . $str . "\"";
  38. } else {
  39. $str = "\"\t" . $str . "\"";
  40. }
  41. return $str;
  42. }
  43. /**
  44. * @param $info
  45. * 导出订单
  46. */
  47. public static function order($info)
  48. {
  49. $title = "序号,订单号,用户,商品名,商品信息,收件人,电话,地址,总金额(含运费),运费,实际付款,付款状态,申请状态,订单状态,快递单号,快递公司,下单时间";
  50. $title .= "\n";
  51. $EXCEL_OUT = mb_convert_encoding($title, 'GBK', 'UTF-8');
  52. foreach ($info as $index => $value) {
  53. $out = array();
  54. $out[] = $index + 1;
  55. $out[] = trim("\"\t" . $value['order_no'] . "\"");
  56. $out[] = trim(self::Check($value['nickname']));
  57. $goodsName = "";//商品名
  58. $goods_str = "";//商品信息
  59. foreach ($value['goods_list'] as $i => $v) {
  60. $goodsName .= "商品名:" . $v['name'];
  61. $attr_list = json_decode($v['attr']);
  62. if (is_array($attr_list)) {
  63. foreach ($attr_list as $attr) {
  64. $goods_str .= $attr->attr_group_name . ":" . $attr->attr_name . ",";
  65. }
  66. }
  67. $goods_str .= "数量:" . $v['num'] . $v['unit'] . ",";
  68. $goods_str .= "小计:" . $v['total_price'] . "元";
  69. $goods_str .= ";";
  70. }
  71. $out[] = self::Check($goodsName);
  72. $out[] = self::Check($goods_str);
  73. $out[] = self::Check($value['name']);
  74. $out[] = trim("\"\t" . $value['mobile'] . "\"");
  75. $out[] = self::Check($value['address']);
  76. $out[] = $value['total_price'] . "元";
  77. $out[] = $value['express_price'] . "元";
  78. $out[] = $value['pay_price'] . "元";
  79. $out[] = ($value['is_pay'] == 1) ? "已付款" : "未付款";
  80. $out[] = ($value['apply_delete'] == Order::ORDER_APPLY_DELETE) ? "取消中" : "无";
  81. $out[] = OrderStateFlow::getFlowWords($value['trade_status']);
  82. $out[] = self::Check($value['express_no']);
  83. $out[] = self::Check($value['express']);
  84. $out[] = trim("\"\t" . date('Y-m-d H:i', $value['created_at']) . "\"");
  85. // $EXCEL_OUT .= iconv('UTF-8', 'GB2312', implode($out,',')."\n");
  86. $EXCEL_OUT .= mb_convert_encoding(implode(',', $out) . "\n", 'GB2312', 'UTF-8');//需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  87. }
  88. $name = "订单导出-" . date('YmdHis', time());//导出文件名称
  89. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  90. self::exportHeader($EXCEL_OUT);
  91. exit();
  92. }
  93. /**
  94. * 约定字段名称
  95. * =============
  96. * num 编号(编号后端添加、前端不需要传)
  97. * platform 所属平台(编号后端添加、前端不需要传)
  98. * good_name 商品名称
  99. * attr 商品规格
  100. * good_num 商品数量
  101. * clerk_name 核销员名称
  102. * shop_name 核销门店名称
  103. * pay_price 实际付款
  104. * ==============
  105. * csv导出
  106. * @param array $data 导出的数据
  107. * @param array $fields 表头字段名
  108. */
  109. public static function order_3(array $data, array $fields)
  110. {
  111. $fields = array_merge(['num' => '序号', 'platform' => '所属平台'], $fields);
  112. $fieldVals = implode(',', array_values($fields)) . "\n";
  113. $EXCEL_OUT = mb_convert_encoding($fieldVals, 'GBK', 'UTF-8');
  114. $num = 1;
  115. foreach ($data as $dataK => $dataV) {
  116. $export = new Export();
  117. $arr = ['good_name', 'attr', 'good_num', 'good_no'];
  118. if ($export->arrayExists($arr, $fields)) {
  119. foreach ($dataV['goods_list'] as $goodK => $goodV) {
  120. $outData = [];
  121. $goods_str = "";//商品规格
  122. $dataV['num'] = $num;
  123. $num++;
  124. $dataV['good_name'] = $goodV['name'];
  125. if (isset($goodV['total_price'])) {
  126. $dataV['pay_price'] = round($goodV['total_price'], 2);
  127. }
  128. if (isset($goodV['attr'])) {
  129. $attrList = json_decode($goodV['attr']);
  130. if (is_array($attrList)) {
  131. foreach ($attrList as $item) {
  132. $goods_str .= $item->attr_group_name . ":" . $item->attr_name . ',';
  133. }
  134. }
  135. $dataV['attr'] = rtrim($goods_str);
  136. $dataV['good_num'] = $goodV['num'];
  137. $dataV['good_no'] = $goodV['good_no'];
  138. }
  139. foreach ($fields as $fieldK => $fieldV) {
  140. if (in_array($fieldK, ['pay_price', 'total_price', 'express_price'])) {
  141. $outData[] = $dataV[$fieldK];
  142. } else {
  143. $outData[] = trim(self::Check($dataV[$fieldK]));
  144. }
  145. }
  146. //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  147. $EXCEL_OUT .= mb_convert_encoding(implode(',', $outData) . "\n", 'GBK', 'UTF-8');
  148. }
  149. } else {
  150. $outData = [];
  151. $dataV['num'] = $num;
  152. $num++;
  153. foreach ($fields as $fieldK => $fieldV) {
  154. $outData[] = trim(self::Check($dataV[$fieldK]));
  155. }
  156. //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  157. $EXCEL_OUT .= mb_convert_encoding(implode(',', $outData) . "\n", 'GBK', 'UTF-8');
  158. }
  159. }
  160. $name = date('YmdHis', time());//导出文件名称
  161. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  162. self::exportHeader($EXCEL_OUT);
  163. exit();
  164. }
  165. /**
  166. * @param array $data 需要比对的字段数组
  167. * @param array $fields
  168. * @return bool
  169. */
  170. private function arrayExists(array $data, array $fields)
  171. {
  172. foreach ($data as $datum) {
  173. if (array_key_exists($datum, $fields)) {
  174. return true;
  175. }
  176. }
  177. return false;
  178. }
  179. public static function order_2($info, $is_offline = null, $order_type = 0)
  180. {
  181. $title = "序号,订单号,用户,商品名,规格,数量,收件人,电话,地址";
  182. if ($is_offline) {
  183. $title .= ",总金额,核销人,核销门店";
  184. } else {
  185. $title .= ",总金额(含运费),运费,运费快递单号,快递公司";
  186. }
  187. $title .= ",实际付款,付款状态,申请状态,订单状态,下单时间,备注";
  188. if ($order_type == 2) {
  189. $title .= ",拼团状态";
  190. }
  191. $title .= "\n";
  192. $EXCEL_OUT = mb_convert_encoding($title, 'GBK', 'UTF-8');
  193. $count = 1;
  194. foreach ($info as $index => $value) {
  195. $order_form = OrderForm::findAll(['store_id' => $value['store_id'], 'order_id' => $value['id'], 'is_delete' => 0]);
  196. if ($is_offline) {
  197. $clerk = User::findOne(['id' => $value['clerk_id']]);
  198. $shop = Shop::findOne(['id' => $value['shop_id']]);
  199. } else {
  200. $clerk = new User();
  201. $shop = new Shop();
  202. }
  203. foreach ($value['goods_list'] as $i => $v) {
  204. // $price = round($v['total_price'] * $value['pay_price'] / ($value['total_price'] - $value['express_price']), 2);
  205. $goods_str = "";//规格
  206. $out = array();
  207. $out[] = $count;
  208. $count++;
  209. $out[] = trim("\"\t" . $value['order_no'] . "\"");
  210. $out[] = trim(self::Check($value['nickname']));
  211. $out[] = trim(self::Check($v['name']));
  212. $attr_list = json_decode($v['attr']);
  213. if (is_array($attr_list)) {
  214. foreach ($attr_list as $attr) {
  215. $goods_str .= $attr->attr_group_name . ":" . $attr->attr_name . ',';
  216. }
  217. }
  218. $out[] = self::Check($goods_str);
  219. $out[] = $v['num'] . $v['unit'];
  220. $out[] = self::Check($value['name']);
  221. $out[] = trim("\"\t" . $value['mobile'] . "\"");
  222. $out[] = self::Check($value['address']);
  223. $out[] = $value['total_price'] . "元";
  224. if ($is_offline) {
  225. $out[] = $clerk->nickname;
  226. $out[] = $shop->name;
  227. } else {
  228. $out[] = $value['express_price'] . "元";
  229. $out[] = trim(self::Check($value['express_no']));
  230. $out[] = self::Check($value['express']);
  231. }
  232. $out[] = round(min($v['total_price'], ($value['pay_price'] - $value['express_price'])), 2) . "元";
  233. $out[] = ($value['is_pay'] == 1) ? "已付款" : "未付款";
  234. $out[] = ($value['apply_delete'] == Order::ORDER_APPLY_DELETE) ? "取消中" : "无";
  235. $out[] = OrderStateFlow::getFlowWords($value['trade_status']);
  236. $out[] = trim("\"\t" . date('Y-m-d H:i', $value['created_at']) . "\"");
  237. if ($order_form) {
  238. $str = '';
  239. foreach ($order_form as $key => $item) {
  240. $str .= $item['key'] . ':' . $item['value'] . ',';
  241. }
  242. $content = self::Check($str);
  243. } else {
  244. $content = self::Check($value['content']);
  245. }
  246. $out[] = $content;
  247. if ($order_type == 2) {
  248. $status = ['', '待付款', '拼团中', '拼团成功', '拼团失败'];
  249. $out[] = $status[$value['status']];
  250. }
  251. $EXCEL_OUT .= mb_convert_encoding(implode(',', $out) . "\n", 'GBK', 'UTF-8');//需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  252. }
  253. // $EXCEL_OUT .= iconv('UTF-8', 'GB2312', implode($out,',')."\n");
  254. }
  255. $name = "订单导出-" . date('YmdHis', time());//导出文件名称
  256. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  257. self::exportHeader($EXCEL_OUT);
  258. exit();
  259. }
  260. /**
  261. * @param $info
  262. * 导出售后订单
  263. */
  264. public static function refund($info)
  265. {
  266. $title = "序号,订单号,用户,商品信息,收件人,电话,地址,售后类型,退款金额,申请理由,状态,售后申请时间";
  267. $title .= "\n";
  268. $EXCEL_OUT = mb_convert_encoding($title, 'GBK', 'UTF-8');
  269. foreach ($info as $index => $value) {
  270. $out = array();
  271. $out[] = $index + 1;
  272. $out[] = trim("\"\t" . $value['order_no'] . "\"");
  273. $out[] = trim("\"\t" . $value['nickname'] . "\"");
  274. $goods_str = "";//商品信息
  275. $goods_str .= "商品名:" . $value['goods_name'];
  276. $attr_list = json_decode($value['attr']);
  277. if (is_array($attr_list)) {
  278. foreach ($attr_list as $attr) {
  279. $goods_str .= "," . $attr->attr_group_name . ":" . $attr->attr_name;
  280. }
  281. }
  282. $goods_str .= ",数量:" . $value['num'] . "件,";
  283. $goods_str .= "金额:" . $value['total_price'] . "元";
  284. $out[] = self::Check($goods_str);
  285. $out[] = self::Check($value['name']);
  286. $out[] = trim("\"\t" . $value['mobile'] . "\"");
  287. $out[] = self::Check($value['address']);
  288. if ($value['refund_type'] == 1) {
  289. $out[] = "退货退款";
  290. $out[] = $value['refund_price'] . "元";
  291. $out[] = self::check($value['refund_desc']);
  292. } elseif ($value['refund_type'] == 2) {
  293. $out[] = "换货";
  294. $out[] = $value['refund_price'] . "元";
  295. $out[] = self::check($value['refund_desc']);
  296. }
  297. if ($value['refund_status'] == 0) {
  298. $out[] = "待处理";
  299. } elseif ($value['refund_status'] == 1) {
  300. $out[] = "已同意退款退货";
  301. } elseif ($value['refund_status'] == 2) {
  302. $out[] = "已同意换";
  303. } elseif ($value['refund_status'] == 3) {
  304. if ($value['refund_type'] == 1) {
  305. $str = "已拒绝退货退款";
  306. } else {
  307. $str = "已拒换货";
  308. }
  309. $out[] = self::Check($str . ",拒绝理由:" . $value['refund_refuse_desc']);
  310. }
  311. $out[] = trim("\"\t" . date('Y-m-d H:i', $value['created_at']) . "\"");
  312. // $EXCEL_OUT .= iconv('UTF-8', 'GB2312', implode($out,',')."\n");
  313. $EXCEL_OUT .= mb_convert_encoding(implode(',', $out) . "\n", 'GB2312', 'UTF-8');
  314. }
  315. $name = "售后订单导出-" . date('YmdHis', time());//导出文件名称
  316. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  317. self::exportHeader($EXCEL_OUT);
  318. exit();
  319. }
  320. /**
  321. * @param $info
  322. * 导出模板订单
  323. */
  324. public static function shipModel()
  325. {
  326. $title = "序号(可不填),订单号,快递单号";
  327. $title .= "\n";
  328. $EXCEL_OUT = iconv('UTF-8', 'GB2312', $title);
  329. $info = array();
  330. foreach ($info as $index => $value) {
  331. $out = array();
  332. $out[] = $index + 1;
  333. $out[] = trim("\"\t" . $value['order_no'] . "\"");
  334. $out[] = trim("\"\t" . $value['express_no'] . "\"");
  335. $EXCEL_OUT .= mb_convert_encoding(implode(',', $out) . "\n", 'GB2312', 'UTF-8'); //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  336. }
  337. $name = "" . date('YmdHis', time()); //导出文件名称
  338. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  339. self::exportHeader($EXCEL_OUT);
  340. exit();
  341. }
  342. public static function order_title(array $fields)
  343. {
  344. $fields = array_merge(['num' => '序号'], $fields);
  345. $fieldVals = implode(',', array_values($fields)) . "\n";
  346. $EXCEL_OUT = mb_convert_encoding($fieldVals, 'GBK', 'UTF-8');
  347. return $EXCEL_OUT;
  348. }
  349. /**
  350. * 约定字段名称
  351. * =============
  352. * num 编号(编号后端添加、前端不需要传)
  353. * good_name 商品名称
  354. * attr 商品规格
  355. * good_num 商品数量
  356. * clerk_name 核销员名称
  357. * shop_name 核销门店名称
  358. * pay_price 实际付款
  359. * ==============
  360. * csv导出
  361. * @param array $data 导出的数据
  362. * @param array $fields 表头字段名
  363. */
  364. public static function order_new(array &$data, array &$fields)
  365. {
  366. // $fields = array_merge(['num' => '序号', 'platform' => '所属平台'], $fields);
  367. $fields = array_merge(['num' => '序号'], $fields);
  368. $EXCEL_OUT = "";
  369. $num = 1;
  370. foreach ($data as $dataK => &$dataV) {
  371. $export = new Export();
  372. $arr = ['good_name', 'attr', 'good_num', 'good_no'];
  373. if ($export->arrayExists($arr, $fields)) {
  374. foreach ($dataV['goods_list'] as $goodK => &$goodV) {
  375. $outData = [];
  376. $goods_str = "";//商品规格
  377. $dataV['num'] = $num;
  378. $num++;
  379. $dataV['good_name'] = $goodV['name'];
  380. $dataV['cost_price'] = $goodV['cost_price'];
  381. if (isset($goodV['total_price'])) {
  382. $dataV['pay_price'] = round($goodV['total_price'], 2);
  383. }
  384. if (isset($goodV['attr'])) {
  385. $attrList = json_decode($goodV['attr']);
  386. if (is_array($attrList)) {
  387. foreach ($attrList as $item) {
  388. $goods_str .= $item->attr_group_name . ":" . $item->attr_name . ',';
  389. }
  390. }
  391. $dataV['attr'] = rtrim($goods_str);
  392. $dataV['good_num'] = $goodV['num'];
  393. $dataV['good_no'] = $goodV['good_no'];
  394. }
  395. foreach ($fields as $fieldK => &$fieldV) {
  396. if (in_array($fieldK, ['pay_price', 'total_price', 'express_price', 'good_num', 'cost_price', 'rebate'])) {
  397. $outData[] = $dataV[$fieldK];
  398. } else {
  399. $outData[] = trim(self::Check($dataV[$fieldK]));
  400. }
  401. }
  402. //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  403. $EXCEL_OUT .= mb_convert_encoding(implode(',', $outData) . "\n", 'GBK', 'UTF-8');
  404. }
  405. } else {
  406. $outData = [];
  407. $dataV['num'] = $num;
  408. $num++;
  409. foreach ($fields as $fieldK => $fieldV) {
  410. $outData[] = trim(self::Check($dataV[$fieldK]));
  411. }
  412. //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  413. $EXCEL_OUT .= mb_convert_encoding(implode(',', $outData) . "\n", 'GBK', 'UTF-8');
  414. }
  415. }
  416. return $EXCEL_OUT;
  417. }
  418. /**
  419. * 通用
  420. * @param array $data
  421. * @param array $fields
  422. * @return string
  423. */
  424. public static function dataNew(array &$data, array &$fields)
  425. {
  426. $fields = array_merge(['num' => '序号'], $fields);
  427. $fieldVals = implode(',', array_values($fields)) . "\n";
  428. $EXCEL_OUT = mb_convert_encoding($fieldVals, 'GBK', 'UTF-8');
  429. $num = 1;
  430. foreach ($data as $dataK => &$dataV) {
  431. $outData = [];
  432. $dataV['num'] = $num;
  433. $num++;
  434. foreach ($fields as $fieldK => $fieldV) {
  435. $outData[] = trim(self::Check($dataV[$fieldK]));
  436. }
  437. //需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉
  438. $EXCEL_OUT .= mb_convert_encoding(implode(',', $outData) . "\n", 'GBK', 'UTF-8');
  439. }
  440. $name = date('YmdHis', time());//导出文件名称
  441. header("Content-Disposition:attachment;filename={$name}.csv"); //“生成文件名称”=自定义
  442. self::exportHeader($EXCEL_OUT);
  443. exit();
  444. }
  445. }