

/*
NAME: 
DESCRIPTION: ;
PARAMETER:
    [
		{
			name : 'path',
			title : '资料路径',
			type : 'LineEdit',
			property : {tool_tip : '资料路径,必填'},
		},
		{
			name : 'db',
			title : '料号db',
			type : 'LineEdit',
			property : {tool_tip : '料号db,默认是genesis'},
		},
		{
			name : 'config_path',
			title : '配置地址',
			type : 'LineEdit',
			property : {tool_tip : '配置的路径'},
		}
	]
	
 VERSION_HISTORY:
	V1.00 2020-04-20 Scott Sun
	    1.新版本
		
 HELP:
 	<html><body bgcolor="#DDECFE">
		<font size="3" color="#003DB2"><p>功能简介</p></font>
		<p> 客户数据导入 </p>
		<br>
		<font size="3" color="#003DB2"><p>参数配置</p></font>
		<p> 料号 和 客户配置 </p>
		<br>
		<font size="3" color="#003DB2"><p>注意事项</p></font>
		<p> 无 </p>
		<br>
	</body></html>	
*/
//////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////
// 引入模块 包
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 JobId = $.job_id;
var db = $.db;
var Status = 'ok';
var resultData = [];
var PAR = {};
if ($.hasOwnProperty('script_parameter')){
	PAR = JSON.parse($.script_parameter);
}
try {
	var par = PAR;
	// var db_path = db.query("",function(q){
	// 	return q.selectValue({
	// 		table:'pub_conf',
	// 		field:'text_data',
	// 		where:{path : "quote-data-upload"}
	// 	})
	// });
	// if(_.isEmpty(db_path)){throw "quote-data-upload error"}
	if(!par.path || par.path == "") {throw "path error"}
	if(!par.hasOwnProperty("config_path") || par.config_path==""){
		console.log("========================cfg");
		par.config_path = "cam/input_data"
	};
	if(!par.hasOwnProperty("db") || par.db==""){
		console.log("========================db");
		par.db = "genesis"
	};
	var db_customer = db.query("",function(q){
		return q.selectValue({
			table:'pdm_job',
			field:'customer_code',
			where:{id : JobId}
		})
	});
	if(_.isEmpty(db_customer)){throw "customer error"}
	if(db_customer && !(/^done$/ig.test(db_customer)) && db_customer != "" ){
		par.customer = db_customer
	}
	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 "customer config error:"+par.customer}
	custCfg.db = par.db || custCfg.db
	var step = custCfg.step.toLowerCase()
	// 获取路径下文件信息
	var path = par.path
	console.log("=========  ====>path:"+ path)
	if(!fs.exists(path)){throw "path error"}
	var pathInfo = fs.listDir(path + "/" + db_customer.toLowerCase(), 1)
	// 判断存不存在料号文件
	var vc_position = db.query("",function(q){
		return q.selectValue({
			table:'pdm_job',
			field:'version',
			where:{id : JobId}
		})
	});
	var job_file_baseName = job
	// if(vc_position && vc_position != "" && !(/null/ig.test(vc_position))){
	// 	job_file_baseName = job_file_baseName + "_" + vc_position
	// }
	var jobFile = pathInfo.filter(function(v){return v.baseName.toLowerCase() == job_file_baseName})
	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文件 说明需要合并
			console.log("==========合并的情况");
			var jobs = jobInfo.data.map(function(item, i){
				var tmp_job_name = job + "_tmp_" + i
				var err = importJob({name:tmp_job_name,db:custCfg.db,path:item.file.path},config.delSameJob)
				if(err){throw err}
				return tmp_job_name
			})
			// 分析arr_job 和 pcs_job
			jobs = jobs.map(function(jobname){
				GEN.openJob({job:jobname});
				var step_tmp = GEN.getStepList({job:jobname})[0]
				var type = getStepType(step_tmp)
				return {
					jobname: jobname,
					stepname:  step_tmp,
					type: type
				}
			})

			var pcs_job = jobs.filter(function(v){return v.type == "pcs"})[0]
			var arr_job = jobs.filter(function(v){return v.type == "arr"})[0]
			GEN.copyStep({  // 合并
				source_job:arr_job.jobname,
				source_name:arr_job.stepname,
				dest_job:pcs_job.jobname,
				dest_name:arr_job.stepname,
			});
			GEN.closeJob({ job: arr_job.jobname });
			GEN.deleteJob({ job: arr_job.jobname });  // 合并后 删除array的料号
			// 修改pcs料号名称
			GEN.COM("rename_entity,job=,is_fw=no,type=job,fw_type=form,name="+pcs_job.jobname+",new_name="+job)
		}
		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
	console.log("======================>delsame:"+ 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);
}

function getStepType(step){
    if(/pcs|cad|orig/ig.test(step)){
        return "pcs"
    }
    if(/stp|arr/ig.test(step)){
        return "arr"
    }
    return pcs
}
