UNPKG

flexbiz-server

Version:

Flexible Server

15 lines (14 loc) 6.88 kB
const fs=require("fs"),path=require("path"),async=require("async"),_=require("lodash"),excel=require("../libs/excel"),StaticPool=require("../libs/WorkerStaticPool"),{JSONParser}=require("../libs/utils"),importFromExcel=($ctrl$$,$req$$,$mainCallback$$)=>{const $name$$=$ctrl$$.name;async.series([function($callback$$){setImmediate(async()=>{if(!$req$$.files.xlsx)return $callback$$({error:"Kh\u00f4ng t\u00ecm th\u1ea5y file xlsx"});let $parseOptions$$={};Logger.info("[importFromExcel] read file excel"); let $map_root$$=configs.paths.maps,$map_file$$;$map_root$$&&($map_file$$=$map_root$$+"/"+$name$$+".js");$map_file$$&&fs.existsSync($map_file$$)||($map_file$$=path.dirname(__dirname)+"/maps/"+$name$$+".js");fs.existsSync($map_file$$)&&($parseOptions$$=await new Promise($resolve$$=>{setImmediate(()=>{$resolve$$(require($map_file$$))})}));if($ctrl$$.options.onPreExcelParse){const $onPreExcelParse$$=$ctrl$$.options.onPreExcelParse;await new Promise($resolve$$=>{setImmediate(()=>{$onPreExcelParse$$($parseOptions$$); $resolve$$()})})}let $filePath$$=$req$$.files.xlsx.path;Logger.info("[importFromExcel] parse file excel");excel.parse($filePath$$,function($e$$,$data$$,$columns$$){setImmediate(()=>{fs.unlink($filePath$$,function($e$$){$e$$&&Logger.error("[importFromExcel] Can't delete file tmp:"+$filePath$$,$e$$)});if($e$$)return Logger.error("[importFromExcel] error parse excel file",$e$$),$e$$.error?$callback$$($e$$):$callback$$({error:$e$$.message||$e$$});$data$$=$data$$.filter($d$$=>Object.keys($d$$).length> 0);if($data$$.length>5E4)return Logger.info("[importFromExcel] Data is too large",$data$$.length),$callback$$({error:"S\u1ed1 d\u00f2ng import qu\u00e1 l\u1edbn. M\u1ed7i l\u1ea7n import ch\u1ec9 \u0111\u01b0\u1ee3c ph\u00e9p t\u1ed1i \u0111a 50 000 d\u00f2ng"});$ctrl$$.excelParse&&$ctrl$$.excelParse($data$$,$columns$$);var $dir_workers_poolName$$=configs.paths.workers;let $onImportProcess$$;$dir_workers_poolName$$&&($onImportProcess$$=$dir_workers_poolName$$+"/"+$name$$.toLowerCase()+"OnImport.js"); $onImportProcess$$&&fs.existsSync($onImportProcess$$)||($dir_workers_poolName$$=path.dirname(__dirname)+"/workers",$onImportProcess$$=$dir_workers_poolName$$+"/"+$name$$.toLowerCase()+"OnImport.js");fs.existsSync($onImportProcess$$)?($dir_workers_poolName$$=`${$name$$}excelParsePool`,global[$dir_workers_poolName$$]||(global[$dir_workers_poolName$$]=new StaticPool($onImportProcess$$,0,1)),global[$dir_workers_poolName$$].exec({user:$req$$.user,data:$data$$,columns:$columns$$,configs:{database:configs.database}}, $response$$=>{if($response$$.error)return $callback$$({error:$response$$.error||"\u0110\u00e3 c\u00f3 l\u1ed7i khi x\u1eed l\u00fd d\u1eef li\u1ec7u"});$req$$.data=$response$$.data||$data$$;$req$$.columns=$response$$.columns||$columns$$;$callback$$()})):$ctrl$$.options.onImport?(Logger.info("[importFromExcel] [onImport]..."),$ctrl$$.options.onImport($req$$.user,$data$$,$columns$$,function($e$$,$new_data$$){setImmediate(()=>{if($e$$)return Logger.error("[importFromExcel] [onImport]",$e$$),$e$$.error? $callback$$($e$$):$callback$$({error:$e$$.message||$e$$});$req$$.data=$new_data$$||$data$$;$req$$.columns=$columns$$;$callback$$()})})):(Logger.info("[importFromExcel] \u0111\u00e3 ho\u00e0n th\u00e0nh import..."),setImmediate(()=>{$req$$.data=$data$$;$req$$.columns=$columns$$;$callback$$()}))})},$parseOptions$$)})},function($callback$$){Logger.info("[importFromExcel] prepare data...");let $data$$=$req$$.data;var $columns$$=$req$$.columns;$columns$$._error||($columns$$._error="Error");let $master_columns$$= [],$detail_col$$,$details$$={},$detail_yn$$=!1;for(let $column_name$$ in $columns$$)$column_name$$.indexOf("$")>0?($detail_yn$$=!0,$columns$$=$column_name$$.split("$")[0],$detail_col$$=$column_name$$.split("$")[1],$details$$[$columns$$]||($details$$[$columns$$]={},$details$$[$columns$$].columns=[]),$details$$[$columns$$].columns.push($detail_col$$)):$master_columns$$.push($column_name$$);if(!$detail_yn$$)return $callback$$();let $data_new$$=[],$row_master$$,$row_master_exists$$;async.mapLimit($data$$, 100,($row$$,$cb$$)=>{setImmediate(()=>{$row_master$$={exfields:{}};$row_master_exists$$=null;$master_columns$$.forEach(function($column$$){if($column$$.indexOf("exfields.")===0){let $_c$$=$column$$.replace("exfields.","");$row_master$$.exfields[$_c$$]=$row$$[$column$$]}else $row_master$$[$column$$]=$row$$[$column$$]});for(let $i$$=0;$i$$<$data_new$$.length;$i$$++){let $m$$=$data_new$$[$i$$],$is_eq$$=!0;$master_columns$$.forEach(function($column$$){_.isEqual($m$$[$column$$],$row_master$$[$column$$])|| ($is_eq$$=!1)});$is_eq$$&&($row_master_exists$$=$m$$)}$row_master_exists$$?$row_master$$=$row_master_exists$$:$data_new$$.push($row_master$$);let $row_detail$$;for(let $detail_name$$ in $details$$)$row_detail$$={},$details$$[$detail_name$$].columns.forEach(function($column$$){$row$$[$detail_name$$+"$"+$column$$]&&($row_detail$$[$column$$]=$row$$[$detail_name$$+"$"+$column$$])}),$row_master$$[$detail_name$$]||($row_master$$[$detail_name$$]=[]),_.keys($row_detail$$).length>0&&$row_master$$[$detail_name$$].push($row_detail$$); $cb$$()})},()=>{$req$$.data=$data_new$$;$callback$$()})},function($callback$$){setImmediate(async()=>{let $data$$=$req$$.data||[],$columns$$=$req$$.columns;for(let $row$$ of $data$$){let $_first$$=$row$$._first;$_first$$&&$_first$$.length>0&&_.extend($row$$,$_first$$[0])}let $values$$=$req$$.query.values;if($values$$){try{$values$$=JSONParser($values$$)}catch($e$$){Logger.error("[importFromExcel] parse value",$e$$)}$values$$&&$data$$.forEach($row$$=>{for(let $key$$ in $values$$)$row$$[$key$$]=$values$$[$key$$]})}$ctrl$$.import($req$$.user, $req$$.user.current_id_app,$data$$,async($e$jscomp$4_message$$,$rs$$)=>{global.getModel("log").create({id_app:$req$$.user.current_id_app,id_func:$ctrl$$.name,action:"IMPORTEXCEL",data:{data:$data$$,columns:$columns$$,status_task:$req$$.status_task},result:{error:$e$jscomp$4_message$$,result:$rs$$,finished_at:new Date}},$req$$.user.email,$req$$.user_agent,$req$$);if($e$jscomp$4_message$$)return Logger.error("[importFromExcel] import",$e$jscomp$4_message$$),$e$jscomp$4_message$$.error?($e$jscomp$4_message$$.message= $e$jscomp$4_message$$.message||$e$jscomp$4_message$$.error,$callback$$($e$jscomp$4_message$$)):$callback$$({error:$e$jscomp$4_message$$.message||$e$jscomp$4_message$$,message:$e$jscomp$4_message$$.message||$e$jscomp$4_message$$});$rs$$.rows_error.length===0?($req$$.result=$rs$$,$callback$$()):($e$jscomp$4_message$$=[...(new Set($rs$$.rows_error.map($r$$=>[...(new Set($r$$.error.map($r$$=>$r$$.error||$r$$)))].join(", "))))].join(", "),$callback$$({message:$e$jscomp$4_message$$,error:$rs$$.error||$rs$$}))}, {replace:$req$$.query.update===!0||$req$$.query.update=="true",req:$req$$})})}],$e$$=>{if($e$$)return $mainCallback$$($e$$);$mainCallback$$(null,$req$$.result)})};module.exports=importFromExcel;