ExportServices.php 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\services\other\export;
  12. use app\model\user\User;
  13. use app\services\BaseServices;
  14. use app\jobs\system\ExportExcelJob;
  15. use app\services\pay\PayServices;
  16. use app\services\user\UserServices;
  17. use Cassandra\Exception\UnavailableException;
  18. use crmeb\services\SpreadsheetExcelService;
  19. use crmeb\services\WithdrawService;
  20. /**
  21. * 导出
  22. * Class ExportServices
  23. * @package app\services\other\export
  24. */
  25. class ExportServices extends BaseServices
  26. {
  27. /**
  28. * 不分页拆分处理最大条数
  29. * @var int
  30. */
  31. public $maxLimit = 1000;
  32. /**
  33. * 分页导出每页条数
  34. * @var int
  35. */
  36. public $limit = 1000;
  37. /**
  38. * 真实请求导出
  39. * @param $header excel表头
  40. * @param $title 标题
  41. * @param array $export 填充数据
  42. * @param string $filename 保存文件名称
  43. * @param string $suffix 保存文件后缀
  44. * @param bool $is_save true|false 是否保存到本地
  45. * @return mixed
  46. */
  47. public function export(array $header, array $title_arr, array $export = [], string $filename = '', string $suffix = 'xlsx', bool $is_save = true)
  48. {
  49. $path = [];
  50. $exportNum = count($export);
  51. $limit = $this->maxLimit;
  52. if ($exportNum < $limit) {
  53. $title = isset($title_arr[0]) && !empty($title_arr[0]) ? $title_arr[0] : '导出数据';
  54. $name = isset($title_arr[1]) && !empty($title_arr[1]) ? $title_arr[1] : '导出数据';
  55. $info = isset($title_arr[2]) && !empty($title_arr[2]) ? $title_arr[2] : date('Y-m-d H:i:s', time());
  56. $filePath = SpreadsheetExcelService::instance()->setExcelHeader($header)
  57. ->setExcelTile($title, $name, $info)
  58. ->setExcelContent($export)
  59. ->excelSave($filename, $suffix, $is_save);
  60. $path[] = sys_config('site_url') . $filePath;
  61. } else {
  62. $data = [];
  63. $i = $j = 0;
  64. $basePath = sys_config('site_url') . '/phpExcel/';
  65. foreach ($export as $item) {
  66. $data[] = $item;
  67. $i++;
  68. if ($limit <= 1 || $i == $exportNum) {
  69. if ($j > 0) {
  70. $filename .= '_' . $j;
  71. $header = [];
  72. $title_arr = [];
  73. }
  74. //加入队列
  75. ExportExcelJob::dispatch([$data, $filename, $header, $title_arr, $suffix, $is_save]);
  76. $path[] = $basePath . $filename . '.' . $suffix;
  77. $data = [];
  78. $limit = $this->limit + 1;
  79. $j++;
  80. }
  81. $limit--;
  82. }
  83. }
  84. return $path;
  85. }
  86. /**
  87. * 用户资金导出
  88. * @param array $data
  89. * @param int $type 1:直接返回数据前端生成excel 2:后台生成excel
  90. * @return array|mixed
  91. */
  92. public function userFinance($data = [], $type = 1)
  93. {
  94. $header = ['会员ID', '昵称', '金额', '类型', '备注', '创建时间'];
  95. $title = ['资金监控', '资金监控', date('Y-m-d H:i:s', time())];
  96. $filename = '资金监控_' . date('YmdHis', time());
  97. $export = [];
  98. $filekey = [];
  99. if (!empty($data)) {
  100. $i = 0;
  101. foreach ($data as $value) {
  102. $one_data = [
  103. 'uid' => $value['uid'],
  104. 'nickname' => $value['nickname'],
  105. 'pm' => $value['pm'] == 0 ? '-' . $value['number'] : $value['number'],
  106. 'title' => $value['title'],
  107. 'mark' => $value['mark'],
  108. 'add_time' => $value['add_time'],
  109. ];
  110. if ($type == 1) {
  111. $export[] = $one_data;
  112. if ($i == 0) {
  113. $filekey = array_keys($one_data);
  114. }
  115. } else {
  116. $export[] = array_values($one_data);
  117. }
  118. $i++;
  119. }
  120. }
  121. if ($type == 1) {
  122. return compact('header', 'filekey', 'export', 'filename');
  123. } else {
  124. return $this->export($header, $title, $export, $filename);
  125. }
  126. }
  127. /**
  128. * 用户佣金导出
  129. * @param $data 导出数据
  130. */
  131. public function userCommission($data = [], $type = 1)
  132. {
  133. $header = ['昵称/姓名', '总佣金金额', '账户余额', '账户佣金', '提现到账佣金', '时间'];
  134. $title = ['佣金记录', '佣金记录' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  135. $filename = '佣金记录_' . date('YmdHis', time());
  136. $export = [];
  137. $filekey = [];
  138. if (!empty($data)) {
  139. $i = 0;
  140. foreach ($data as $value) {
  141. $one_data = [
  142. 'nickname' => $value['nickname'],
  143. 'sum_number' => $value['sum_number'],
  144. 'now_money' => $value['now_money'],
  145. 'brokerage_price' => $value['brokerage_price'],
  146. 'extract_price' => $value['extract_price'],
  147. 'time' => $value['time']
  148. ];
  149. if ($type == 1) {
  150. $export[] = $one_data;
  151. if ($i == 0) {
  152. $filekey = array_keys($one_data);
  153. }
  154. } else {
  155. $export[] = array_values($one_data);
  156. }
  157. $i++;
  158. }
  159. }
  160. if ($type == 1) {
  161. return compact('header', 'filekey', 'export', 'filename');
  162. } else {
  163. return $this->export($header, $title, $export, $filename);
  164. }
  165. }
  166. /**
  167. * 用户积分导出
  168. * @param $data 导出数据
  169. */
  170. public function userPoint($data = [], $type = 1)
  171. {
  172. $header = ['编号', '标题', '变动后积分', '积分变动', '备注', '用户微信昵称', '添加时间'];
  173. $title = ['积分日志', '积分日志' . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  174. $filename = '积分日志_' . date('YmdHis', time());
  175. $export = [];
  176. $filekey = [];
  177. if (!empty($data)) {
  178. $i = 0;
  179. foreach ($data as $key => $item) {
  180. $one_data = [
  181. 'id' => $item['id'],
  182. 'title' => $item['title'],
  183. 'balance' => $item['balance'],
  184. 'number' => $item['number'],
  185. 'mark' => $item['mark'],
  186. 'nickname' => $item['nickname'],
  187. 'add_time' => $item['add_time'],
  188. ];
  189. if ($type == 1) {
  190. $export[] = $one_data;
  191. if ($i == 0) {
  192. $filekey = array_keys($one_data);
  193. }
  194. } else {
  195. $export[] = array_values($one_data);
  196. }
  197. $i++;
  198. }
  199. }
  200. if ($type == 1) {
  201. return compact('header', 'filekey', 'export', 'filename');
  202. } else {
  203. return $this->export($header, $title, $export, $filename);
  204. }
  205. }
  206. /**
  207. * 用户充值导出
  208. * @param $data 导出数据
  209. */
  210. public function userRecharge($data = [], $type = 1)
  211. {
  212. $header = ['昵称/姓名', '充值金额', '是否支付', '充值类型', '支付时间', '是否退款', '添加时间'];
  213. $title = ['充值记录', '充值记录' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  214. $filename = '充值记录_' . date('YmdHis', time());
  215. $export = [];
  216. $filekey = [];
  217. if (!empty($data)) {
  218. $i = 0;
  219. foreach ($data as $item) {
  220. switch ($item['recharge_type']) {
  221. case 'routine':
  222. $item['_recharge_type'] = '小程序充值';
  223. break;
  224. case 'weixin':
  225. $item['_recharge_type'] = '公众号充值';
  226. break;
  227. case 'balance':
  228. $item['_recharge_type'] = '佣金转入';
  229. break;
  230. case 'store':
  231. $item['_recharge_type'] = '门店余额充值';
  232. break;
  233. default:
  234. $item['_recharge_type'] = '其他充值';
  235. break;
  236. }
  237. $item['_pay_time'] = $item['pay_time'] ? date('Y-m-d H:i:s', $item['pay_time']) : '暂无';
  238. $item['_add_time'] = $item['add_time'] ? date('Y-m-d H:i:s', $item['add_time']) : '暂无';
  239. $item['paid_type'] = $item['paid'] ? '已支付' : '未支付';
  240. $one_data = [
  241. 'nickname' => $item['nickname'],
  242. 'price' => $item['price'],
  243. 'paid_type' => $item['paid_type'],
  244. '_recharge_type' => $item['_recharge_type'],
  245. '_pay_time' => $item['_pay_time'],
  246. 'paid' => $item['paid'] == 1 && $item['refund_price'] == $item['price'] ? '已退款' : '未退款',
  247. '_add_time' => $item['_add_time']
  248. ];
  249. if ($type == 1) {
  250. $export[] = $one_data;
  251. if ($i == 0) {
  252. $filekey = array_keys($one_data);
  253. }
  254. } else {
  255. $export[] = array_values($one_data);
  256. }
  257. $i++;
  258. }
  259. }
  260. if ($type == 1) {
  261. return compact('header', 'filekey', 'export', 'filename');
  262. } else {
  263. return $this->export($header, $title, $export, $filename);
  264. }
  265. }
  266. /**
  267. * 用户推广导出
  268. * @param $data 导出数据
  269. */
  270. public function userAgent($data = [], $type = 1)
  271. {
  272. $header = ['用户编号', '昵称', '电话号码', '推广用户数量', '订单数量', '推广订单金额', '佣金金额', '已提现金额', '提现次数', '未提现金额', '上级推广人'];
  273. $title = ['推广用户', '推广用户导出' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  274. $filename = '推广用户_' . date('YmdHis', time());
  275. $export = [];
  276. $filekey = [];
  277. if (!empty($data)) {
  278. $i = 0;
  279. foreach ($data as $index => $item) {
  280. $one_data = [
  281. 'uid' => $item['uid'],
  282. 'nickname' => $item['nickname'],
  283. 'phone' => $item['phone'],
  284. 'spread_count' => $item['spread_count'],
  285. 'order_count' => $item['order_count'],
  286. 'order_price' => $item['order_price'],
  287. 'brokerage_money' => $item['brokerage_money'],
  288. 'extract_count_price' => $item['extract_count_price'],
  289. 'extract_count_num' => $item['extract_count_num'],
  290. 'brokerage_price' => $item['brokerage_price'],
  291. 'spread_name' => $item['spread_name'],
  292. ];
  293. if ($type == 1) {
  294. $export[] = $one_data;
  295. if ($i == 0) {
  296. $filekey = array_keys($one_data);
  297. }
  298. } else {
  299. $export[] = array_values($one_data);
  300. }
  301. $i++;
  302. }
  303. }
  304. if ($type == 1) {
  305. return compact('header', 'filekey', 'export', 'filename');
  306. } else {
  307. return $this->export($header, $title, $export, $filename);
  308. }
  309. }
  310. /**
  311. * 微信用户导出
  312. * @param $data 导出数据
  313. */
  314. public function wechatUser($data = [], $type = 1)
  315. {
  316. $header = ['名称', '性别', '地区', '是否关注公众号'];
  317. $title = ['微信用户导出', '微信用户导出' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  318. $filename = '微信用户导出_' . date('YmdHis', time());
  319. $export = [];
  320. $filekey = [];
  321. if (!empty($data)) {
  322. $i = 0;
  323. foreach ($data as $index => $item) {
  324. $one_data = [
  325. 'nickname' => $item['nickname'],
  326. 'sex' => $item['sex'],
  327. 'address' => $item['country'] . $item['province'] . $item['city'],
  328. 'subscribe' => $item['subscribe'] == 1 ? '关注' : '未关注',
  329. ];
  330. if ($type == 1) {
  331. $export[] = $one_data;
  332. if ($i == 0) {
  333. $filekey = array_keys($one_data);
  334. }
  335. } else {
  336. $export[] = array_values($one_data);
  337. }
  338. $i++;
  339. }
  340. }
  341. if ($type == 1) {
  342. return compact('header', 'filekey', 'export', 'filename');
  343. } else {
  344. return $this->export($header, $title, $export, $filename);
  345. }
  346. }
  347. /**
  348. * 订单资金导出
  349. * @param array $data
  350. * @param int $type
  351. * @return array|mixed
  352. */
  353. public function orderFinance($data = [], $type = 1)
  354. {
  355. $header = ['时间', '营业额(元)', '支出(元)', '成本', '优惠', '积分抵扣', '盈利(元)'];
  356. $title = ['财务统计', '财务统计', date('Y-m-d H:i:s', time())];
  357. $filename = '财务统计_' . date('YmdHis', time());
  358. $export = [];
  359. $filekey = [];
  360. if (!empty($data)) {
  361. $i = 0;
  362. foreach ($data as $info) {
  363. $time = $info['pay_time'];
  364. $price = $info['total_price'] + $info['pay_postage'];
  365. $zhichu = $info['coupon_price'] + $info['deduction_price'] + $info['cost'];
  366. $profit = ($info['total_price'] + $info['pay_postage']) - ($info['coupon_price'] + $info['deduction_price'] + $info['cost']);
  367. $deduction = $info['deduction_price'];//积分抵扣
  368. $coupon = $info['coupon_price'];//优惠
  369. $cost = $info['cost'];//成本
  370. $one_data = compact('time', 'price', 'zhichu', 'cost', 'coupon', 'deduction', 'profit');
  371. if ($type == 1) {
  372. $export[] = $one_data;
  373. if ($i == 0) {
  374. $filekey = array_keys($one_data);
  375. }
  376. } else {
  377. $export[] = array_values($one_data);
  378. }
  379. $i++;
  380. }
  381. }
  382. if ($type == 1) {
  383. return compact('header', 'filekey', 'export', 'filename');
  384. } else {
  385. return $this->export($header, $title, $export, $filename);
  386. }
  387. }
  388. /**
  389. * 砍价活动导出
  390. * @param array $data
  391. * @param int $type
  392. * @return array|mixed
  393. */
  394. public function storeBargain($data = [], $type = 1)
  395. {
  396. $header = ['砍价活动名称', '砍价活动简介', '砍价金额', '砍价最低价',
  397. '用户每次砍价的次数', '砍价状态', '砍价开启时间', '砍价结束时间', '销量', '库存', '返多少积分', '添加时间'];
  398. $title = ['砍价商品导出', '商品信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  399. $filename = '砍价商品导出_' . date('YmdHis', time());
  400. $export = [];
  401. $filekey = [];
  402. if (!empty($data)) {
  403. $i = 0;
  404. foreach ($data as $index => $item) {
  405. $one_data = [
  406. 'title' => $item['title'],
  407. 'info' => $item['info'],
  408. 'price' => '¥' . $item['price'],
  409. 'bargain_max_price' => '¥' . $item['min_price'],
  410. 'bargain_num' => $item['bargain_num'],
  411. 'status' => $item['status'] ? '开启' : '关闭',
  412. 'start_time' => empty($item['start_time']) ? '' : date('Y-m-d H:i:s', (int)$item['start_time']),
  413. 'stop_time' => empty($item['stop_time']) ? '' : date('Y-m-d H:i:s', (int)$item['stop_time']),
  414. 'sales' => $item['sales'],
  415. 'stock' => $item['stock'],
  416. 'give_integral' => $item['give_integral'],
  417. 'add_time' => empty($item['add_time']) ? '' : $item['add_time'],
  418. ];
  419. if ($type == 1) {
  420. $export[] = $one_data;
  421. if ($i == 0) {
  422. $filekey = array_keys($one_data);
  423. }
  424. } else {
  425. $export[] = array_values($one_data);
  426. }
  427. $i++;
  428. }
  429. }
  430. if ($type == 1) {
  431. return compact('header', 'filekey', 'export', 'filename');
  432. } else {
  433. return $this->export($header, $title, $export, $filename);
  434. }
  435. }
  436. /**
  437. * 拼团导出
  438. * @param array $data
  439. * @param int $type
  440. * @return array|mixed
  441. */
  442. public function storeCombination($data = [], $type = 1)
  443. {
  444. $header = ['编号', '拼团名称', '原价', '拼团价', '库存', '拼团人数', '参与人数', '成团数量', '销量', '商品状态', '结束时间'];
  445. $title = ['拼团商品导出', '商品信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  446. $filename = '拼团商品导出_' . date('YmdHis', time());
  447. $export = [];
  448. $filekey = [];
  449. if (!empty($data)) {
  450. $i = 0;
  451. foreach ($data as $item) {
  452. $one_data = [
  453. 'id' => $item['id'],
  454. 'title' => $item['title'],
  455. 'ot_price' => $item['ot_price'],
  456. 'price' => $item['price'],
  457. 'stock' => $item['stock'],
  458. 'people' => $item['count_people'],
  459. 'count_people_all' => $item['count_people_all'],
  460. 'count_people_pink' => $item['count_people_pink'],
  461. 'sales' => $item['sales'] ?? 0,
  462. 'is_show' => $item['is_show'] ? '开启' : '关闭',
  463. 'stop_time' => empty($item['stop_time']) ? '' : date('Y/m/d H:i:s', (int)$item['stop_time'])
  464. ];
  465. if ($type == 1) {
  466. $export[] = $one_data;
  467. if ($i == 0) {
  468. $filekey = array_keys($one_data);
  469. }
  470. } else {
  471. $export[] = array_values($one_data);
  472. }
  473. $i++;
  474. }
  475. }
  476. if ($type == 1) {
  477. return compact('header', 'filekey', 'export', 'filename');
  478. } else {
  479. return $this->export($header, $title, $export, $filename);
  480. }
  481. }
  482. /**
  483. * 秒杀活动导出
  484. * @param array $data
  485. * @param int $type
  486. * @return array|mixed
  487. */
  488. public function storeSeckill($data = [], $type = 1)
  489. {
  490. $header = ['编号', '活动标题', '活动简介', '原价', '秒杀价', '限量', '限量剩余', '秒杀状态', '结束时间', '状态'];
  491. $title = ['秒杀商品导出', ' ', ' 生成时间:' . date('Y-m-d H:i:s', time())];
  492. $filename = '秒杀商品导出_' . date('YmdHis', time());
  493. $export = [];
  494. $filekey = [];
  495. if (!empty($data)) {
  496. $i = 0;
  497. foreach ($data as $item) {
  498. if ($item['status']) {
  499. if ($item['start_time'] > time())
  500. $item['start_name'] = '活动未开始';
  501. else if ($item['stop_time'] < time())
  502. $item['start_name'] = '活动已结束';
  503. else if ($item['stop_time'] > time() && $item['start_time'] < time())
  504. $item['start_name'] = '正在进行中';
  505. } else {
  506. $item['start_name'] = '活动已结束';
  507. }
  508. $one_data = [
  509. 'id' => $item['id'],
  510. 'title' => $item['title'],
  511. 'info' => $item['info'],
  512. 'ot_price' => $item['ot_price'],
  513. 'price' => $item['price'],
  514. 'quota_show' => $item['quota_show'],
  515. 'quota' => $item['quota'],
  516. 'start_name' => $item['start_name'],
  517. 'stop_time' => $item['stop_time'] ? date('Y-m-d H:i:s', $item['stop_time']) : '/',
  518. 'status' => $item['status'] ? '开启' : '关闭',
  519. ];
  520. if ($type == 1) {
  521. $export[] = $one_data;
  522. if ($i == 0) {
  523. $filekey = array_keys($one_data);
  524. }
  525. } else {
  526. $export[] = array_values($one_data);
  527. }
  528. $i++;
  529. }
  530. }
  531. if ($type == 1) {
  532. return compact('header', 'filekey', 'export', 'filename');
  533. } else {
  534. return $this->export($header, $title, $export, $filename);
  535. }
  536. }
  537. /**
  538. * 导出商品卡号、卡密模版
  539. * @param int $type
  540. * @return array|mixed
  541. */
  542. public function storeProductCardTemplate($type = 1)
  543. {
  544. $header = ['卡号', '卡密'];
  545. $title = ['商品卡密模版', '商品密' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  546. $filename = '商品卡密模版_' . date('YmdHis', time());
  547. if ($type == 1) {
  548. $export = [];
  549. $filekey = ['card_no', 'card_pwd'];
  550. return compact('header', 'filekey', 'export', 'filename');
  551. } else {
  552. return $this->export($header, $title, [], $filename);
  553. }
  554. }
  555. /**
  556. * 商品导出
  557. * @param array $data
  558. * @param int $type
  559. * @return array|mixed
  560. */
  561. public function storeProduct($data = [], $type = 1)
  562. {
  563. $header = ['商品名称', '商品简介', '商品分类', '价格', '库存', '销量', '浏览量'];
  564. $title = ['商品导出', '商品信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  565. $filename = '商品导出_' . date('YmdHis', time());
  566. $export = [];
  567. $filekey = [];
  568. if (!empty($data)) {
  569. $i = 0;
  570. foreach ($data as $index => $item) {
  571. $one_data = [
  572. 'store_name' => $item['store_name'],
  573. 'store_info' => $item['store_info'],
  574. 'cate_name' => $item['cate_name'],
  575. 'price' => '¥' . $item['price'],
  576. 'stock' => $item['stock'],
  577. 'sales' => $item['sales'],
  578. 'visitor' => $item['visitor'],
  579. ];
  580. if ($type == 1) {
  581. $export[] = $one_data;
  582. if ($i == 0) {
  583. $filekey = array_keys($one_data);
  584. }
  585. } else {
  586. $export[] = array_values($one_data);
  587. }
  588. $i++;
  589. }
  590. }
  591. if ($type == 1) {
  592. return compact('header', 'filekey', 'export', 'filename');
  593. } else {
  594. return $this->export($header, $title, $export, $filename);
  595. }
  596. }
  597. /**
  598. * 商铺订单导出
  599. * @param array $data
  600. * @param string $type
  601. * @param int $export_type
  602. * @return array|mixed
  603. */
  604. public function storeOrder($data = [], $type = "", $export_type = 1)
  605. {
  606. if (!$type) {
  607. $header = ['订单ID', '订单编号', '性别', '电话', '收货人姓名', '收货人电话', '收货地址', '商品信息', '商品总数',
  608. '总价格', '实际支付', '邮费', '会员优惠金额', '优惠卷金额', '积分抵扣金额', '支付状态', '支付时间', '订单状态', '下单时间', '用户备注'];
  609. $title = ['订单导出', '订单信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  610. $filename = '订单导出_' . date('YmdHis', time());
  611. } else {
  612. $header = ['订单ID', '订单编号', '物流公司', '物流编码', '物流单号', '发货地址', '收货人姓名', '收货人电话', '订单实付金额', '商品数量*售价', '商品ID', '商品名称', '商品规格', '商家备注', '订单成交时间'];
  613. $title = ['发货单导出', '订单信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  614. $filename = '发货单导出_' . date('YmdHis', time());
  615. }
  616. $export = [];
  617. $filekey = [];
  618. if (!empty($data)) {
  619. $i = 0;
  620. foreach ($data as $item) {
  621. if (!$type) {
  622. if ($item['paid'] == 1) {
  623. switch ($item['pay_type']) {
  624. case PayServices::WEIXIN_PAY:
  625. $item['pay_type_name'] = '微信支付';
  626. break;
  627. case PayServices::YUE_PAY:
  628. $item['pay_type_name'] = '余额支付';
  629. break;
  630. case PayServices::OFFLINE_PAY:
  631. $item['pay_type_name'] = '线下支付';
  632. break;
  633. case PayServices::ALIAPY_PAY:
  634. $item['pay_type_name'] = '支付宝支付';
  635. break;
  636. case PayServices::CASH_PAY:
  637. $item['pay_type_name'] = '现金支付';
  638. break;
  639. default:
  640. $item['pay_type_name'] = '其他支付';
  641. break;
  642. }
  643. } else {
  644. switch ($item['pay_type']) {
  645. default:
  646. $item['pay_type_name'] = '未支付';
  647. break;
  648. case 'offline':
  649. $item['pay_type_name'] = '线下支付';
  650. $item['pay_type_info'] = 1;
  651. break;
  652. }
  653. }
  654. if ($item['paid'] == 0 && $item['status'] == 0) {
  655. $item['status_name'] = '未支付';
  656. } else if ($item['paid'] == 1 && $item['status'] == 4 && in_array($item['shipping_type'], [1, 3]) && $item['refund_status'] == 0) {
  657. $item['status_name'] = '部分发货';
  658. } else if ($item['paid'] == 1 && $item['status'] == 5 && $item['shipping_type'] == 2 && $item['refund_status'] == 0) {
  659. $item['status_name'] = '部分核销';
  660. } else if ($item['paid'] == 1 && $item['refund_status'] == 1) {
  661. $item['status_name'] = '申请退款';
  662. } else if ($item['paid'] == 1 && $item['refund_status'] == 2) {
  663. $item['status_name'] = '已退款';
  664. } else if ($item['paid'] == 1 && $item['refund_status'] == 4) {
  665. $item['status_name'] = '退款中';
  666. } else if ($item['paid'] == 1 && $item['status'] == 0 && in_array($item['shipping_type'], [1, 3]) && $item['refund_status'] == 0) {
  667. $item['status_name'] = '未发货';
  668. } else if ($item['paid'] == 1 && in_array($item['status'], [0, 1]) && $item['shipping_type'] == 2 && $item['refund_status'] == 0) {
  669. $item['status_name'] = '未核销';
  670. } else if ($item['paid'] == 1 && in_array($item['status'], [1, 5]) && in_array($item['shipping_type'], [1, 3]) && $item['refund_status'] == 0) {
  671. $item['status_name'] = '待收货';
  672. } else if ($item['paid'] == 1 && $item['status'] == 2 && $item['refund_status'] == 0) {
  673. $item['status_name'] = '待评价';
  674. } else if ($item['paid'] == 1 && $item['status'] == 3 && $item['refund_status'] == 0) {
  675. $item['status_name'] = '已完成';
  676. } else if ($item['paid'] == 1 && $item['refund_status'] == 3) {
  677. $item['status_name'] = '部分退款';
  678. }
  679. $goodsName = [];
  680. $vip_sum_price = 0;
  681. foreach ($item['_info'] as $k => $v) {
  682. $suk = '';
  683. if (isset($v['productInfo']['attrInfo'])) {
  684. if (isset($v['productInfo']['attrInfo']['suk'])) {
  685. $suk = '(' . $v['productInfo']['attrInfo']['suk'] . ')';
  686. }
  687. }
  688. if (isset($v['productInfo']['store_name'])) {
  689. $goodsName[] = implode(' ',
  690. [
  691. $v['productInfo']['store_name'],
  692. $suk,
  693. "[{$v['cart_num']} * {$v['truePrice']}]",
  694. ]);
  695. }
  696. $vip_sum_price = bcadd((string)$vip_sum_price, bcmul($v['vip_truePrice'], $v['cart_num'] ? $v['cart_num'] : 1, 4), 2);
  697. }
  698. if ($item['sex'] == 1) $sex_name = '男';
  699. else if ($item['sex'] == 2) $sex_name = '女';
  700. else $sex_name = '未知';
  701. $one_data = [
  702. 'id' => $item['id'],
  703. 'order_id' => $item['order_id'],
  704. 'sex' => $sex_name,
  705. 'phone' => $item['user_phone'],
  706. 'real_name' => $item['real_name'],
  707. 'user_phone' => $item['user_phone'],
  708. 'user_address' => $item['user_address'],
  709. 'goods_name' => $goodsName ? implode("\n", $goodsName) : '',
  710. 'total_num' => $item['total_num'],
  711. 'total_price' => $item['total_price'],
  712. 'pay_price' => $item['pay_price'],
  713. 'pay_postage' => $item['pay_postage'],
  714. 'vip_sum_price' => $vip_sum_price,
  715. 'coupon_price' => $item['coupon_price'],
  716. 'deduction_price' => $item['deduction_price'] ?? 0,
  717. 'pay_type_name' => $item['pay_type_name'],
  718. 'pay_time' => $item['pay_time'] > 0 ? date('Y/m-d H:i', (int)$item['pay_time']) : '暂无',
  719. 'status_name' => $item['status_name'] ?? '未知状态',
  720. 'add_time' => empty($item['add_time']) ? 0 : date('Y-m-d H:i:s', (int)$item['add_time']),
  721. 'mark' => $item['mark']
  722. ];
  723. } else {
  724. if (isset($item['pinkStatus']) && $item['pinkStatus'] != 2) {
  725. continue;
  726. }
  727. if (isset($item['refund']) && $item['refund']) {
  728. continue;
  729. }
  730. $goodsName = [];
  731. $g = 0;
  732. foreach ($item['_info'] as $k => $v) {
  733. $goodsName['cart_num'][$g] = $v['cart_num'] . ' * ' . ($v['productInfo']['attrInfo']['price'] ?? $v['productInfo']['price'] ?? 0.00);
  734. $goodsName['product_id'][$g] = $v['product_id'];
  735. $suk = $barCode = $code = '';
  736. if (!empty($v['productInfo']['attrInfo']['bar_code'])) {
  737. $barCode = $v['productInfo']['attrInfo']['bar_code'];
  738. }
  739. if (!empty($v['productInfo']['attrInfo']['code'])) {
  740. $code = $v['productInfo']['attrInfo']['code'];
  741. }
  742. if (isset($v['productInfo']['attrInfo'])) {
  743. if (isset($v['productInfo']['attrInfo']['suk'])) {
  744. $suk = '(' . $v['productInfo']['attrInfo']['suk'] . '|条码:' . $barCode . '|编码:' . $code . ')';
  745. }
  746. }
  747. $name = [];
  748. if (isset($v['productInfo']['store_name'])) {
  749. $name[] = implode(' ',
  750. [
  751. $v['productInfo']['store_name'],
  752. $suk,
  753. "[{$v['cart_num']} * {$v['truePrice']}]",
  754. ]);
  755. }
  756. $goodsName['goods_name'][$g] = implode(' ', $name);
  757. $goodsName['attr'][$g] = $v['productInfo']['attrInfo']['suk'] ?? '';
  758. $g++;
  759. }
  760. $one_data = [
  761. 'id' => $item['id'],
  762. 'order_id' => $item['order_id'],
  763. 'a' => "",
  764. 'b' => "",
  765. 'c' => "",
  766. 'user_address' => $item['user_address'],
  767. 'real_name' => $item['real_name'],
  768. 'user_phone' => $item['user_phone'],
  769. 'pay_price' => $item['pay_price'],
  770. 'cart_num' => isset($goodsName['cart_num']) ? implode("\n", $goodsName['cart_num']) : '',
  771. 'product_id' => isset($goodsName['product_id']) ? implode("\n", $goodsName['product_id']) : '',
  772. 'goods_name' => isset($goodsName['goods_name']) ? implode("\n", $goodsName['goods_name']) : '',
  773. 'attr' => isset($goodsName['attr']) ? implode("\n", $goodsName['attr']) : '',
  774. 'remark' => $item['remark'],
  775. 'pay_time' => $item['pay_time'] ? date('Y-m-d H:i:s', (int)$item['pay_time']) : '暂无',
  776. ];
  777. }
  778. if ($export_type == 1) {
  779. $export[] = $one_data;
  780. if ($i == 0) {
  781. $filekey = array_keys($one_data);
  782. }
  783. } else {
  784. $export[] = array_values($one_data);
  785. }
  786. $i++;
  787. }
  788. }
  789. if ($export_type == 1) {
  790. return compact('header', 'filekey', 'export', 'filename');
  791. } else {
  792. return $this->export($header, $title, $export, $filename);
  793. }
  794. }
  795. /**
  796. * @param string $str
  797. * @return false|string|string[]|null
  798. */
  799. public function strToUtf8($str = '')
  800. {
  801. $current_encode = mb_detect_encoding($str, array("ASCII", "GB2312", "GBK", 'BIG5', 'UTF-8'));
  802. $encoded_str = mb_convert_encoding($str, 'UTF-8', $current_encode);
  803. return $encoded_str;
  804. }
  805. /**
  806. * 商铺自提点导出
  807. * @param array $data
  808. * @param int $type
  809. * @return array|mixed
  810. */
  811. public function storeMerchant($data = [], $type = 1)
  812. {
  813. $header = ['提货点名称', '提货点', '地址', '营业时间', '状态'];
  814. $title = ['提货点导出', '提货点信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  815. $filename = '提货点导出_' . date('YmdHis', time());
  816. $export = [];
  817. $filekey = [];
  818. if (!empty($data)) {
  819. $i = 0;
  820. foreach ($data as $index => $item) {
  821. $one_data = [
  822. 'name' => $item['name'],
  823. 'phone' => $item['phone'],
  824. 'address' => $item['address'] . '' . $item['detailed_address'],
  825. 'day_time' => $item['day_time'],
  826. 'is_show' => $item['is_show'] ? '开启' : '关闭'
  827. ];
  828. if ($type == 1) {
  829. $export[] = $one_data;
  830. if ($i == 0) {
  831. $filekey = array_keys($one_data);
  832. }
  833. } else {
  834. $export[] = array_values($one_data);
  835. }
  836. $i++;
  837. }
  838. }
  839. if ($type == 1) {
  840. return compact('header', 'filekey', 'export', 'filename');
  841. } else {
  842. return $this->export($header, $title, $export, $filename);
  843. }
  844. }
  845. /**
  846. * 商铺自提点导出
  847. * @param array $data
  848. * @param int $type
  849. * @return array|mixed
  850. */
  851. public function extract($data = [], $type = 1)
  852. {
  853. $header = ['收款账号', '收款人名称', '收款银行', '金额', '用途', '状态'];
  854. $title = ['用户提现导出', '用户提现信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  855. $filename = '用户提现导出_' . date('YmdHis', time());
  856. $export = [];
  857. $filekey = [];
  858. if (!empty($data)) {
  859. $i = 0;
  860. foreach ($data as $index => $item) {
  861. // if ($item['bank_address'] == '灵活用工提现' && $item['status'] == 0) {
  862. // $userServices = app()->make(UserServices::class);
  863. // $userInfo = $userServices->get($item['uid']);
  864. // if (!$userInfo['professional_id']) {
  865. // throw new UnavailableException('用户未认证签约');
  866. // }
  867. // $bankInfo = WithdrawService::init()::contractInfo($userInfo['enterprise_professional_facilitator_id']);
  868. // if (!$bankInfo['sign_img']) throw new UnavailableException('用户未签约');
  869. // $one_data = [
  870. // 'bank_code' => $bankInfo['bank_code'],
  871. // 'real_name' => $bankInfo['name'],
  872. // 'bank_address' => '未知',
  873. // 'extract_price' => $item['extract_price'],
  874. // 'mark' => '工资发放',
  875. // 'status' => ($item['status'] == 1 ? '通过' : ($item['status'] == 0 ? '申请中' : '未通过'))
  876. // ];
  877. // } else
  878. $one_data = [
  879. 'bank_code' => $item['bank_code'],
  880. 'real_name' => $item['real_name'],
  881. 'bank_address' => $item['bank_address'],
  882. 'extract_price' => $item['extract_price'],
  883. 'mark' => '工资发放',
  884. 'status' => ($item['status'] == 1 ? '通过' : ($item['status'] == 0 ? '申请中' : '未通过'))
  885. ];
  886. if ($type == 1) {
  887. $export[] = $one_data;
  888. if ($i == 0) {
  889. $filekey = array_keys($one_data);
  890. }
  891. } else {
  892. $export[] = array_values($one_data);
  893. }
  894. $i++;
  895. }
  896. }
  897. if ($type == 1) {
  898. return compact('header', 'filekey', 'export', 'filename');
  899. } else {
  900. return $this->export($header, $title, $export, $filename);
  901. }
  902. }
  903. /**
  904. * 商铺自提点导出
  905. * @param array $data
  906. * @param int $type
  907. * @return array|mixed
  908. */
  909. public function exchange($data = [], $type = 1)
  910. {
  911. $header = ['交易账号', '姓名', '银行', '银行卡号', '身份证号', '联系电话', '申购价额', '申购份额', '冻结份额', '封闭期'];
  912. $title = ['用户能量转份额导出', '用户能量转份额信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  913. $filename = '用户能量转份额导出_' . date('YmdHis', time());
  914. $export = [];
  915. $filekey = [];
  916. if (!empty($data)) {
  917. $i = 0;
  918. foreach ($data as $index => $item) {
  919. $one_data = [
  920. 'trade_no' => '',
  921. 'real_name' => $item['user']['real_name'],
  922. 'bank' => $item['bank_address'],
  923. 'bank_code' => $item['bank_code'],
  924. 'id_card' => $item['user']['card_id'],
  925. 'phone' => $item['user']['phone'],
  926. 'extract_price' => $item['extract_price'],
  927. 'exchange_num' => $item['exchange_num'],
  928. 'freeze_num' => '',
  929. 'lock_time' => ''
  930. ];
  931. if ($type == 1) {
  932. $export[] = $one_data;
  933. if ($i == 0) {
  934. $filekey = array_keys($one_data);
  935. }
  936. } else {
  937. $export[] = array_values($one_data);
  938. }
  939. $i++;
  940. }
  941. }
  942. if ($type == 1) {
  943. return compact('header', 'filekey', 'export', 'filename');
  944. } else {
  945. return $this->export($header, $title, $export, $filename);
  946. }
  947. }
  948. /**
  949. * 商铺自提点导出
  950. * @param array $data
  951. * @param int $type
  952. * @return array|mixed
  953. */
  954. public function extractInfo($data = [], $type = 1, $month = '')
  955. {
  956. $header = ['姓名', '证件号码', '所得项目', '收入', '费用', '免税收入', '扣除项目合计', '应纳税所得额', '税率/预扣率', '速算扣除数', '应纳税额', '减免税额', '应扣缴税额', '已缴税额', '应补(退)税额'];
  957. $title = [($month ?: date('Y-m')) . '月用户提现统计', '用户提现统计' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  958. $filename = ($month ?: date('Y-m')) . '月用户提现统计_' . date('YmdHis', time());
  959. $export = [];
  960. $filekey = [];
  961. if (!empty($data)) {
  962. $i = 0;
  963. foreach ($data as $index => $item) {
  964. $one_data = $item;
  965. if ($type == 1) {
  966. $export[] = $one_data;
  967. if ($i == 0) {
  968. $filekey = array_keys($one_data);
  969. }
  970. } else {
  971. $export[] = array_values($one_data);
  972. }
  973. $i++;
  974. }
  975. }
  976. if ($type == 1) {
  977. return compact('header', 'filekey', 'export', 'filename');
  978. } else {
  979. return $this->export($header, $title, $export, $filename);
  980. }
  981. }
  982. /**
  983. * 会员卡导出
  984. * @param array $data
  985. * @param int $type
  986. * @return array|mixed
  987. */
  988. public function memberCard($data = [], $type = 1)
  989. {
  990. $header = ['会员卡号', '密码', '领取人', '领取人手机号', '领取时间', '是否使用'];
  991. $title = ['会员卡导出', '会员卡导出' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  992. $filename = $data['title'] ? ("卡密会员_" . trim(str_replace(["\r\n", "\r", "\\", "\n", "/", "<", ">", "=", " "], '', $data['title']))) : "";
  993. $export = [];
  994. $filekey = [];
  995. if (!empty($data)) {
  996. $i = 0;
  997. foreach ($data['data'] as $index => $item) {
  998. $one_data = [
  999. 'card_number' => $item['card_number'],
  1000. 'card_password' => $item['card_password'],
  1001. 'user_name' => $item['user_name'],
  1002. 'user_phone' => $item['user_phone'],
  1003. 'use_time' => $item['use_time'],
  1004. 'use_uid' => $item['use_uid'] ? '已领取' : '未领取'
  1005. ];
  1006. if ($type == 1) {
  1007. $export[] = $one_data;
  1008. if ($i == 0) {
  1009. $filekey = array_keys($one_data);
  1010. }
  1011. } else {
  1012. $export[] = array_values($one_data);
  1013. }
  1014. $i++;
  1015. }
  1016. }
  1017. if ($type == 1) {
  1018. return compact('header', 'filekey', 'export', 'filename');
  1019. } else {
  1020. return $this->export($header, $title, $export, $filename);
  1021. }
  1022. }
  1023. /**
  1024. * 批量任务发货记录导出
  1025. * @param array $data
  1026. * @param $queueType
  1027. * @param int $type
  1028. * @return array|mixed
  1029. */
  1030. public function batchOrderDelivery($data = [], $queueType, $type = 1)
  1031. {
  1032. if (in_array($queueType, [7, 8])) {
  1033. $header = ['订单ID', '物流公司', '物流单号', '处理状态', '异常原因'];
  1034. }
  1035. if ($queueType == 9) {
  1036. $header = ['订单ID', '配送员姓名', '配送员电话', '处理状态', '异常原因'];
  1037. }
  1038. if ($queueType == 10) {
  1039. $header = ['订单ID', '虚拟发货内容', '处理状态', '异常原因'];
  1040. }
  1041. $title = ['发货记录导出', '发货记录导出' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1042. $filename = '批量任务发货记录_' . date('YmdHis', time());
  1043. $export = [];
  1044. $filekey = [];
  1045. if (!empty($data)) {
  1046. $i = 0;
  1047. foreach ($data as $index => $item) {
  1048. if (!$item) {
  1049. continue;
  1050. }
  1051. if (in_array($queueType, [7, 8, 9])) {
  1052. $one_data = [
  1053. 'order_id' => $item['order_id'] ?? '',
  1054. 'delivery_name' => $item['delivery_name'] ?? '',
  1055. 'delivery_id' => $item['delivery_id'] ?? '',
  1056. 'status_cn' => $item['status_cn'] ?? '',
  1057. 'error' => $item['error'] ?? '',
  1058. ];
  1059. } else {
  1060. $one_data = [
  1061. 'order_id' => $item['order_id'] ?? '',
  1062. 'fictitious_content' => $item['fictitious_content'] ?? '',
  1063. 'status_cn' => $item['status_cn'] ?? '',
  1064. 'error' => $item['error'] ?? '',
  1065. ];
  1066. }
  1067. if ($type == 1) {
  1068. $export[] = $one_data;
  1069. if ($i == 0) {
  1070. $filekey = array_keys($one_data);
  1071. }
  1072. } else {
  1073. $export[] = array_values($one_data);
  1074. }
  1075. $i++;
  1076. }
  1077. }
  1078. if ($type == 1) {
  1079. return compact('header', 'filekey', 'export', 'filename');
  1080. } else {
  1081. return $this->export($header, $title, $export, $filename);
  1082. }
  1083. }
  1084. /**
  1085. * 物流公司对照表
  1086. * @param array $data
  1087. * @param int $type
  1088. * @return array|mixed
  1089. */
  1090. public function expressList($data = [], $type = 1)
  1091. {
  1092. $header = ['物流公司名称', '物流公司编码'];
  1093. $title = ['物流公司对照表导出', '物流公司对照表导出' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1094. $filename = '物流公司对照表_' . date('YmdHis', time());
  1095. $export = [];
  1096. $filekey = [];
  1097. if (!empty($data)) {
  1098. $i = 0;
  1099. foreach ($data as $index => $item) {
  1100. $one_data = [
  1101. 'name' => $item['name'],
  1102. 'code' => $item['code'],
  1103. ];
  1104. if ($type == 1) {
  1105. $export[] = $one_data;
  1106. if ($i == 0) {
  1107. $filekey = array_keys($one_data);
  1108. }
  1109. } else {
  1110. $export[] = array_values($one_data);
  1111. }
  1112. $i++;
  1113. }
  1114. }
  1115. if ($type == 1) {
  1116. return compact('header', 'filekey', 'export', 'filename');
  1117. } else {
  1118. return $this->export($header, $title, $export, $filename);
  1119. }
  1120. }
  1121. /**
  1122. * 交易统计
  1123. * @param array $data
  1124. * @param string $tradeTitle
  1125. * @param int $type
  1126. * @return array|mixed
  1127. */
  1128. public function tradeData($data = [], $tradeTitle = "交易统计", $type = 1)
  1129. {
  1130. $header = ['时间'];
  1131. $title = [$tradeTitle, $tradeTitle, ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1132. $filename = $tradeTitle . '_' . date('YmdHis', time());
  1133. $export = [];
  1134. $filekey = [];
  1135. if (!empty($data)) {
  1136. $headerArray = array_column($data['series'], 'name');
  1137. $header = array_merge($header, $headerArray);
  1138. $export = [];
  1139. foreach ($data['series'] as $index => $item) {
  1140. foreach ($data['x'] as $k => $v) {
  1141. $export[$v]['time'] = $v;
  1142. $export[$v][] = $item['value'][$k];
  1143. }
  1144. }
  1145. }
  1146. if ($type == 1) {
  1147. return compact('header', 'filekey', 'export', 'filename');
  1148. } else {
  1149. return $this->export($header, $title, $export, $filename);
  1150. }
  1151. }
  1152. /**
  1153. * 商品统计
  1154. * @param array $data
  1155. * @param int $type
  1156. * @return array|mixed
  1157. */
  1158. public function productTrade($data = [], $type = 1)
  1159. {
  1160. $header = ['日期/时间', '商品浏览量', '商品访客数', '加购件数', '下单件数', '支付件数', '支付金额', '成本金额', '退款金额', '退款件数', '访客-支付转化率'];
  1161. $title = ['商品统计', '商品统计' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1162. $filename = '商品统计_' . date('YmdHis', time());
  1163. $export = [];
  1164. $filekey = [];
  1165. if (!empty($data)) {
  1166. $i = 0;
  1167. foreach ($data as $value) {
  1168. $one_data = [
  1169. 'time' => $value['time'],
  1170. 'browse' => $value['browse'],
  1171. 'user' => $value['user'],
  1172. 'cart' => $value['cart'],
  1173. 'order' => $value['order'],
  1174. 'payNum' => $value['payNum'],
  1175. 'pay' => $value['pay'],
  1176. 'cost' => $value['cost'],
  1177. 'refund' => $value['refund'],
  1178. 'refundNum' => $value['refundNum'],
  1179. 'changes' => $value['changes'] . '%'
  1180. ];
  1181. if ($type == 1) {
  1182. $export[] = $one_data;
  1183. if ($i == 0) {
  1184. $filekey = array_keys($one_data);
  1185. }
  1186. } else {
  1187. $export[] = array_values($one_data);
  1188. }
  1189. $i++;
  1190. }
  1191. }
  1192. if ($type == 1) {
  1193. return compact('header', 'filekey', 'export', 'filename');
  1194. } else {
  1195. return $this->export($header, $title, $export, $filename);
  1196. }
  1197. }
  1198. /**
  1199. * 用户统计
  1200. * @param array $data
  1201. * @param int $type
  1202. * @return array|mixed
  1203. */
  1204. public function userTrade($data = [], $type = 1)
  1205. {
  1206. $header = ['日期/时间', '访客数', '浏览量', '新增用户数', '成交用户数', '访客-支付转化率', '付费会员数', '充值用户数', '客单价'];
  1207. $title = ['用户统计', '用户统计' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1208. $filename = '用户统计_' . date('YmdHis', time());
  1209. $export = [];
  1210. $filekey = [];
  1211. if (!empty($data)) {
  1212. $i = 0;
  1213. foreach ($data as $value) {
  1214. $one_data = [
  1215. 'time' => $value['time'],
  1216. 'user' => $value['user'],
  1217. 'browse' => $value['browse'],
  1218. 'new' => $value['new'],
  1219. 'paid' => $value['paid'],
  1220. 'changes' => $value['changes'] . '%',
  1221. 'vip' => $value['vip'],
  1222. 'recharge' => $value['recharge'],
  1223. 'payPrice' => $value['payPrice'],
  1224. ];
  1225. if ($type == 1) {
  1226. $export[] = $one_data;
  1227. if ($i == 0) {
  1228. $filekey = array_keys($one_data);
  1229. }
  1230. } else {
  1231. $export[] = array_values($one_data);
  1232. }
  1233. $i++;
  1234. }
  1235. }
  1236. if ($type == 1) {
  1237. return compact('header', 'filekey', 'export', 'filename');
  1238. } else {
  1239. return $this->export($header, $title, $export, $filename);
  1240. }
  1241. }
  1242. /**
  1243. * 导出积分兑换订单
  1244. * @param array $data
  1245. * @param int $type
  1246. * @return array|mixed
  1247. */
  1248. public function storeIntegralOrder($data = [], $type = 1)
  1249. {
  1250. $header = ['订单号', '电话', '收货人姓名', '收货人电话', '收货地址', '商品信息', '订单状态', '下单时间', '用户备注'];
  1251. $title = ['积分兑换订单导出', '订单信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())];
  1252. $filename = '积分兑换订单导出_' . date('YmdHis', time());
  1253. $export = [];
  1254. $filekey = [];
  1255. if (!empty($data)) {
  1256. $i = 0;
  1257. foreach ($data as $item) {
  1258. $one_data = [
  1259. 'order_id' => $item['order_id'],
  1260. 'phone' => $item['user_phone'],
  1261. 'real_name' => $item['real_name'],
  1262. 'user_phone' => $item['user_phone'],
  1263. 'user_address' => $item['user_address'],
  1264. 'goods_name' => $item['store_name'],
  1265. 'status_name' => $item['status_name'] ?? '未知状态',
  1266. 'add_time' => $item['add_time'],
  1267. 'mark' => $item['mark']
  1268. ];
  1269. if ($type == 1) {
  1270. $export[] = $one_data;
  1271. if ($i == 0) {
  1272. $filekey = array_keys($one_data);
  1273. }
  1274. } else {
  1275. $export[] = array_values($one_data);
  1276. }
  1277. $i++;
  1278. }
  1279. }
  1280. if ($type == 1) {
  1281. return compact('header', 'filekey', 'export', 'filename');
  1282. } else {
  1283. return $this->export($header, $title, $export, $filename);
  1284. }
  1285. }
  1286. /**
  1287. * 门店账单导出
  1288. * @param array $data
  1289. * @param int $type
  1290. * @return array|mixed
  1291. */
  1292. public function financeRecord($data = [], $name = '账单导出', $type = 1)
  1293. {
  1294. $header = ['交易单号', '关联订单', '交易时间', '交易金额', '支出收入', '交易人', '关联店员', '交易类型', '支付方式'];
  1295. $title = [$name, $name . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  1296. $filename = $name . date('YmdHis', time());
  1297. $export = [];
  1298. $filekey = [];
  1299. if (!empty($data)) {
  1300. $i = 0;
  1301. foreach ($data as $key => $item) {
  1302. $one_data = [
  1303. 'order_id' => $item['order_id'],
  1304. 'link_id' => $item['link_id'],
  1305. 'trade_time' => $item['trade_time'],
  1306. 'number' => $item['number'],
  1307. 'pm' => $item['pm'] == 1 ? '收入' : '支出',
  1308. 'user_nickname' => $item['user_nickname'],
  1309. 'staff_name' => $item['staff_name'] ?? '',
  1310. 'type_name' => $item['type_name'],
  1311. 'pay_type_name' => $item['pay_type_name'],
  1312. ];
  1313. if ($type == 1) {
  1314. $export[] = $one_data;
  1315. if ($i == 0) {
  1316. $filekey = array_keys($one_data);
  1317. }
  1318. } else {
  1319. $export[] = array_values($one_data);
  1320. }
  1321. $i++;
  1322. }
  1323. }
  1324. if ($type == 1) {
  1325. return compact('header', 'filekey', 'export', 'filename');
  1326. } else {
  1327. return $this->export($header, $title, $export, $filename);
  1328. }
  1329. }
  1330. /**
  1331. * 供应商账单导出
  1332. * @param array $data
  1333. * @param int $type
  1334. * @return array|mixed
  1335. */
  1336. public function SupplierFinanceRecord($data = [], $name = '账单导出', $type = 1)
  1337. {
  1338. $header = ['交易单号', '关联订单', '交易时间', '交易金额', '支出收入', '交易人', '交易类型', '支付方式'];
  1339. $title = [$name, $name . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  1340. $filename = $name . date('YmdHis', time());
  1341. $export = [];
  1342. $filekey = [];
  1343. if (!empty($data)) {
  1344. $i = 0;
  1345. foreach ($data as $key => $item) {
  1346. $one_data = [
  1347. 'order_id' => $item['order_id'],
  1348. 'link_id' => $item['link_id'],
  1349. 'trade_time' => $item['trade_time'],
  1350. 'number' => $item['number'],
  1351. 'pm' => $item['pm'] == 1 ? '收入' : '支出',
  1352. 'user_nickname' => $item['user_nickname'],
  1353. 'type_name' => $item['type_name'],
  1354. 'pay_type_name' => $item['pay_type_name'],
  1355. ];
  1356. if ($type == 1) {
  1357. $export[] = $one_data;
  1358. if ($i == 0) {
  1359. $filekey = array_keys($one_data);
  1360. }
  1361. } else {
  1362. $export[] = array_values($one_data);
  1363. }
  1364. $i++;
  1365. }
  1366. }
  1367. if ($type == 1) {
  1368. return compact('header', 'filekey', 'export', 'filename');
  1369. } else {
  1370. return $this->export($header, $title, $export, $filename);
  1371. }
  1372. }
  1373. /**
  1374. * @param array $data
  1375. * @param int $type
  1376. * @return array|mixed
  1377. */
  1378. public function vipOrder(array $data, int $type = 1)
  1379. {
  1380. $header = ['订单号', '用户名', '手机号', '会员类型', '有效期限', '支付金额', '支付方式', '购买时间', '到期时间'];
  1381. $title = ['会员订单', '会员订单' . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  1382. $filename = '会员订单' . date('YmdHis', time());
  1383. $export = [];
  1384. $filekey = [];
  1385. if (!empty($data)) {
  1386. $i = 0;
  1387. foreach ($data as $key => $item) {
  1388. $one_data = [
  1389. 'order_id' => $item['order_id'],
  1390. 'nickname' => $item['user']['nickname'] ?? '',
  1391. 'phone' => $item['user']['phone'] ?? '',
  1392. 'member_type' => $item['member_type'],
  1393. 'vip_day' => $item['vip_day'],
  1394. 'pay_price' => $item['pay_price'],
  1395. 'pay_type' => $item['pay_type'],
  1396. 'pay_time' => $item['pay_time'],
  1397. 'overdue_time' => $item['overdue_time']
  1398. ];
  1399. if ($type == 1) {
  1400. $export[] = $one_data;
  1401. if ($i == 0) {
  1402. $filekey = array_keys($one_data);
  1403. }
  1404. } else {
  1405. $export[] = array_values($one_data);
  1406. }
  1407. $i++;
  1408. }
  1409. }
  1410. if ($type == 1) {
  1411. return compact('header', 'filekey', 'export', 'filename');
  1412. } else {
  1413. return $this->export($header, $title, $export, $filename);
  1414. }
  1415. }
  1416. /**
  1417. * 发票导出
  1418. * @param array $data
  1419. * @param int $type
  1420. * @return array|mixed
  1421. */
  1422. public function invoiceRecord(array $data, int $type = 1)
  1423. {
  1424. $header = ['订单号', '订单金额', '发票类型', '发票抬头类型', '发票抬头名称', '下单时间', '开票状态', '订单状态'];
  1425. $title = ['发票导出', '发票导出' . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  1426. $filename = '发票导出' . date('YmdHis', time());
  1427. $export = [];
  1428. $filekey = [];
  1429. if (!empty($data)) {
  1430. $i = 0;
  1431. foreach ($data as $key => $item) {
  1432. $one_data = [
  1433. 'order_id' => $item['order_id'],
  1434. 'pay_price' => $item['pay_price'],
  1435. 'type' => $item['type'] == 1 ? '电子普通发票' : '纸质专用发票',
  1436. 'header_type' => $item['header_type'] == 1 ? '个人' : '企业',
  1437. 'name' => $item['name'],
  1438. 'add_time' => $item['add_time'],
  1439. 'is_invoice' => $item['is_invoice'] == 1 ? '已开票' : '未开票'
  1440. ];
  1441. if ($item['refund_status'] > 0) {
  1442. if ($item['refund_status'] == 1) {
  1443. $one_data['status'] = '退款中';
  1444. } else {
  1445. $one_data['status'] = '已退款';
  1446. }
  1447. } else {
  1448. if ($item['status'] == 0) {
  1449. $one_data['status'] = '未发货';
  1450. } elseif ($item['status'] == 1) {
  1451. $one_data['status'] = '待收货';
  1452. } elseif ($item['status'] == 2) {
  1453. $one_data['status'] = '待评价';
  1454. } elseif ($item['status'] == 3) {
  1455. $one_data['status'] = '已完成';
  1456. }
  1457. }
  1458. if ($type == 1) {
  1459. $export[] = $one_data;
  1460. if ($i == 0) {
  1461. $filekey = array_keys($one_data);
  1462. }
  1463. } else {
  1464. $export[] = array_values($one_data);
  1465. }
  1466. $i++;
  1467. }
  1468. }
  1469. if ($type == 1) {
  1470. return compact('header', 'filekey', 'export', 'filename');
  1471. } else {
  1472. return $this->export($header, $title, $export, $filename);
  1473. }
  1474. }
  1475. /**
  1476. * 系统表单收集数据导出
  1477. * @param array $data
  1478. * @param int $type
  1479. * @return array|mixed
  1480. */
  1481. public function systemFormData(array $data, int $type = 1)
  1482. {
  1483. $header = ['模版名称', '用户UID', '用户昵称', '手机号', '模版内容', '创建时间'];
  1484. $title = ['系统表单收集数据导出', '表单收集数据导出' . time(), '生成时间:' . date('Y-m-d H:i:s', time())];
  1485. $filename = '系统表单收集数据导出' . date('YmdHis', time());
  1486. $export = [];
  1487. $filekey = [];
  1488. if (!empty($data)) {
  1489. $i = 0;
  1490. foreach ($data as $key => $item) {
  1491. $one_data = [
  1492. 'system_form_name' => $item['system_form_name'] ?? '',
  1493. 'uid' => $item['uid'] ?? 0,
  1494. 'nickname' => $item['nickname'] ?? '',
  1495. 'phone' => $item['phone'] ?? '',
  1496. 'form_data' => is_string($item['value']) ? json_decode($item['value']) : $item['value'],
  1497. 'add_time' => $item['add_time'],
  1498. ];
  1499. if ($type == 1) {
  1500. $export[] = $one_data;
  1501. if ($i == 0) {
  1502. $filekey = array_keys($one_data);
  1503. }
  1504. } else {
  1505. $export[] = array_values($one_data);
  1506. }
  1507. $i++;
  1508. }
  1509. }
  1510. if ($type == 1) {
  1511. return compact('header', 'filekey', 'export', 'filename');
  1512. } else {
  1513. return $this->export($header, $title, $export, $filename);
  1514. }
  1515. }
  1516. }