ExportFileService.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <?php
  2. namespace App\Service;
  3. use App\Exports\ExportOrder;
  4. use App\Model\Freight;
  5. use App\Model\GiveOut;
  6. use App\Model\Product;
  7. use App\Model\RevenueCost;
  8. use App\Model\RevenueCostTotal;
  9. use Illuminate\Support\Facades\DB;
  10. use Maatwebsite\Excel\Facades\Excel;
  11. class ExportFileService extends Service
  12. {
  13. //导出文件
  14. const type_one = 1;
  15. const type_two = 2;
  16. const type_three = 3;
  17. const type_four = 4;
  18. const type_five = 5;
  19. const type_six = 6;
  20. const type_seven = 7;
  21. const type_eight = 8;
  22. const type_nine = 9;
  23. const type_ten = 10;
  24. const type_eve = 11;
  25. const type_twl = 12;
  26. //导出文件方法
  27. protected static $fuc = [
  28. self::type_one => 'one',
  29. self::type_two => 'two',
  30. self::type_three => 'three',
  31. self::type_four => 'four',
  32. self::type_five => 'five',
  33. self::type_six => 'six',
  34. self::type_seven => 'seven',
  35. self::type_eight => 'eight',
  36. self::type_nine => 'nine',
  37. self::type_ten => 'ten',
  38. self::type_eve => 'eve',
  39. self::type_twl => 'twl',
  40. ];
  41. protected static $fuc_name = [
  42. self::type_one => '存货',
  43. self::type_two => '运费设置',
  44. self::type_three => '收入成本统计表',
  45. self::type_four => '销货单统计表',
  46. self::type_five => '销售发票统计表',
  47. self::type_six => '回款单统计表',
  48. self::type_seven => '发放统计表',
  49. self::type_eight => '利润分配统计表',
  50. self::type_nine => '虚拟采购单',
  51. self::type_ten => '客户',
  52. self::type_eve => '现存量',
  53. self::type_twl => '库存台账',
  54. ];
  55. public static $filename = "";
  56. //导出的方式 0 选择导出的数据 1 查询后 导出指定的数据(最多每次一千条)
  57. public static $export_type = [
  58. 0,
  59. 1
  60. ];
  61. public function exportAll($data,$user){
  62. if(empty($data['type']) || ! isset(self::$fuc[$data['type']])) return [false,'导出文件类型错误或者不存在'];
  63. self::$filename = self::$fuc_name[$data['type']] ?? "";
  64. $export_type = $data['export_type'] ?? 0;
  65. if(! isset(self::$export_type[$export_type])) return [false,'导出文件方式错误或者不存在'];
  66. if(empty($export_type)){
  67. if(empty($data['id'])) return [false,'请选择导出数据'];
  68. }else{
  69. if(empty($data['order_search'])) return [false,'搜索条件不能为空'];
  70. $search = $data['order_search'];
  71. if(empty($search['page_index'])) return [false,'请选择导出数据的开始页码'];
  72. if(empty($search['page_size'])) return [false,'请选择导出数据的条数'];
  73. if($search['page_size'] > 5000) return [false,'请选择导出数据的条数每次最多5000条'];
  74. list($status,$id) = $this->getListForSearch($data, $user);
  75. if(! $status) return [false, $id];
  76. $data['id'] = $id;
  77. }
  78. $function = self::$fuc[$data['type']];
  79. $return = $this->$function($data,$user);
  80. return [true, $return];
  81. }
  82. private function fillData($data, $column, &$return){
  83. foreach ($data as $value) {
  84. $tmp = [];
  85. foreach ($column as $c_v){
  86. $tmp[$c_v] = $value[$c_v] ?? "";
  87. }
  88. $return[] = $tmp;
  89. }
  90. }
  91. public function one($ergs,$user){
  92. $id = $ergs['id'];
  93. // 导出数据
  94. $return = [];
  95. $header_default = config("header.62") ?? [];
  96. $column = array_column($header_default,'key');
  97. $header = array_column($header_default,'value');
  98. DB::table('product')
  99. ->where('del_time',0)
  100. ->whereIn('id', $id)
  101. ->select(Product::$field)
  102. ->orderBy('id','desc')
  103. ->chunkById(500,function ($data) use(&$return,$column){
  104. $data = Collect($data)->map(function ($object) {
  105. return (array)$object;
  106. })->toArray();
  107. $this->fillData($data, $column, $return);
  108. });
  109. return $this->saveExportData($return,$header);
  110. }
  111. public function two($ergs,$user){
  112. $id = $ergs['id'];
  113. // 导出数据
  114. $return = [];
  115. $header_default = config("header.66") ?? [];
  116. $column = array_column($header_default,'key');
  117. $header = array_column($header_default,'value');
  118. DB::table('freight')
  119. ->where('del_time',0)
  120. ->whereIn('id', $id)
  121. ->select(Freight::$field)
  122. ->orderBy('id','desc')
  123. ->chunkById(500,function ($data) use(&$return,$column){
  124. $data = Collect($data)->map(function ($object) {
  125. return (array)$object;
  126. })->toArray();
  127. $this->fillData($data, $column, $return);
  128. });
  129. return $this->saveExportData($return,$header);
  130. }
  131. public function three($ergs,$user){
  132. $id = $ergs['id'];
  133. // 导出数据
  134. $return = [];
  135. $header_default = config("header.68") ?? [];
  136. $column = array_column($header_default,'key');
  137. $header = array_column($header_default,'value');
  138. DB::table('revenue_cost_total')
  139. ->where('del_time',0)
  140. ->whereIn('id', $id)
  141. ->select(RevenueCostTotal::$field)
  142. ->orderBy('id','desc')
  143. ->chunkById(500,function ($data) use(&$return,$column){
  144. $data = Collect($data)->map(function ($object) {
  145. return (array)$object;
  146. })->toArray();
  147. $list['data'] = $data;
  148. //订单数据
  149. $service = new StatisticsService();
  150. $list = $service->statisticsRevenueCostFillData($list);
  151. $this->fillData($list['data'], $column, $return);
  152. });
  153. return $this->saveExportData($return,$header);
  154. }
  155. public function four($ergs,$user){
  156. $id = $ergs['id'];
  157. // 导出数据
  158. $return = [];
  159. $header_default = config("header.69") ?? [];
  160. $column = array_column($header_default,'key');
  161. $header = array_column($header_default,'value');
  162. DB::table('revenue_cost')
  163. ->where('del_time',0)
  164. ->whereIn('id', $id)
  165. ->select(RevenueCost::$field_xhd)
  166. ->orderBy('id','desc')
  167. ->chunkById(500,function ($data) use(&$return, $column){
  168. $data = Collect($data)->map(function ($object) {
  169. return (array)$object;
  170. })->toArray();
  171. $list['data'] = $data;
  172. //订单数据
  173. $service = new StatisticsService();
  174. $list = $service->statisticsRevenueCostOneAndTwoFillData($list);
  175. $this->fillData($list['data'], $column, $return);
  176. });
  177. return $this->saveExportData($return,$header);
  178. }
  179. public function five($ergs,$user){
  180. $id = $ergs['id'];
  181. // 导出数据
  182. $return = [];
  183. $header_default = config("header.70") ?? [];
  184. $column = array_column($header_default,'key');
  185. $header = array_column($header_default,'value');
  186. DB::table('revenue_cost')
  187. ->where('del_time',0)
  188. ->whereIn('id', $id)
  189. ->select(RevenueCost::$field_xsfp)
  190. ->orderBy('id','desc')
  191. ->chunkById(500,function ($data) use(&$return, $column){
  192. $data = Collect($data)->map(function ($object) {
  193. return (array)$object;
  194. })->toArray();
  195. $list['data'] = $data;
  196. //订单数据
  197. $service = new StatisticsService();
  198. $list = $service->statisticsRevenueCostOneAndTwoFillData($list);
  199. $this->fillData($list['data'], $column, $return);
  200. });
  201. return $this->saveExportData($return,$header);
  202. }
  203. public function six($ergs,$user){
  204. $id = $ergs['id'];
  205. $field = RevenueCost::$field_hkd_main;
  206. $field[] = DB::raw('sum(payment_amount) as payment_amount');
  207. $field[] = DB::raw('sum(price_4_total) as price_4_total');
  208. $field[] = DB::raw('sum(profit) as profit');
  209. // 导出数据
  210. $return = [];
  211. $header_default = config("header.71") ?? [];
  212. $column = array_column($header_default,'key');
  213. $header = array_column($header_default,'value');
  214. DB::table('revenue_cost')
  215. ->where('del_time',0)
  216. ->whereIn('order_id', $id)
  217. ->where('order_type',RevenueCost::ORDER_THREE)
  218. ->select($field)
  219. ->groupby('order_id')
  220. ->orderBy('id','desc')
  221. ->chunkById(500,function ($data) use(&$return, $column){
  222. $data = Collect($data)->map(function ($object) {
  223. return (array)$object;
  224. })->toArray();
  225. $list['data'] = $data;
  226. //订单数据
  227. $service = new StatisticsService();
  228. $list = $service->statisticsRevenueCostThreeFillData($list);
  229. $this->fillData($list['data'], $column, $return);
  230. },'order_id');
  231. return $this->saveExportData($return,$header);
  232. }
  233. public function seven($ergs,$user){
  234. $id = $ergs['id'];
  235. // 导出数据
  236. $return = [];
  237. $header_default = config("header.72") ?? [];
  238. $column = array_column($header_default,'key');
  239. $header = array_column($header_default,'value');
  240. DB::table('give_out')
  241. ->where('del_time',0)
  242. ->whereIn('id', $id)
  243. ->select(GiveOut::$field)
  244. ->orderBy('id','desc')
  245. ->chunkById(500,function ($data) use(&$return, $column){
  246. $data = Collect($data)->map(function ($object) {
  247. return (array)$object;
  248. })->toArray();
  249. $list['data'] = $data;
  250. //订单数据
  251. $service = new GiveOutService();
  252. $list = $service->fillData($list);
  253. $this->fillData($list['data'], $column, $return);
  254. });
  255. return $this->saveExportData($return,$header);
  256. }
  257. public function eight($ergs,$user){
  258. $id = $ergs['id'];
  259. $field = RevenueCost::$field_hkd_profit_main;
  260. $field[] = DB::raw('COALESCE(SUM(rc.payment_amount), 0) AS payment_amount');
  261. $type = RevenueCost::ORDER_THREE;
  262. $return = [];
  263. $header_default = config("header.74") ?? [];
  264. $column = array_column($header_default, 'key');
  265. $header = array_column($header_default, 'value');
  266. DB::table('employee_index')
  267. ->where('employee_index.del_time', 0)
  268. ->whereIn('employee_index.id', $id)
  269. ->leftJoin(DB::raw('revenue_cost as rc'), function ($join) use ($type) {
  270. $join->on('rc.employee_id_2', '=', 'employee_index.employee_id')
  271. ->where('rc.del_time', 0)
  272. ->where('rc.order_type', $type)
  273. ->whereRaw('rc.order_time >= employee_index.start_time')
  274. ->whereRaw('rc.order_time <= employee_index.end_time');
  275. })
  276. ->select($field)
  277. ->groupBy('employee_index.employee_id', 'employee_index.start_time', 'employee_index.end_time')
  278. ->orderBy('employee_index.end_time','desc')
  279. ->chunkById(500, function ($data) use (&$return, $column) {
  280. $data = Collect($data)->map(function ($object) {
  281. return (array)$object;
  282. })->toArray();
  283. $list['data'] = $data;
  284. //订单数据
  285. $service = new StatisticsService();
  286. $list = $service->statisticsProfitFillData($list);
  287. $this->fillData($list['data'], $column, $return);
  288. });
  289. return $this->saveExportData($return,$header);
  290. }
  291. public function getListForSearch($ergs, $user){
  292. $data = $ergs['order_search'];
  293. $id = [];
  294. if($ergs['type'] == self::type_one){
  295. $service = new ProductService();
  296. $model = $service->productCommon($data, $user, ['id']);
  297. $return = $this->limitData($model,'',$data);
  298. $id = array_column($return,'id');
  299. }elseif ($ergs['type'] == self::type_two){
  300. $service = new FreightService();
  301. $model = $service->freightCommon($data, $user, ['id']);
  302. $return = $this->limitData($model,'',$data);
  303. $id = array_column($return,'id');
  304. }elseif ($ergs['type'] == self::type_three){
  305. $service = new StatisticsService();
  306. list($status, $model) = $service->statisticsRevenueCostCommon($data, $user, ['id']);
  307. if(! $status) return [false, $model];
  308. $return = $this->limitData($model,'',$data);
  309. $id = array_column($return,'id');
  310. }elseif ($ergs['type'] == self::type_four || $ergs['type'] == self::type_five){
  311. if(empty($data['order_type'])){
  312. if($ergs['type'] == self::type_four){
  313. $data['order_type'] = RevenueCost::ORDER_ONE;
  314. }else{
  315. $data['order_type'] = RevenueCost::ORDER_TWO;
  316. }
  317. }
  318. $service = new StatisticsService();
  319. list($status, $model) = $service->statisticsRevenueCostOneAndTwoCommon($data, $user, ['id']);
  320. if(! $status) return [false, $model];
  321. $return = $this->limitData($model,'',$data);
  322. $id = array_column($return,'id');
  323. }elseif ($ergs['type'] == self::type_six){
  324. $service = new StatisticsService();
  325. list($status, $model) = $service->statisticsRevenueCostThreeCommon($data, $user, ['order_id']);
  326. if(! $status) return [false, $model];
  327. $return = $this->limitData($model,'',$data);
  328. $id = array_column($return,'order_id');
  329. }elseif ($ergs['type'] == self::type_seven){
  330. $service = new GiveOutService();
  331. $model = $service->giveOutCommon($data, $user, ['id']);
  332. $return = $this->limitData($model,'',$data);
  333. $id = array_column($return,'id');
  334. }elseif ($ergs['type'] == self::type_eight){
  335. $service = new StatisticsService();
  336. list($status,$model) = $service->statisticsProfitCommon($data, $user, ['employee_index.id']);
  337. if(! $status) return [false, $model];
  338. $return = $this->limitData($model,'',$data);
  339. $id = array_column($return,'id');
  340. }
  341. return [true, $id];
  342. }
  343. public function saveExportData($data, $headers, $type = 'default',$file_name = ''){
  344. if(empty($file_name)) $file_name = self::$filename . "_". date("Y-m-d") . "_". rand(1000,9999);
  345. $filename = $file_name . '.' . 'xlsx';
  346. $bool = Excel::store(new ExportOrder($data,$type,$headers),"/public/export/{$filename}", null, 'Xlsx', []);
  347. return $filename;
  348. }
  349. }