/* NAME: DESCRIPTION: ; PARAMETER: [ { name : 'path', title : '资料路径', type : 'LineEdit', property : {tool_tip : '存放所有料号的文件夹路径,不需要进入到料号文件夹内'}, }, { name : 'customer', title : '客户配置', type : 'LineEdit', property : {tool_tip : '客户配置'}, }, { name : 'config_path', title : '配置地址', type : 'LineEdit', property : {tool_tip : '配置的路径'}, } ] VERSION_HISTORY: V1.01 2020-04-15 Scott Sun 1.新版本 HELP:

功能简介

客户数据导入


参数配置

料号 和 客户配置


注意事项


*/ ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// // 引入模块 包 console.log("=============================================>input_start"); console.log("=============================================>input_start"); console.log("=============================================>input_start"); console.log("=============================================>input_start"); var $ = require('topcam.scriptfunc').argv(); var fs = require('fs'); var _ = require('lodash'); var database = require("topsin.database"); database.addConnection($.conf.database_conf, "DFM"); var QDfm = database.query("DFM"); if ($.conf.product_type == "aimdfm") { QDfm.updateRow({ table: "pdm_aimdfm_task", data: { current_process_title: $.process_title }, where: { id: $.task_id } }); } var GEN = $.gen; var Job = $.job_name; var db = $.db; var Status = 'ok'; var resultData = []; var PAR = {}; if ($.hasOwnProperty('script_parameter')){ PAR = JSON.parse($.script_parameter); } if (!$.hasOwnProperty('config_path')){ PAR.config_path = "cam/input_data" } try { var par = PAR; console.log(par); if(!par.hasOwnProperty("customer")){throw "未填写配置"}; par.customer = par.customer[0].toUpperCase()+par.customer.slice(1).toLowerCase() var cfg = db.query("",function(q){ return q.selectValue({ table:'pub_conf', field:'text_data', where:{path : par.config_path} }) }); if (!cfg || cfg == ""){throw "cfg can not find"} var config = eval(cfg); if(!config.hasOwnProperty("customer")){throw "config error"} var job = Job; if(_.isEmpty(job)) throw "没有传入料号名!"; job = job.toLowerCase() // 如果genesis已经存在这个料号 err = delSameJob({job:job,delSame:config.delSameJob}); if(err){throw err}; var custCfg = config.customer[par.customer] if(!custCfg){throw "config error"} var step = custCfg.step.toLowerCase() // 获取路径下文件信息 var path = par.path || custCfg.path var pathInfo = fs.listDir(path, 1) // 判断存不存在料号文件 var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job}) if(jobFile.length == 0){throw "job file is not exist"} var jobFiles = [] // 记录要分析的文件 if (!jobFile[0].isDir) { jobFiles.push(jobFile[0]) } else { jobFiles = fs.listDir(jobFile[0].path) } // 分析料号文件 得到料号导入信息 导入类型 var jobInfo = analyJobFiles({jobFiles:jobFiles.filter(function(v){return v.isFile}),custCfg:custCfg,config:config,job:job }) if(jobInfo.data.length == 0){throw "file error"} var importOk = false; // 是否成功导入 if(/odb/ig.test(jobInfo.type)){ // odb导入 if(jobInfo.data.length == 1){ // 只分析到一个tgz文件 直接导入 var err = importJob({name:job,db:custCfg.db,path:jobInfo.data[0].file.path},config.delSameJob) if(err){throw err} } else { // 多个tgz文件 说明需要合并 var mergeFiles = jobInfo.data.filter(function(item){ var err = importJob({name:item.file.baseName,db:custCfg.db,path:item.file.path},config.delSameJob) if(err){throw err} return /yes/ig.test(item.format.isMerge) }) var arr_job = mergeFiles[0] var arr_step; var steplist = GEN.getStepList({job:arr_job.file.baseName}) if(steplist.indexOf(arr_job.format.arrStep) < 0){ arr_step = steplist[0] }else{arr_step = arr_job.format.arrStep} GEN.openJob({job:job}); GEN.openJob({job:arr_job.file.baseName}); GEN.copyStep({ // 合并 source_job:arr_job.file.baseName, source_name:arr_step, dest_job:job, dest_name:arr_step, }); GEN.closeJob({ job: arr_job.file.baseName }); GEN.deleteJob({ job: arr_job.file.baseName }); // 合并后 删除array的料号 } importOk = true } if(/gerber/ig.test(jobInfo.type)){ // gerber导入 GEN.createJob({name:job,db:custCfg.db}) GEN.createStep({job:job,name:step}) var gerberInfo = jobInfo.data.map(function(item){ var gerberCfg = JSON.parse(JSON.stringify(item.format)); var file = item.file gerberCfg.layer = file.name.toLowerCase() gerberCfg.path = file.path gerberCfg.format = item.type gerberCfg.job = job gerberCfg.step = step return gerberCfg }) GEN.COM("input_manual_reset") gerberInfo.forEach(function(v){ GEN.COM("input_manual_set",v) }) GEN.COM("input_manual") importOk = true } if(!importOk){throw "import error"} // 导入结束 var matrix = GEN.getMatrix({job:job}); comp = Object.keys(matrix).filter(function(v){ // 如果有comp层 删除 return /^comp_\+_/ig.test(v) }) if (comp.length > 0){ var tmp = GEN.getStepList({job:job}) GEN.openStep({job:job,name:tmp[0]}) GEN.COM("delete_comp") GEN.closeStep() } GEN.checkInout({job:job,mode:"out"}) // 结束保存料号 关闭料号 GEN.saveJob({ job: job }); GEN.checkInout({job:job,mode:"in"}) GEN.closeJob({job:job}) QDfm.updateRow({ table: "pdm_aimdfm_task", data: { progress: 33.33 }, where: { id: $.task_id } }); if (GEN.hasError()) { Status = 'error'; resultData.push({ type: "error", title: "GEN错误!", detail: [{ desc: _.join(GEN.STATUS, "\n") }] }); return { status: Status, result_data: resultData }; } else { resultData.push({ type: "info", title: "操作完成, 请注意检查!" }); return { status: Status, result_data: resultData }; } } catch (e) { Status = 'error'; console.log("====================================>error"); console.log(_.toString(e)); resultData.push({type: "error", title: "脚本执行出错!", detail: [{desc: _.toString(e)}]}); return {status: Status, result_data: resultData}; } function delSameJob(props){ var job = props.job var delSame = props.delSame if(GEN.isJobExists({job:job})){ if(/^yes$/ig.test(delSame)){ if(GEN.isJobOpen({job:job})){ GEN.closeJob({job:job}) } GEN.deleteJob({job:job}) } else { return "job "+ job+ " exist" } } } function analyJobFiles(props){ var files = props.jobFiles; var config = props.config; var job = props.job; var custCfg = props.custCfg; var rules = custCfg.rules; var paramsFile = files.filter(function(file){return /param/ig.test(file.baseName)}) var tmp_hash = {} paramsFile.forEach(function(file){ tmp_hash[file.baseName] = (function(){ var tmparr = fs.readFile(file.path).split("\n") var tmp = {} tmparr.map(function(v){ var arr = v.split(/\b\s+\b/) tmp[arr[0].replace(/-/ig,"_")] = arr[1] }) return tmp })() }) var fileInfo = files.reduce(function(a,file){ try { rules.forEach(function(item){ if(item.valid({file:file, job:job})){ var format = config.formats[item.format] var format1; if(item.format_params){ format1 = item.format_params({params:tmp_hash}) } if(format1){ throw {file:file,type:item.type,format:format1} }else{ throw {file:file,type:item.type,format:format} } } }) } catch (info) { a.push(info) } return a },[]) var odbfiles = fileInfo.filter(function(item){return /odb/ig.test(item.type)}) if(odbfiles.length == 0){ return { type: "Gerber", data: fileInfo } } else { return { type: "ODB", data: odbfiles } } } function importJob(props,delSameJob){ var name = props.name if (GEN.isJobExists({ job: name })) { if (/^yes$/ig.test(delSameJob)) { if(GEN.isJobOpen({ job: name })){ GEN.closeJob({ job: name }); } GEN.deleteJob({ job: name }); } else { return "job "+name+" exist"; } } GEN.importJob(props); }