=head NAME: DESCRIPTION: PARAMETER: [ { name : 'step_filter', title : '过滤Step', type : 'LineEdit', property : {tool_tip : '未设定则手动选择'}, }, { name : 'save_job', title : '保存料号', type : 'RadioBox', property : { size_policy:'Expanding,Fixed', item_list:[ {name:'Yes',text:'Yes'}, {name:'No',text:'No'}, ], tool_tip:'脚本结束后自动保存料号,未设定,默认为No' }, pack : {row:1,column:1}, } ] VERSION_HISTORY: V1.00 2020-1-14 Super 1.新版本. V1.1 2020-2-28 Super 1.增加每层残铜 2.增加每个step的满铜面积 V1.2 2020-03-03 Super 1.上传钻孔信息 V1.3 2020-04-15 Kurri 1.增加上传文字面积 V1.4 2020-04-26 Super 1.增加最小线宽 2.PG层增加孔到铜 V1.5 2020-05-11 Super 1.钻孔上传的大小按mm存储 V1.6 2020-07-03 Kurri 1.钻孔上传原稿时先删除料号所有step的原稿钻孔(多pcs情况如何处理的逻辑待客户确认) V1.7 2020-07-03 Super 1.analysis SM V1.71 2020-08-11 Super Zhang 1.add silck min line HELP:

功能简介


参数配置

● 无

注意事项

● 无


=cut use warnings; use strict; use utf8; use Encode; use Data::Dump qw/dump/; doScript("TL_Public"); use_module('TL_GenMath'); my ($Job,$Step)= ($JOB,undef); $Step = $PAR->{step_filter} ? $PAR->{step_filter} : '.*'; my @work_layers; $PAR->{del_backup} = 'yes' unless $PAR->{del_backup}; $PAR->{save_job} = 'No' unless $PAR->{save_job}; $PAR->{units} = 'mm' unless $PAR->{units}; ############################################################################### try{ show_loading("判断是否选择料号..",0,position=>'n'); unless( $Job){ $GUI->msgbox(-icon=>'error',-text=>"请先选择料号后再执行脚本!"); return 'Cancel'; } ## update_loading("检查${Job}是否存在..",0,position=>'n'); unless ( $GEN->isJobExists(job=>$Job) ){ $GUI->msgbox(-icon=>'error',-text=>"料号${Job}不存在,请确认。"); return 'Cancel'; } ## update_loading("正在打开料号 ${Job} ...",0,position=>'n'); $GEN->openJob(job=>$Job); ## update_loading("过滤工作step...",0,position=>'n'); my $return = get_work_step(); return 'Cancel' if $return eq 'Cancel'; ## update_loading("打开Step...",0,position=>'n'); $GEN->openStep(job=>$Job,name=>$Step); $GEN->clearLayers(); $GEN->affectedLayer( mode=>'all',affected=>'no' ); $GEN->COM( "sel_options,clear_mode=clear_after,display_mode=all_layers,area_inout=inside,area_select=select,select_mode=standard,area_touching_mode=exclude"); $GEN->units( type=>'mm' ); $GEN->zoomHome(); my $board_thickness = $IKM->get_jobinfo(-jobname=>$Job,-jobcategory=>'work',-jobinfo=>'board_thickness',-units=>$PAR->{units})||0; $board_thickness *= 1000 ; update_loading("正在上传matrix信息,请稍候..",0,position=>'n'); $PAR->{public_script} = "SEC_Public"; doScript("$PAR->{public_script}"); my $ans = UPLOAD_LAYER_MATRIX(job=>$Job,jobcategory=>'org'); if ($ans ){ $GUI->msgbox(-icon=>'warning',-text=>dump($ans)); return 'Error'; } update_loading("资料分析中,请稍候..",0,position=>'n'); my $check_list = 'pcb_analysis_jt01'; my ($signal,@signal,@pg_layer,$pg_layer,@drill,@sm_layer,@ss_layer,$ss_layer); my %matrix = $GEN->getMatrix(job=>$Job,type=>'hash'); foreach my $layer (sort {$matrix{$a}{row} <=> $matrix{$b}{row}} keys %matrix) { if(defined($matrix{$layer}{context}) and $matrix{$layer}{context} eq 'board' ){ if($matrix{$layer}{layer_type} eq 'signal' and $layer =~ /(cil)|(col)/){ my %lyr_paras; if($matrix{$layer}{side} eq 'top'){ $lyr_paras{layer1} = $layer; $lyr_paras{drills} = 'yes'; $lyr_paras{thickness} = $board_thickness/2; }elsif($matrix{$layer}{side} eq 'bottom'){ $lyr_paras{layer2} = $layer; $lyr_paras{drills} = 'yes'; $lyr_paras{thickness} = $board_thickness/2; }else{ $lyr_paras{layer1} = $layer; $lyr_paras{drills} = 'no'; $lyr_paras{thickness} = 0; } my $copperArea = $GEN->copperArea(%lyr_paras); $copperArea->{area} = sprintf('%.3f',$copperArea->{area}); $copperArea->{percent} = sprintf('%d',$copperArea->{percent}); $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{copper_area_pcs=>$copperArea->{area}, copper_area_ratio_pcs=>$copperArea->{percent}} ); push @signal,$layer; $layer .= ';'; $signal .= $layer; }elsif($matrix{$layer}{layer_type} eq 'power_ground' and $layer =~ /(cil)/){ my %lyr_paras = ( layer1 => $layer, drills => 'no', thickness => 0 ); my $copperArea = $GEN->copperArea(%lyr_paras); $copperArea->{area} = sprintf('%.3f',$copperArea->{area}); $copperArea->{percent} = sprintf('%d',$copperArea->{percent}); $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{copper_area_pcs=>$copperArea->{area}, copper_area_ratio_pcs=>$copperArea->{percent}} ); push @pg_layer,$layer; $layer .= ';'; $pg_layer .= $layer; }elsif($matrix{$layer}{layer_type} eq 'drill'){ push @drill,$layer; } elsif ($matrix{$layer}{layer_type} eq 'silk_screen' and $layer =~ /lpp/) { my %lyr_paras = ( layer1 => $layer, drills => 'no', thickness => 0 ); my $copperArea = $GEN->copperArea(%lyr_paras); my $target_attrname = $matrix{$layer}{side} eq 'top' ? 'ss_area_pcs_top' : 'ss_area_pcs_bot'; my $jobinfohash = {}; $jobinfohash->{$target_attrname} = $copperArea->{area}; $IKM->save_jobinfo( -jobid=>$JOB_ID, -jobcategory=>'work', -jobinfohash=>$jobinfohash ); push @ss_layer,$layer; $layer .= ';'; $ss_layer .= $layer; }elsif($matrix{$layer}{layer_type} eq 'solder_mask' and $layer =~ /smf/){ push @sm_layer,$layer; } } } my $tmp_layer = 'tl+copper+tmp++'; $GEN->createLayer(job=>$Job,layer=>'tl+copper+tmp++',context=>'misc',type=>'signal',delete_exists=>'yes'); $GEN->affectedLayer(affected=>'yes',layer=>$tmp_layer,clear_before=>'yes'); my $profile_limits = $GEN->getProfileLimits(job=>$Job,step=>$Step,units=>'mm'); if($profile_limits->{xsize} == 0){ $GEN->affectedLayer( mode=>'all',affected=>'no' ); $GEN->deleteLayer(job=>$Job,layer=>$tmp_layer,step=>$Step); $GUI->msgbox(-icon=>'error',-text=>"请先创建${Step}的profile线!"); return 'Cancel'; }else{ $GEN->srFill(layer=>$tmp_layer); my %lyr_paras; $lyr_paras{layer1} = $tmp_layer; $lyr_paras{drills} = 'no'; $lyr_paras{thickness} = 0; my $copperArea = $GEN->copperArea(%lyr_paras); $copperArea->{area} = sprintf('%.3f',$copperArea->{area}); $copperArea->{percent} = sprintf('%d',$copperArea->{percent}); $GEN->affectedLayer( mode=>'all',affected=>'no' ); $GEN->deleteLayer(job=>$Job,layer=>$tmp_layer,step=>$Step); $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$Step, -layerinfohash=>{board_area_pcs=>$copperArea->{area}, board_area_ratio_pcs=>$copperArea->{percent}} ); } # unless ($GEN->isChklistExists(job=>$Job,step=>$Step,chklist=>$check_list)) { # $GUI->msgbox(-icon=>'error',-text=>"系统中未发现pcb_analysis_jt01的checklist请和系统管理员联系!!!"); # return 'Error'; # } if($GEN->isChklistExists(job=>$Job,step=>$Step,chklist=>$check_list)){ $GEN->COM('chklist_delete',chklist=>$check_list); } $GEN->COM("chklist_from_lib,chklist=$check_list"); $GEN->COM("chklist_open,chklist=$check_list"); $GEN->COM("chklist_show,chklist=$check_list"); $GEN->chklistSelectAct(job=>$Job,step=>$Step,chklist=>$check_list,nact=>1,select=>'yes',clear_before=>'yes'); if(@pg_layer){ $GEN->COM('chklist_select_act',chklist=>$check_list,nact=>2,select=>'yes');#运行PG层分析 } if(@sm_layer){ $GEN->COM('chklist_select_act',chklist=>$check_list,nact=>3,select=>'yes'); } if(@ss_layer){ $GEN->COM('chklist_select_act',chklist=>$check_list,nact=>4,select=>'yes'); } $GEN->COM('chklist_select_act',chklist=>$check_list,nact=>5,select=>'yes'); $GEN->chklistCupd(chklist=>$check_list,nact=>1,params=>{pp_layer=>$signal,pp_d2c=>500,pp_tests=>'Spacing\;Drill\;Size\;Rout\;SMD'}); if(@ss_layer){ $GEN->chklistCupd(chklist=>$check_list,nact=>4,params=>{pp_layers=>$ss_layer}); } if(@pg_layer){ $GEN->chklistCupd(chklist=>$check_list,nact=>2,params=>{pp_layers=>$pg_layer,pp_tests=>'Drill\;Rout'}); } $GEN->chklistCupd(chklist=>$check_list,nact=>5,params=>{pp_tests=>'Hole Separation\;NPTH to Rout'}); $GEN->chklistRun(chklist=>$check_list,nact=>'s'); #分析取得结果插入数据库 my($dirll_info,$signal_info,$sm_info); foreach my $drl (@drill){ my @drill_meas = $GEN->getCheckMeas(job=>$Job,step=>$Step,chklist=>$check_list,nact=>5,units=>'mm',layer=>$drl); my @same_net = grep($_ =~ /(same)/,@drill_meas); my @diff_net = grep($_ =~ /(diff)/,@drill_meas); my @drill_to_outline = grep($_ =~ /(drill_to_outline)/,@drill_meas); my @np_to_rout = grep($_ =~ /(npth2rout)/,@drill_meas); if(@same_net > 0){ my @tmp = split(/\s+/,$same_net[0]); $dirll_info->{$drl}{same_min} = sprintf("%0.3f",$tmp[2]/1000); }else{ $dirll_info->{$drl}{same_min} = '/'; } if(@diff_net > 0){ my @tmp = split(/\s+/,$diff_net[0]); $dirll_info->{$drl}{diff_min} = sprintf("%0.3f",$tmp[2]/1000); }else{ $dirll_info->{$drl}{diff_min} = '/'; } if(@drill_to_outline > 0){ my @tmp = split(/\s+/,$drill_to_outline[0]); $dirll_info->{$drl}{drill_to_outline} = sprintf("%0.3f",$tmp[2]/1000); }else{ $dirll_info->{$drl}{drill_to_outline} = '/'; } if(@np_to_rout > 0){ my @tmp = split(/\s+/,$np_to_rout[0]); $dirll_info->{$drl}{np_to_rout} = sprintf("%0.3f",$tmp[2]/1000); }else{ $dirll_info->{$drl}{np_to_rout} = '/'; } #$GUI->debug(-text=>dump($matrix{$drl}{tl_name},'--->>>',$dirll_info)); $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$drl}{tl_name}, -layerinfohash=>{h2h_min_same_layer=>$dirll_info->{$drl}{same_min}, h2h_min_different_layer=>$dirll_info->{$drl}{diff_min}, drill_to_rout=>$dirll_info->{$drl}{drill_to_outline}, npth_to_rout=>$dirll_info->{$drl}{np_to_rout}, } ); } foreach my $layer (@signal){ my @signal_meas = $GEN->getCheckMeas(job=>$Job,step=>$Step,chklist=>$check_list,nact=>1,units=>'mm',layer=>$layer); my @line_to_line = grep($_ =~ /(l2l)/,@signal_meas);#线到线 my @line_to_pad = grep($_ =~ /(p2line)/,@signal_meas);#线到pad my @pad_to_pad = grep($_ =~ /(pth2pth)|(via2via)/,@signal_meas);#pad到pad my @hole_to_copper = grep($_ =~ /(via2l)|(via2c)|(pth2c)|(pth2l)/,@signal_meas);##hole到copper my @min_ring = grep($_ =~ /(via_ar)|(pth_ar)/,@signal_meas);;#最小ring my @min_line = grep($_ =~ /(line)|(arc)/,@signal_meas);#最小线宽 my @smd_pitch = grep($_ =~ /(smd_pitch)/,@signal_meas);#SMD_pith my @bga_pitch = grep($_ =~ /(bga_pitch)/,@signal_meas);#BGA_pith my @rout_copper = grep($_ =~ /(r2c)/,@signal_meas);#rout to copper if(@line_to_line > 0){ my @tmp = split(/\s+/,$line_to_line[0]); $signal_info->{$layer}{line_to_line} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{line_to_line} = '/'; } if(@line_to_pad > 0){ my @tmp = split(/\s+/,$line_to_pad[0]); $signal_info->{$layer}{line_to_pad} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{line_to_pad} = '/'; } if(@pad_to_pad > 0){ my @tmp = split(/\s+/,$pad_to_pad[0]); $signal_info->{$layer}{pad_to_pad} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{pad_to_pad} = '/'; } if(@hole_to_copper > 0){ my @tmp = split(/\s+/,$hole_to_copper[0]); $signal_info->{$layer}{hole_to_copper} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{hole_to_copper} = '/'; } if(@min_ring > 0){ my @tmp = split(/\s+/,$min_ring[0]); $signal_info->{$layer}{min_ring} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{min_ring} = '/'; } if(@min_line > 0){ my @tmp = split(/\s+/,$min_line[0]); $signal_info->{$layer}{min_line} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{min_line} = '/'; } if(@smd_pitch > 0){ my @tmp = split(/\s+/,$smd_pitch[0]); $signal_info->{$layer}{smd_pitch} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{smd_pitch} = '/'; } if(@bga_pitch > 0){ my @tmp = split(/\s+/,$bga_pitch[0]); $signal_info->{$layer}{bga_pitch} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{bga_pitch} = '/'; } if(@rout_copper > 0){ my @tmp = split(/\s+/,$rout_copper[0]); $signal_info->{$layer}{rout_copper} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{rout_copper} = '/'; } $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{l2l_min=>$signal_info->{$layer}{line_to_line}, l2p_min=>$signal_info->{$layer}{line_to_pad}, p2p_min=>$signal_info->{$layer}{pad_to_pad}, h2c_min=>$signal_info->{$layer}{hole_to_copper}, annular_ring_min=>$signal_info->{$layer}{min_ring}, org_line_width_min=>$signal_info->{$layer}{min_line}, rout_to_copper=>$signal_info->{$layer}{rout_copper}, smd_pitch=>$signal_info->{$layer}{smd_pitch}, bga_pitch=>$signal_info->{$layer}{bga_pitch}, } ); } foreach my $layer (@pg_layer){ my @pg_meas = $GEN->getCheckMeas(job=>$Job,step=>$Step,chklist=>$check_list,nact=>2,units=>'mm',layer=>$layer); my @hole_to_copper = grep($_ =~ /(via2l)|(via2c)|(pth2c)|(pth2l)/,@pg_meas);##hole到copper my @min_ring = grep($_ =~ /(via2t)|(pth2t)/,@pg_meas);#最小ring my @rout_copper = grep($_ =~ /(r2c)/,@pg_meas);#rout to copper if(@hole_to_copper > 0){ my @tmp = split(/\s+/,$hole_to_copper[0]); $signal_info->{$layer}{hole_to_copper} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{hole_to_copper} = '/'; } if(@min_ring > 0){ my @tmp = split(/\s+/,$min_ring[0]); $signal_info->{$layer}{min_ring} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{min_ring} = '/'; } if(@rout_copper > 0){ my @tmp = split(/\s+/,$rout_copper[0]); $signal_info->{$layer}{rout_copper} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{rout_copper} = '/'; } $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{ h2c_min=>$signal_info->{$layer}{hole_to_copper}, annular_ring_min=>$signal_info->{$layer}{min_ring}, rout_to_copper=>$signal_info->{$layer}{rout_copper}, } ); } foreach my $layer (@sm_layer){ my @sm_meas = $GEN->getCheckMeas(job=>$Job,step=>$Step,chklist=>$check_list,nact=>3,units=>'mm',layer=>$layer); my @pad_ring = grep($_ =~ /(ar_pad)/,@sm_meas);#ring my @pad_cover = grep($_ =~ /(coverage)/,@sm_meas);#cover my @pad_bridge = grep($_ =~ /(pad2pad_bridge)/,@sm_meas);#bridge if(@pad_ring > 0){ my @tmp = split(/\s+/,$pad_ring[0]); $signal_info->{$layer}{pad_ring} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{pad_ring} = '/'; } if(@pad_cover > 0){ my @tmp = split(/\s+/,$pad_cover[0]); $signal_info->{$layer}{pad_cover} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{pad_cover} = '/'; } if(@pad_bridge > 0){ my @tmp = split(/\s+/,$pad_bridge[0]); $signal_info->{$layer}{pad_bridge} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{pad_bridge} = '/'; } $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{ sm_bridge=>$signal_info->{$layer}{pad_bridge}, sm_cover=>$signal_info->{$layer}{pad_cover}, sm_annular_ring=>$signal_info->{$layer}{pad_ring}, } ); } foreach my $layer (@ss_layer){ my @ss_meas = $GEN->getCheckMeas(job=>$Job,step=>$Step,chklist=>$check_list,nact=>4,units=>'mm',layer=>$layer); my @ss_line = grep($_ =~ /(ss_line)/,@ss_meas);#min line wide if(@ss_line > 0){ my @tmp = split(/\s+/,$ss_line[0]); $signal_info->{$layer}{ss_min_line} = sprintf("%0.3f",$tmp[2]/1000); }else{ $signal_info->{$layer}{ss_min_line} = '/'; } $IKM->save_layerinfo(-jobid=>$JOB_ID, -jobcategory=>'org', -tlname=>$matrix{$layer}{tl_name}, -layerinfohash=>{ ss_min_line=>$signal_info->{$layer}{ss_min_line}, } ); } update_loading("正在上传drill信息,请稍候..",0,position=>'n'); my $result = save_drill_info(job=>$Job,step=>$Step,step_type=>'pcs',jobcategory=>'mi'); if ($result ){ $GUI->msgbox(-icon=>'warning',-text=>dump($result)); return 'Error'; } if ($GEN->{STATUS}){ $GUI->msgbox(-icon=>'error',-text=>'请在pcb_analysis_jt01(checklist)中检查数值是否正确!!!'); } ## update_loading("程式运行结束...",0,position=>'n'); $GEN->clearLayers(); $GEN->affectedLayer( mode=>'all',affected=>'no' ); hide_loading(); ##保存料号 if( $PAR->{save_job} =~ /yes/i ){ show_loading("$Job 正在保存料号,请稍候...",0,position=>'n'); $GEN->checkInout(job=>$Job,mode=>'out'); $GEN->saveJob(job=>$Job); hide_loading(); } unless ($GEN->{STATUS}){ return 'done'; } else{ $GUI->msgbox(-icon=>'error',-text=>join("\n",@{$GEN->{STATUS}})); return 'Error'; } } catch Error::Simple with { my $error = encode("utf8",shift); $GUI->msgbox(-icon=>'error',-text=>$error); $GEN->COM("disp_on"); return 'Error'; } finally{ }; #################################################################### sub get_work_step { update_loading("选择工作step...",0,position=>'n'); my @steps = $GEN->getStepList(job=>$Job); if ( @steps == 0 ) { $GUI->msgbox(-icon=>'error',-text=>'在料号中没有Step存在,你将退出!'); return 'Cancel'; } elsif (@steps != 0){ my @tmp_steps = grep(/$Step/,@steps); if ( @tmp_steps == 0 ) { $GUI->msgbox(-icon=>'warning',-text=>'根据脚本参数过滤出来的step不存在,请检查资料或者脚本参数配置!'); return 'Cancel'; } elsif (@tmp_steps == 1) { $Step = $tmp_steps[0]; } else { $Step = $GUI->select_step(-title=>'请选择工作 Step', -steplist=>[@tmp_steps], -default=>[$tmp_steps[0]], -gen=>$GEN, -selectmode=>'single'); return 'Cancel' unless ($Step); } } } =head 上传钻孔信息 =cut sub save_drill_info{ my %par = @_; my $Job = $par{job}; my %matrix_ = $GEN->getMatrix(job=>$Job,type=>'hash'); my @drill; # 获取工作层 foreach my $layer (sort {$matrix_{$a}{row} <=> $matrix_{$b}{row}} keys %matrix_) { next unless $matrix_{$layer}{context} eq 'board'; if ($matrix_{$layer}{tl_type} eq 'drill') { push @drill,$layer; } } my $matrix = ANALYSIS_STACKUP(job=>$Job); my (@orgDrills,@miDrills); foreach my $drl (@drill) { next unless $drl; my %tool = $GEN->getTool(job=>$Job,step=>$par{step},layer=>$drl,units=>$PAR->{units}); #$GUI->debug(dump(\%tool)); foreach my $num ( sort {$tool{$a}{num} <=> $tool{$b}{num}} keys %tool ) { my $drill = $tool{$num}; my $orgDrill = { job_id => $JOB_ID, step_name => $par{step}, step_type => $par{step_type}, std_layer_name => $matrix->{$drl}{name}, odb_layer_name => $drl, row_num => $num, drill_size => $drill->{finish_size} / 1000, finish_size => $drill->{finish_size} / 1000, drill_type => $drill->{type2} ne 'standard' ? $drill->{type2} : $drill->{type}, drill_shape => $drill->{shape}, count => $drill->{count}, slot_length => $drill->{slot_len}, drill_size_lower_tol => $drill->{min_tol}, drill_size_upper_tol => $drill->{max_tol} }; my $miDrill = { job_id => $JOB_ID, step_name => $par{step}, step_type => $par{step_type}, std_layer_name => $matrix->{$drl}{name}, odb_layer_name => $drl, row_num => $num, drill_size => $drill->{drill_size} / 1000, finish_size => $drill->{finish_size} / 1000, drill_type => $drill->{type2} ne 'standard' ? $drill->{type2} : $drill->{type}, drill_shape => $drill->{shape}, count => $drill->{count}, slot_length => $drill->{slot_len}, drill_size_lower_tol => $drill->{min_tol}, drill_size_upper_tol => $drill->{max_tol} }; push @orgDrills, $orgDrill; push @miDrills, $miDrill; } } return undef unless @orgDrills; my $func = 'function(ARGV) { var jobId = ARGV["job_id"]; var data = ARGV["data"]; var midata = ARGV["midata"]; var stepName = ARGV["step_name"]; var tableName = "pdm_job_" + ARGV["jobcategory"] + "_drill"; //GUI.msgbox({text: TDataParse.variant2JsonStr(tableName)}); //GUI.msgbox({detail: _.toString(ARGV["data"])}); var db = new TSqlQueryV2(T_SQLCNT_POOL.getSqlDatabase()); db.begin(); try{ var miData = []; var orgUidList = []; _.each(data, function(h){ h.uid = TDataParse.getUuid(); orgUidList.push(h.uid); }); var i = 0; _.each(midata, function(n){ n.uid = TDataParse.getUuid(); var miMap = _.pick(n, ["job_id","std_layer_name","odb_layer_name","step_name","step_type","drill_size","finish_size","drill_type","drill_shape","drill_size_lower_tol","drill_size_upper_tol","slot_length"]) miMap.uid = TDataParse.getUuid(); if (n.step_type == "pcs") miMap.pcs_count = n.count; if (n.step_type == "array") miMap.array_count = n.count; miMap.calc_drill_size = n.drill_size; miMap.org_size = n.finish_size; miMap.org_slot_length = n.org_slot_length; miMap.org_size_upper_tol = n.drill_size_upper_tol; miMap.org_size_lower_tol = n.drill_size_lower_tol; miMap.org_uids = [orgUidList[i]]; miData.push(miMap); i++; }); db.deleteRow({table: "pdm_job_org_drill", where: {job_id: jobId}}); db.batchInsert("pdm_job_org_drill", ["uid","job_id","step_name","step_type","std_layer_name","odb_layer_name","row_num","drill_size", "drill_type","drill_shape","count","slot_length","drill_size_lower_tol","drill_size_upper_tol"], data); if (ARGV["jobcategory"] == "mi") { db.deleteRow({table: "pdm_job_mi_drill", where: {job_id: jobId, step_name: stepName}}); db.batchInsert("pdm_job_mi_drill", db.getFieldList("pdm_job_mi_drill"), miData); } if (db.lastError().isValid()) throw db.lastError(); db.commit(); return new TDataResponse(); } catch (err) { GUI.msgbox({text: "Error", detail: _.toString(err.text())}); db.rollback(); return new TDataResponse(err, ""); } }'; my $json = new JSON; my $ret = $IKM->command( $func,{job_id =>$JOB_ID, data=>[@orgDrills],midata=>[@miDrills],jobcategory=>$par{jobcategory},step_name=>$par{step}}, 1);#--work属性 if ($ret->{errText}) { return { jobcategory=>$par{jobcategory}, errText => $ret->{errText}, errCode => $ret->{errCode}, }; } return undef; } __END__