=head
 NAME: 
 DESCRIPTION: 共有函数,给到所有程序可以调用
 PARAMETER:{}
 
 VERSION_HISTORY:
	V1.00 2018-1-17 Cody Yu
		1.新版本
	V1.01 2020-12-2 Super
		1.修正料号获取
 HELP:
  <html><body>
	
  </body></html>
=cut

use utf8;
use Data::Dump 'dump';
use strict;
#my ($GEN,$JOB_ID,$DB,$DB2,$JOB,$GUI,$USER_NAME);

#(job=>genesis料号名,jobcategory=>'work|org');
sub ANALYSIS_STACKUP {
	my %par = @_;
	my $Job = $par{job};
	$par{jobcategory} = 'work' unless $par{jobcategory};
	my $layer_count = $GEN->getLayerCount(job=>$Job);
	my %matrix=$GEN->getMatrix(job=>$Job,type=>'hash');
    foreach my $layer (sort {$a->{row} <=> $b->{row}} values %matrix) {
		$layer->{odb_name} = $layer->{name};
		$layer->{name} = $layer->{tl_name};
		$layer->{type} = $layer->{tl_type};
		
		if ($layer->{context} eq 'board' and $layer->{layer_type} eq 'drill'){
			if ($layer->{odb_name} eq 'drl'){
				$layer->{name} = 'drill';
				$layer->{drl_start_num} = 1;
				$layer->{drl_end_num} = $layer_count;
				$layer->{drl_from_num} = 1;
				$layer->{drl_to_num} = $layer_count;
				$layer->{type} = 'main_drill';
			}
			elsif ($layer->{odb_name} =~/^drl(\d+)\-(\d+)$/){
				my $drl_star = $1;
				my $drl_end = $2;
				$layer->{name} = 'drill'.$drl_star.'-'.$drl_end;
				$layer->{drl_start_num} = $drl_star;
				$layer->{drl_end_num} = $drl_end;
				$layer->{drl_from_num} = $drl_star;
				$layer->{drl_to_num} = $drl_end;
				if( $drl_star == 1 and $drl_end == $layer_count ){
					$layer->{type} = 'main_drill';
				}else{
					if( $drl_star == 1 or $drl_end == $layer_count ){
						$layer->{type} = 'blind_drill';
					}
					else{
						$layer->{type} = 'bury_drill';
					}
				}
			}
			elsif ($layer->{odb_name} =~/^ls(\d+)\-(\d+)$/){
				my $drl_star = $1;
				my $drl_end = $2;
				$layer->{name} = 'ls'.$drl_star.'-'.$drl_end;
				$layer->{drl_start_num} = $drl_star;
				$layer->{drl_end_num} = $drl_end;
				$layer->{drl_from_num} = $drl_star;
				$layer->{drl_to_num} = $drl_end;
				$layer->{type} = 'laser_drill';
			}
		}
		else{
			$layer->{name} = '__'.$layer->{odb_name}.'__' unless $layer->{name};
			$layer->{type} = 'other' unless $layer->{type};
		}
		##更新部分key
		$layer->{odb_context} = $layer->{context};
		$layer->{odb_type} = $layer->{layer_type};
		$layer->{odb_polarity} = $layer->{polarity};
		$layer->{odb_side} = $layer->{side};
		$layer->{odb_row_num} = $layer->{row};
		$layer->{row_num} = $layer->{tl_num};
		##
    }
    return \%matrix;
}

sub GET_GEN_JOB{
	my %par = @_;
	my @joblist = @{$par{joblist}};
	my @jobs = grep({$_ =~ /$par{job}/}@joblist);

	##
	my $return_job;
	if( scalar(@jobs) == 1 ){
		$return_job = $jobs[0];
	}
	elsif( scalar(@jobs) == 2 ){
		if( grep({$_ eq $par{job}.'-new'}@joblist) ){
			$return_job = $par{job}.'-new';
		}
	}
	else{
		my %info;
		foreach my $job(@jobs){
			my ($time) = $job =~ /\-new(\d+)$/;
			next unless $time;
			$info{$job}{name} = $job;
			$info{$job}{time} = $time;
		}
		if( keys %info ){
			my @sort_jobs = keys %info;
			@sort_jobs = sort{$info{$b}{time}<=>$info{$a}{time}}@sort_jobs;
			$return_job = $sort_jobs[0];
		}
		else{
			if( grep({$_ eq $par{job}.'-new'}@joblist) ){
				$return_job = $par{job}.'-new';
			}
			else{
				$return_job = $jobs[0];
			}
		}
	}
	$return_job = $par{job} unless $return_job;
	return $return_job;
}

#上传层结构
#	doScript("XJX_Public");
#	UPLOAD_LAYER_MATRIX(job=>$Job,jobcategory=>'org');
#	UPLOAD_LAYER_MATRIX(job=>$Job,jobcategory=>'work');
#(job=>genesis料号名,jobcategory=>'work'|'org',releasestatus=>{l1=>'Release',l2=>'Block'})#如果上传成功返回undef,失败则返回错误代码
sub UPLOAD_LAYER_MATRIX{
	my %par = @_;
	my $Job = $par{job};
	my $matrix = ANALYSIS_STACKUP(job=>$Job);
	my $func = 'function(ARGV)
	{
		var jobId = ARGV["job_id"];
		var tableName = "pdm_job_" + ARGV["jobcategory"] + "_layer";
		//GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)});
		var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase());
		db.begin();
		try{
			var oLayers = db.selectMapMap({table:tableName, field:["odb_name","release_status"], where:{job_id:jobId}, uniquefield:"odb_name"});
			if (db.lastError().isValid()) throw db.lastError();
			//GUI.msgbox({text: TDataParse.variant2JsonStr(oLayers)});
			
			db.deleteRow({table:tableName, where:{job_id:jobId}});
			if (db.lastError().isValid()) throw db.lastError();
			
			var fieldLst = ["name", "odb_context", "odb_type", "odb_polarity", "odb_side", "drl_start", "drl_end",
					 "row_num", "type", "drl_start_num", "drl_end_num", "drl_from_num", "drl_to_num", "drl_connect_to", 
					 "odb_name", "side", "stackup_num", "customer_field", "input_file_name", "odb_row_num"];
			
			for (var i=0;i<ARGV["layers"].length;i++)
			{
				layerName = ARGV["layers"][i];
				var layerInfo = ARGV["matrix"][layerName];
				var tmpData = {"job_id":jobId, "name": layerInfo["name"]};
				if (ARGV["releasestatus"] != undefined && ARGV["releasestatus"] != null && ARGV["releasestatus"].length>0
					&& ARGV["releasestatus"][layerInfo["odb_name"]] != undefined && ARGV["releasestatus"][layerInfo["odb_name"]] != null )
				{
					tmpData["release_status"] = ARGV["releasestatus"];
				}
				else
				{
					tmpData["release_status"] = oLayers.hasOwnProperty(layerInfo["odb_name"]) ? oLayers[layerInfo["odb_name"]]["release_status"] : null;
				}
				for (n = 0; n < fieldLst.length; n++)
				{
					tmpData[fieldLst[n]] = layerInfo[fieldLst[n]];
				}
				//GUI.msgbox({text: TDataParse.variant2JsonStr(tmpData)});
				db.insertRow({table:tableName, data:tmpData});
				if (db.lastError().isValid()) throw db.lastError();
			}
			db.commit();
			return new TDataResponse();
		}
		catch (err)
		{
			print(err.text());
			db.rollback();
			return new TDataResponse(err, "");
		}
	}';
	my $json = new JSON;
	my $ret = $IKM->command( $func,{job_id =>$JOB_ID, matrix=>$matrix,layers=>[sort{$matrix->{$a}{row}<=>$matrix->{$b}{row}} keys %$matrix], jobcategory=>$par{jobcategory}}, 1);
	if ($ret->{errText}) {
		return {
			jobcategory=>$par{jobcategory},
			errText => $ret->{errText},
			errCode => $ret->{errCode},
		};
	}
	return undef;
}


#设置层的Release状态
#(jobid|job=>,l2=>'Release','top'=>'Block');
sub SET_LAYER_RELEASE_STATUS{
	my %par = @_;
	my $jobname = delete $par{job};
	my $jobid = delete $par{jobid};
	if (!defined $jobid and defined $jobname){
		$jobid = $DB2->select_value(-table=>'job',-field=>'id',-where=>{jobname=>$jobname});
	}
	$jobid = $JOB_ID unless defined $jobid;
	$DB2->begin();
	my $error;
	foreach my $it (keys %par){
		$DB2->update(-table=>'job_work_layer',-data=>{release_status=>$par{$it}},-where=>{job_id=>$jobid,gen_name=>$par{$it}});
		$error = $DB2->err;
		last if $error;
	}
	if ($error){
		$DB2->rollback();
		return $error;
	}
	else{
		$DB2->commit();
		return undef;
	}
}

#获取层的Release状态
#(jobid|job=>,layer=>''|[]);
sub GET_LAYER_RELEASE_STATUS{
	my %par = @_;
	my $jobname = delete $par{job};
	my $jobid = delete $par{jobid};
	if (!defined $jobid and defined $jobname){
		$jobid = $DB2->select_value(-table=>'job',-field=>'id',-where=>{jobname=>$jobname});
	}
	$jobid = $JOB_ID unless defined $jobid;
	unless(ref($par{layer}) eq 'ARRAY'){
		$par{layer} = [$par{layer}];
	}
	my $tmp = $DB2->select_hashhash(-table=>'job_work_layer',-field=>'release_status',-hashkey=>'gen_name',-where=>{job_id=>$jobid,gen_name=>$par{layer}});
	my %return;
	foreach my $it (%$tmp){
		$return{$it} = $tmp->{$it}{release_status};
	}
	if (wantarray){
		return %return;
	}
	else{
		return $return{$par{layer}};
	}
}

##mirror或者旋转角度的step资料更新
# mirror_step_update(job=>$Job);
sub mirror_step_update{
	my %par = @_;
	my $pcs = 'edit';
	my @steps =  $GEN->getStepList(job=>$par{job});
	foreach my $step(@steps){
		if( $step =~ /^$pcs(\_|\-|\+)(\d+)$/ or $step =~ /^$pcs(\_|\-|\+)flip$/ ){
			$GEN->COM( "change_step_dependency,job=$par{job},step=$step,operation=restore ");
			$GEN->COM('update_dependent_step',job=>$par{job},step=>$step);
		}
	}
}

##mirror或者旋转角度的step资料release
# mirror_step_release(job=>$Job);
sub mirror_step_release{
	my %par = @_;
	my $pcs = 'edit';
	my @steps =  $GEN->getStepList(job=>$par{job});
	foreach my $step(@steps){
		if( $step =~ /^$pcs(\_|\-|\+)(\d+)$/ or $step =~ /^$pcs(\_|\-|\+)flip$/ ){
			$GEN->COM( "change_step_dependency,job=$par{job},step=$step,operation=release ");
		}
	}
}