=head NAME: DESCRIPTION: 共有函数,给到所有程序可以调用 PARAMETER:{} VERSION_HISTORY: V1.00 2018-1-17 Cody Yu 1.新版本 V1.01 2020-12-2 Super 1.修正料号获取 HELP: =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;i0 && 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 "); } } }