如何快速識別晶圓缺陷?高科技半導體下的資料分析 - JMP ...

文章推薦指數: 80 %
投票人數:10人

晶圓製造是指半導體集成電路製作所用的矽晶片,由于其形狀爲圓形,故稱爲晶 ... 某電子企業的工程師在最終測試階段收集到了1559個芯片的缺陷數據,想 ... Community Home AbouttheCommunity JMPOnAir JMPSoftwareAdministrators RegionalJMPUsersGroups JMPDiscoverySummitSeries LearnJMP Discussions FileExchange Add-Ins Scripts SampleData JSLCookbook JMPWishList JMPBlogs SignIn AllcommunityThiscategoryBlogKnowledgebaseUsers cancel Turnonsuggestions Auto-suggesthelpsyouquicklynarrowdownyoursearchresultsbysuggestingpossiblematchesasyoutype. Showingresultsfor  Show  only  | Searchinsteadfor  Didyoumean:  JMPUserCommunity : Blogs : JMPBlog : 如何快速識別晶圓缺陷?高科技半導體下的資料分析 ArticleOptions SubscribetoRSSFeed MarkasNew MarkasRead Bookmark Subscribe EmailtoaFriend PrinterFriendlyPage ReportInappropriateContent ChooseLanguage HideTranslationBar Michelle_Wu Staff 如何快速識別晶圓缺陷?高科技半導體下的資料分析 Created: Mar11,202210:18AM   電子製造業的零件尺寸較小、生産周期較短,使得設備及産品的異常診斷能力變得非常重要,其辨識能力的強弱甚至成爲了企業競爭力的一部分。

如何快速、高效地識別這些異常,以及做好提前預警和分析,是提高良率不可或缺的一大環節。

    今天我們以電子製造行業的一個案例爲例,來看看如何透過JMP強大的神經網絡建模與資料視覺化,幫助數據分析人員大幅减少異常芯片的識別與偵測時間,幫助企業提高生產效率與品質。

    爲什麽資料分析如此重要? 品質對於高科技企業來說,意味著製造成本、出貨周期和品牌價值。

所以幾乎每家企業都把產品品質看作重中之重。

那麽如何改善企業產品品質變成是一項艱巨的任務。

  (圖二)是常見的高科技/類企業的典型生産步驟,其中:   1. 晶圓製造 晶圓製造是指半導體集成電路製作所用的矽晶片,由于其形狀爲圓形,故稱爲晶圓;在矽晶片上可加工製作成各種電路元件結構,而成爲有特定電性功能的集成電路産品。

  2. 封裝測試 封裝是將通過測試的晶圓按照産品類型及功能需求加工得到獨立芯片的過程;測試則是通過一系列的檢測項目來偵測每顆獨立芯片的好壞的過程。

  特別是在「測試」環節,傳統方法是使用人工識別,即透過個人判斷將有問題的晶圓圖一一記錄下來,再做後續處理工作。

然而實際工作中,人工識別常常會面臨以下3個問題:   1.漏檢圖形 每個人在面臨上百張晶圓檢測圖的時候,幾乎不可能做到每張圖一一過目,很可能因為過於疲勞等因素錯過了一些重要的圖形,而這些圖形往往蘊藏著重要訊息。

  2.耗時過長 整個人工辨識過程非常耗時,沒有將時間用在解决核心問題上。

  3.標準不統一 對於沒有出現過的圖形,判斷標準會隨著個人的標準不同有所差異,容易造成潛在訊息的丟失。

  基於以上這些不可避免的因素,JMP視覺化分析就派得上用場了。

例如,我們把每顆獨立芯片的檢測結果按照它們在晶圓上面的位置一一對應,所得的檢測結果匯入到JMP,透過JMP圖形生成器就可以輕鬆生成以下的晶圓檢測圖,從而快速地識別出有問題的産品,如圖三。

  圖三   其中,不同顔色代表著最終測試檢測值的大小。

紅色最大,依次遞减,藍色最小。

從上圖三可以看到,晶圓右下方藍色部分的檢測值偏低。

這代表什麽意思呢?意思是在晶圓製造時,這一區域有異常,需要儘快調查及解决。

這樣工程師就可以馬上著手針對這類有問題的芯片進行快速跟進了。

我們這裡舉個實例做說明。

    案例分析:使用JMP快速識別晶圓缺陷 案例背景 某電子企業的工程師在最終測試階段收集到了1559個芯片的缺陷數據,想分析其中某一項缺陷的比率隨著位置的變化是否呈現規律。

如果某一位置的缺陷率爲‘0’,代表在這個位置沒有出現過這項缺陷。

如果在這個位置的缺陷率很高,則表明,次品集中在這個位置。

透過這種缺陷圖形的尋找,最終爲前道諸多工序建立另一種質量偵測手段或者指標,可以作爲整體質量提升的突破。

  圖四   在圖四數據表中,LocX和LocY列分別是行、列坐標值,數值類型爲名義值。

最後一列爲缺陷率,即在過去一段時間內某一位置出現缺陷的比率。

爲了更好地判斷問題,我們在這裡選擇神經網路算法。

原因有以下幾點: 專案需要算法能夠從原始數據中自動發現需要檢測的特徵。

神經網路的算法一般都有多個層次,每一個層次做一次變換,這樣可以有多次機會抓取不同特徵。

通常來說,用來做訓練的數據量越多,可以更好地提高其準確性。

  接下來就來解釋如何在JMP中一步步進行分析。

  Step1.數據導入JMP 首先,將數據導入JMP,把收集到的位置缺陷率轉換爲數據值幷通過圖形生成器來呈現。

  打開JMP->分析(Analyze)->預測建模(Predictivemodeling) ->神經(Neural),把需要觀測的缺陷率放在「Y,Response」,把LocX和LocY放入「X,Factor」,如下圖五:   圖五   進入模型配置窗口,按照以下參數輸入。

本例從默認的神經網絡模型開始,逐步增加更複雜的模型有兩個隱藏層和其他的激活函數。

最終選定以下配置,如圖六:   在fittingoption部分,告訴JMP重複多少次模型擬合算法。

最終JMP會選擇具有最佳驗證統計量的迭代作爲最終模型。

本文最終使用10.   圖六   點擊Model左邊紅色小箭頭,選擇保存公式(SaveFormulas),主要是爲了存儲變換之後的數值以備用。

  圖七   這樣經過行列轉換後,得到以下新的數據表,如圖八: 圖八   如果用圖形來簡單說明轉換過程的話,就如下圖九所示:   圖九   Step2.使用JMP圖形生成器分析 接下來,應用JMP獨有的「圖形生成器(GraphBuilder)」進行分析。

這裏我們將LocX放到橫軸,LocY放到縱軸,TransformValue放到右上角的Color中,點擊GraphBuilder下面的紅色小箭頭,選擇LocalDataFilter,如圖十:   圖十   在LocalDataFilter下選擇Label:   圖十一   然後,再選擇紅色小箭頭——「Animation」,得到以下動態圖形:     這個動圖主要展示了JMP在內部運算過程中是如何逐一掃描整個wafer,最終找到最優解的過程。

其中H1_1是指第一個隱藏層的第一個節點,以此類推。

  這就是在模型構建層面我們的思路和策略。

那麽,具體到實際項目的應用層面,應該怎麽部署和分析呢?我們來繼續探討。

    JMP落地應用:專案部署及實際成效 按照上面JMP生成的模型,接下來我們就可以部署在應用層面。

在部署層面,實際上我們只需要建立一個rankingmodel,即排序模型。

這個模型不需要保證每一個計算結果都非常精確,最重要的是能够在多個wafermap中抓到最顯著的圖形即可。

由于數據量較大以及服務器是Linux系統(相對穩定),故而采用python程序從數據庫中提取數據,根據以上神經網絡方法把有問題的wafermap按照RSquare排序。

  圖十四   之所以選擇RSquare排序,是想按照模型的顯著性來代表是否抓到了pattern。

即模型越顯著,代表著抓到pattern的可能性越大。

關於GeneralizedR-Square如何計算(截圖所示),可參考之前的文章《提速增效,神經網路助力企業運營更高效》   舉例如下,這裏有以下7類次品(從DefectA到DefectG),每一行代表wafermap上X,Y坐標,以及在相應坐標位置上不同次品類型分別累計(某一周)的缺陷率。

  圖十五   按照上一節介紹的算法以及RSquare排序如下,這時我們發現DefectC和DefectA是所有類型的次品中值最高的(如果定義閾值爲>0.7的話,當然閾值可以根據案例自己定義)。

  圖十六   那麽經過GraphBuilder生成的DefectC和DefectA次品圖形確實非常值得研究,而值最低的DefectD,經過GraphBuilder畫出wafermap後圖形確實不明顯。

  DefectC(RSquare值高)-右側邊緣圖形:   圖十七   DefectA(RSsquare值高)-中心右上方圖形: 圖十八   DefectD(RSsquare值低)-幾乎看不出圖形   圖十九     以下是系統架構示意圖:   圖二十   需要注意的是,根據樣本數據,通過JMP計算,需要每個月爲模型更新第一層和第二層layer中的節點數(比如對于新出現的pattern,當前配置是否可以識別到,需要考慮調整節點數等),以便使模型的計算更加有效。

  通過這個方法,經實際操作後,證明企業中每名數據分析人員平均每周减少60%的圖形識別時間,而且異常圖形平均偵測時間累計較以前縮短70%,爲品質管控整體水平提升做出了巨大的貢獻。

  透過上述實戰案例我們可以看到,産品的良率偵測僅僅依靠人工不僅耗時耗力,還容易出現錯誤、漏檢等情况,而重要的品質風險却往往隱藏在某些人工無法識別的地方。

  這就好比一座冰山,人們往往關注露出水面部分的問題,但是水面以下的部分往往由于各種原因沒有辦法看到。

透過先進的數據分析與技術,可以有效地解决問題,並將人工精力更多地放在解决問題上,從根本上節省了品質偵測的周期時間。

  坐而言不如起而行,實際試用JMP,開始你的第一個分析吧!   延伸閱讀: 5個理由告訴你,為什麼JMP軟體更適合你? 浅析SPC之異常分析 SPC管制產品良率——分位數法設定產品管制限與定期回顧 運用JMP淨化離群值,以半導體分析WAT資料為例 0 Kudos ArticleLabels DataExplorationandVisualization QualityandProcessEngineering ArticleTags Authors Michelle_Wu Youmustbearegisteredusertoaddacomment.Ifyou'vealreadyregistered,signin.Otherwise,registerandsignin. Comment ' vardata=div.getElementsByClassName("video-js"); varscript=document.createElement('script'); script.src="https://players.brightcove.net/"+data_account+"/"+data_palyer+"_default/index.min.js"; for(vari=0;i0){ tr_text="Thispostoriginallywritteninlilicon-trans-texthasbeencomputertranslatedforyou.Whenyoureply,itwillalsobetranslatedbacktolilicon-trans-text.".replace(/lilicon-trans-text/g,tr_obj[0].title); try{ if($scope.wootMessages[$rootScope.profLang]!=undefined){ tr_text=$scope.wootMessages[$rootScope.profLang].replace(/lilicon-trans-text/g,tr_obj[0].title); } }catch(e){ } }else{ tr_text="Thismessagewastranslatedforyourconvenience!"; } try{ if(!document.getElementById("tr-msz-"+value)){ vartr_para=document.createElement("P"); tr_para.setAttribute("id","tr-msz-"+value); tr_para.setAttribute("class","tr-msz"); tr_para.style.textAlign='justify'; vartr_fTag=document.createElement("IMG"); tr_fTag.setAttribute("class","tFlag"); tr_fTag.setAttribute("src","/html/assets/lingoTrFlag.PNG"); tr_fTag.style.marginRight="5px"; tr_fTag.style.height="14px"; tr_para.appendChild(tr_fTag); vartr_textNode=document.createTextNode(tr_text); tr_para.appendChild(tr_textNode); /*Wootmessageonlyformultisource*/ if(rootElement.querySelector(".lia-quilt-forum-message")){ rootElement.querySelector(".lia-quilt-forum-message").appendChild(tr_para); }elseif(rootElement.querySelector(".lia-message-view-blog-topic-message")){ rootElement.querySelector(".lia-message-view-blog-topic-message").appendChild(tr_para); }elseif(rootElement.querySelector(".lia-quilt-blog-reply-message")){ rootElement.querySelector(".lia-quilt-blog-reply-message").appendChild(tr_para); }elseif(rootElement.querySelector(".lia-quilt-tkb-message")){ rootElement.querySelector(".lia-quilt-tkb-message.lia-quilt-row:nth-child(3)").appendChild(tr_para); }elseif(rootElement.querySelector(".lia-quilt-tkb-reply-message")){ rootElement.querySelector(".lia-quilt-tkb-reply-message").insertBefore(tr_para,rootElement.querySelector(".lia-quilt-row.lia-quilt-row-footer")); }elseif(rootElement.querySelector(".lia-quilt-idea-message")){ rootElement.querySelector(".lia-quilt-idea-message").appendChild(tr_para); } else{ if(rootElement.querySelectorAll('div.lia-quilt-row-footer').length>0){ rootElement.querySelectorAll('div.lia-quilt-row-footer')[0].appendChild(tr_para); }else{ rootElement.querySelectorAll('div.lia-quilt-column-message-footer')[0].appendChild(tr_para); } } } }catch(e){ } } /*$("div.message-uid-"+value).find("div.lia-message-body-content").append(body_L);*/ }else{ /*Donotdisplaybuttonforsamelanguage*/ //syncList.remove(value); varindex=$scope.syncList.indexOf(value); if(index>-1){ $scope.syncList.splice(index,1); } } } }); }); /*V2.0:2=ReplySyncbuttonformultisourcetranslation*/ }catch(e){console.log(e)} }; if((rContent!=undefined)&&(rContent!="")){ drawCanvas(decodeURIComponent(rContent)); $window.connectorStatus.prop="completed"; /**Updatevariablewithselectedlanguagecode**/ $scope.previousSelCode=code_l; } }; /** *@functionmanageTranslation *@descriptionManagessthetranslationofgivenlanguageforthethread *@param{string}langCode-LanguageCode *@param{string}tid-ThreadID */ $scope.manageTranslation=function(langCode,tid){ /*V2.0:5=actualStatusvariableintroducedtoindicatedetailedconnectorstatusonUI.Thisvariableholdstheactualtranslationpercentage*/ $scope.transPercent=""; $scope.actualStatus=""; if(tid!=""){ varbulkTranslation=lithiumPlugin.bulkTranslation(langCode,tid); bulkTranslation.then(function(trContent){ if(trContent.body!=""){ $scope.showPreview(trContent.body,$scope.mszList,langCode); } if((trContent.status!="NA")&&trContent.status!=null){ //$scope.transPercent=String(trContent.status); $scope.actualStatus=String(trContent.status); }else{ $rootScope.errorMsg="Translationisinprogress.Pleasecheckagainafewminutes." } $scope.workbench=trContent.wb; /*V2.0:4=Triggeruncalledordelayedcallbacks(documnetuploaded/translationcompletedfromlithium).*/ if(trContent.callback=='true'){ vartrCompletCallback=lithiumPlugin.trCompletCallback(langCode,trContent.docID); trCompletCallback.then(function(callback){ //$rootScope.errorMsg="DownloadingTranslatedcontentin"+langCode+"now.Pleasecheckagaininafewminutes." $rootScope.errorMsg="Downloadingtranslatedcontent.Pleaserefreshinfewminutes."; }); }elseif(trContent.callback=='upload'){ vartrCompletUpload=lithiumPlugin.trCompletUpload(langCode,trContent.docID); trCompletUpload.then(function(callback){ $rootScope.errorMsg="Uploadingcontenttotranslate.Pleasecheckagaininafewminutes." }); }elseif("many"=="one"){ $scope.updateOOS(); }elseif((trContent.status!=null)&&trContent.status.includes("100")){ /*IfeverythingfinethenonlycheckOutofSyncstatus*/ $scope.updateOOS(); }else{ /*Iftranslationperccentislessthan100thenshowthepercentageonUI*/ $scope.transPercent=$scope.actualStatus; } }).catch(function(error){ console.error("ManagetranslationError:"+error); }); } } /** *@functionselectThisLang *@descriptionCalledonselectdropdown. *@param{string}lang-Languagecode * */ $scope.selectThisLang=function(lang,anonymousFlag){ /*1.4:3UpdateAnalyticsonlanguageselection*/ try{ lingoThreadLangSelected(lang,'468758'); }catch(e){ } /*varobj=$filter('filter')($scope.sourceLangList,function(obj){returnobj.code===lang}); if(obj.length>0){ if((anonymousFlag==undefined)&&(""!=obj[0].id)){ $window.location.href="?profile.language="+obj[0].id; return""; } }*/ /**DisplayTranslatedcontent**/ vargetTranslation=lithiumPlugin.getTranslation(lang,"468758"); getTranslation.then(function(trContent){ if(trContent.body!=""){ $scope.showPreview(trContent.body,$scope.mszList,lang); }else{ $rootScope.errorMsg="Translationisinprogress.Pleasecheckagaininafewminutes." } }); }; /** *@functionopenWorkbench *@descriptionOpenstheworkbenchlinkoftheselectedcode * */ $scope.openWorkbench=function(wbLink){ /*Openworkbenchlinkinnewtab*/ $window.open(decodeURIComponent(wbLink),'_blank'); }; /** *@functiondetectBrowserLanguage *@descriptiondetectsthebrowserlanguageanddisplaystheUItorequesttranslationforbrowserlanguage * */ $scope.detectBrowserLanguage=function(){ /*Getcookievalueoftheuserchoiceregardingbrowserlanguagetranslation*/ varbrTChoice=cookieService.getBrTChoice() if(brTChoice!=undefined&&brTChoice=="true"){ /*Donothingifuserdontwantoptionforbrowserlanguagetranslation*/ }else{ /*Getuserbrowserlanguage*/ varbrLangCode=window.navigator.userLanguage||window.navigator.language; brLang=""; /*Getrightlanguagecodeofthebrowserlanguage.Getthefirstvalueinthematchinglist*/ if(brLangCode.indexOf("-")>=0){ varobj=$filter('filter')($scope.languages,function(obj){ returnobj.code===brLangCode }); if(obj.length>0){ brLang=obj[0]; } }else{ varobj=$filter('filter')($scope.languages,function(obj){ returnobj.code.split("-")[0]===brLangCode }); if(obj.length>0){ brLang=obj[0]; } } /*IfbrowserlanguageisvalidonethenprovideUItorequestbrowserlanguagetranslation*/ if(brLang!=""){ vardefaultLang=""; if(('en-US'.indexOf(brLang.code)==-1)&&(brLang.code.indexOf('en-US')==-1)&&(defaultLang.indexOf(brLang.code)==-1)&&(brLang.code.indexOf(defaultLang)==-1)){ $scope.brLang=brLang; $scope.brTransMsg="brTransMsg.html"; }else{ $scope.brTransMsg=""; } } } } /** *@functionneverDisplayBrTransMsg *@descriptionsetscookieifuserneverwantbrowserlanguagetranslationchoice * */ $scope.neverDisplayBrTransMsg=function(){ cookieService.putBrTChoice() $scope.brTransMsg=""; } /** *@functiontrnaslateToBrowserLang *@param{isTranslate}isTranslate-true/false *@descriptionRequestsforbrowsertranslationbasedonuserchoice * */ $scope.trnaslateToBrowserLang=function(isTranslate){ if(isTranslate){ /*Pointlanguagedropdowntobrowserlanguage*/ $scope.selLang=$scope.brLang.code; /*Initiatepreviewprocessforbrowserlanguage*/ $scope.selectThisLang($scope.selLang); /*RemovebrowserlanguagetranslationUI*/ $scope.brTransMsg=""; }else{ $scope.brTransMsg=""; } } /*V1.4*/ /** *@functiontranslateThisThread *@descriptionTriggersthetranslationonbuttonclick *@param{mode}manualclickorauto-click/null */ $scope.translateThisThread=function(mode){ if(mode!=undefined&&mode=='click'){ /*Chekingauthordecisiononvalidation*/ if((document.querySelectorAll(".lingo-TrFlag").length==0)&&("29541"!="-1")){ if(!confirm("ThisthreadisnotselectedfortranslationbytheAuthor.Doyouwanttotranslatethisthread?")){ returnfalse; } } } $scope.showTransLation=true; /*Iflanguageexistsinselectedlanguagestheninitiateormanagetranslation*/ if("false"=="true"){ $scope.selLang=""; /*1.4UpdateAnalyticsonlanguageselected*/ try{ lingoThreadLangSelected('','468758'); }catch(e){ } if(angular.element(document.querySelector("#trABody"))){ console.log(angular.element(document.querySelector("trABody"))); $scope.showPreview(angular.element(document.querySelector("#trABody")).innerHTML,$scope.mszList,""); } $scope.manageTranslation("","468758"); }else{ if("false"=="true"){ alert("Requestedlanguagesnotpresentintheselectedlanguageslist"); } } /*DetectingBrowserlanguage*/ $scope.detectBrowserLanguage(); } $rootScope.profLang=""; /*Iflanguageexistsinselectedlanguagestheninitiateormanagetranslation*/ /*GetCookie*/ functiongetCookie(cname){ varname=cname+"="; varca=document.cookie.split(';'); for(vari=0;i0){ /*checkcodeinselectedlanguages*/ varselObj=$filter('filter')($scope.languages,function(obj){ returnobj.code===srObj[0].code }); if(selObj.length>0){ lang_code=srObj[0].code; } } }elseif(brLangCode=window.navigator.userLanguage||window.navigator.language){/*BrowserLanguage*/ /*Getrightlanguagecodeofthebrowserlanguage.Getthefirstvalueinthematchinglist*/ if(brLangCode.indexOf("-")>=0){ varobj=$filter('filter')($scope.languages,function(obj){ returnobj.code===brLangCode }); if(obj.length>0){ lang_code=obj[0].code; } }else{ varobj=$filter('filter')($scope.languages,function(obj){ returnobj.code.split("-")[0]===brLangCode }); if(obj.length>0){ lang_code=obj[0].code; } } }else{ } $rootScope.profLang=lang_code; if(lang_code==""){ lang_code="en-US"; } $scope.selLang=lang_code; if(angular.element(document.querySelector("#trABody"))){ console.log(angular.element(document.querySelector("#trABody")).innerHTML); $scope.showPreview(angular.element(document.querySelector("#trABody")).innerHTML,$scope.mszList,$scope.selLang); } $scope.showTransLation=true; $scope.selectThisLang($scope.selLang,"1"); if("auto"=="true"){ try{ lingoThreadLangSelected($scope.selLang,'468758'); }catch(e){ } $scope.manageTranslation($scope.selLang,"468758"); } /*V1.4Loadingdashbaord(convertedintoscripttoremoveglitch)*/ $scope.dashboard="dashboard.html"; /** *@functiontriggerRefresh *@descriptionManagessthetranslationofgivenlanguageforthethread *@param{string}langCode-LanguageCode *@param{string}tid-ThreadID */ $scope.triggerRefresh=function(langCode,tid){ if(confirm("Areyousureyouwanttomanuallyresubmitthetranslation?")){ $scope.transPercent=""; varmanualTriggerTrans=lithiumPlugin.manualTriggerTrans(langCode,tid); manualTriggerTrans.then(function(status){ if(status=="refresh"){ varresetTranslation=lithiumPlugin.resetTranslation(tid); resetTranslation.then(function(error){ if(error){ $rootScope.errorMsg=error.$; }else{ varbulkTranslation=lithiumPlugin.bulkTranslation(langCode,tid); bulkTranslation.then(function(data){ $rootScope.errorMsg="Translationhasbeenrefreshed.Pleasecheckagaininafewminutes."; }); } }); }else{ $rootScope.errorMsg=status; } }); } } /*V2.0:2=thisfunctioncalledonclickreplysyncbutton*/ /** *@functionmanualOOS *@descriptionSendstheOutofsynccheckrequest. * */ $scope.manualTriggerOSS=function(replyID){ if($scope.transPercent!=""){ varmanualOSS=lithiumPlugin.manualOSS("468758",replyID); manualOSS.then(function(value){ if(!value.includes("false")){ $scope.transPercent=""; $rootScope.errorMsg="Messagerequestedforre-translation.Pleaserefreshaftersometime."; //alert("Messagerequestedforre-translation.Pleaserefreshaftersometime."); }else{ //alert("Pleaserefreshtheandretry."); $rootScope.errorMsg="Autotranslationofmessagefailed.Pleaserefreshthepageandretry."; } }); }else{ //alert("Translationisinprogress.Pleaseretryaftersometime."); $rootScope.errorMsg="Translationisinprogress.Pleaseretryaftersometime."; } } }) .factory('httpInterceptor',['$q','$rootScope', function($q,$rootScope){/*httpInterceptorinterceptsthehttpcalls*/ return{ request:function(config){ if(config.url.indexOf("lingotek")>=0){ /*StartLoader*/ $rootScope.isLoading=true; $rootScope.errorMsg=""; } returnconfig||$q.when(config); }, requestError:function(request){ if((request.config!=undefined)&&(request.config.url.indexOf("lingotek")>=0)){ /*StopLoader*/ $rootScope.isLoading=false; /*Displayerrormessage*/ $rootScope.errorMsg="Errorwhileprocessingtherequest.Pleaserefreshthepageandretry."; } return$q.reject(request); }, response:function(response){ if(response.config.url.indexOf("lingotek")>=0){ /*StopLoader*/ $rootScope.isLoading=false; } returnresponse||$q.when(response); }, responseError:function(response){ if((response.config!=undefined)&&(response.config.url.indexOf("lingotek")>=0)){ /*Displayerrormessage*/ $rootScope.errorMsg="Errorwhileprocessingtherequest.Pleaserefreshthepageandretry."; /*StopLoader*/ $rootScope.isLoading=false; } return$q.reject(response); } }; } ]) .service('lithiumPlugin',function($http,$rootScope){/*ServicethatconnectsthedashboardwithLithiumendpoints*/ /*V2.0:7=ConvertingallPOSTcallsGETcalls*/ /** *@functionisOutOfSync *@param{string}sourceID-Threadid *@descriptionSendstheotofsynccheckrequest * */ varisOutOfSync=function(sourceID){ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_proj_callback?mode=OSS&tid='+sourceID+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result; }, function(result){ //debugger; return{"status":"false"}; }); }; /** *@functiongetTrContent *@param{string}code-Languagecode *@param{string}tid-Threadid *@descriptionGetthetranslatedcontentfromLithium. * */ vargetTranslation=function(code,tid){ /*varparam={ mode:'trContent', code:code, tid:tid, xslt:'json.xsl' };*/ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_rest_connector?mode=trContent&code='+code+'&tid='+tid+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result; },function(response){ return{ "id":"", "body":"", "subject":"", "status":"", "wb":"" }; }); }; /** *@functionbulkTransStatus *@param{string}code-Languagecode *@param{string}tid-Threadid *@descriptionManagestranslationofgiventhread * */ varbulkTranslation=function(code,tid){ /*V1.1:2*/ /*varparam={ mode:'manageTrContent', code:code, tid:tid, xslt:'json.xsl' };*/ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_rest_connector?mode=manageTrContent&code='+code+'&tid='+tid+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; /*V1.4:3GAcode,capturingthreadinfoonpost*/ if(apiResponse.result.posts!=undefined){ vartrPosts=JSON.parse(apiResponse.result.posts); angular.forEach(trPosts,function(pObj_l){ try{ lingoUpdateSource(pObj_l.source,pObj_l.tid); } catch(error){ console.log(error); } }) } returnapiResponse.result; },function(response){ return{ "id":"", "body":"", "status":"", "wb":"" }; }); }; /** *@functionsetDefaultLang *@param{string}code-Languagecode *@descriptionChangestheuserdefaultlanguagetorequestedlanguage. * */ varsetDefaultLang=function(code){ /*V1.1:2*/ return$http.get("/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_settings?mode=langSet&xslt=json.xsl&code="+code).then(function(result){ debugger; returnresult.data.result.value; }, function(result){ return"Error.Pleaseretryinafewminutes"; }); }; /*V2.0:1*/ /** *@functionresetTranslation *@param{string}tid-ThreadID *@descriptionCallstheendpointtoresetthetranslationofgiventhread. * */ varresetTranslation=function(tid){ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_support?mode=refresh&tid='+tid+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.logs.error; }, function(result){ return""; }); }; /** *@functionmanualTriggerTrans *@param{string}code-Languagecode *@param{string}tid-Threadid *@descriptionManagestranslationofgiventhread * */ varmanualTriggerTrans=function(code,tid){ /*V2.0:3*/ /*varparam={ mode:'mtrigger', code:code, tid:tid, xslt:'json.xsl' };*/ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_proj_callback?mode=mtrigger&code='+code+'&tid='+tid+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result.status; },function(response){ return"Pleaseretryinafewminutes."; }); }; /**@functionisOutOfSync *@param{string}sourceID-Threadid *@descriptionSendstheotofsynccheckrequest * */ varmanualOSS=function(sourceID,replyID){ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_proj_callback?mode=manualOSS&tid='+sourceID+'&reply='+replyID+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result.status; }, function(result){ //debugger; return"false"; }); }; /*V2.0:3*/ /** *@functiontrCompletCallback *@param{string}code-Languagecode *@param{string}docID-Documentid *@descriptionTriggersthetranslationcompletedcallbackfromLithium * */ vartrCompletCallback=function(code,docID){ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_proj_callback?mode=callback&type=target&progress=100&document_id='+docID+'&locale_code='+code+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result.status; },function(response){ return"Pleaseretryinafewminutes."; }); }; /*V2.0:3*/ /** *@functiontrCompletUpload *@param{string}code-Languagecode *@param{string}docID-Documentid *@descriptionTriggersthedocumentuploadcallbackfromLithium * */ vartrCompletUpload=function(code,docID){ return$http.get('/plugins/custom/sasinstitute/sasinstitute2/lingotek_ep_proj_callback?mode=callback&type=document_uploaded_auto&progress=0&document_id='+docID+'&xslt=json.xsl').then(function(result){ varapiResponse=result.data; returnapiResponse.result.status; },function(response){ return"Pleaseretryinafewminutes."; }); }; return{ isOutOfSync:isOutOfSync, getTranslation:getTranslation, bulkTranslation:bulkTranslation, setDefaultLang:setDefaultLang, resetTranslation:resetTranslation, manualTriggerTrans:manualTriggerTrans, manualOSS:manualOSS, trCompletCallback:trCompletCallback, trCompletUpload:trCompletUpload }; }) .service("cookieService",function(){/*Serviceforcookiestorage*/ /** *@functiongetBrTChoice *@descriptionReturnsthecookiesetforbrowserlanguagetranslation. * */ vargetBrTChoice=function(){ varcname="it_lang_notify_hide"; varname=cname+"="; varca=document.cookie.split(';'); for(vari=0;i



請為這篇文章評分?