Benjamin_Tsai@amat.com # 實習小記 TODO: 1. 加入"此物料不在資料庫中"提示 2. 處理進Airlock的台車掃描功能(10月第2~3周slow) 4. 刪除拆PO動作及限制(?) ## 241125 ## 241121 0. buttom switch 1. add slot search 2. take photo 3. add photo ## 241114 [Saving/loading images](https://en.ids-imaging.com/manuals/ids-peak/ids-peak-user-manual/2.13.0/en/program-save-images.html) ## 241028 [Opening a camera (API)](https://www.1stvision.com/cameras/IDS/IDS-manuals/en/program-open-camera.html) ## 240926 ``` UPDATE [MaterialManagement].[dbo].Staging_Material SET [B_NB_CN] = cover FROM ( SELECT st.[RFIDTAGID] ,st.[LOCATION] ,th.[Location] as th_Location ,st.[B_NB_CN] ,SUBSTRING(th.[Location], 3, 1) as cover FROM [MaterialManagement].[dbo].Staging_Material as st LEFT JOIN [Hadoop2TMCApps].[dbo].[LTS_transaction_history] as th ON st.RFIDTAGID = th.RFIDTagID WHERE st.[B_NB_CN] IS NULL ) AS subquery WHERE [MaterialManagement].[dbo].Staging_Material.[RFIDTAGID] = subquery.[RFIDTAGID] ``` ## 240925 [SIPOC模型法](https://derjeng-lin.medium.com/%E8%AB%87-sipoc%E6%A8%A1%E5%9E%8B%E6%B3%95-%E6%96%BC%E7%94%A2%E5%93%81%E9%96%8B%E7%99%BC%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90%E7%9A%84%E9%81%8B%E7%94%A8-%E4%BB%A5%E6%95%99%E8%82%B2%E9%81%8A%E6%88%B2%E8%A8%AD%E8%A8%88%E7%82%BA%E4%BE%8B-fcec719288a5) Source, Input, Process, Output, Customer Report * 車次車種數量直方圖 * 單一PO占比skid直方圖 * 所有CartPO#直條圖 * 容積率UT各車種點陣分布圖 * NeedByDate分布圖 做完Daily Report之後可以做一個Double check比對所有是否一致 ## 240906 #### Task: 加速拆PO: 1. 減少資料庫動作(查詢) 2. 加快app拖曳動作 測試拆PO時間(看看費時最長的是哪裡) 加入EnsureVisible() ## 240905 #### Study: ``` // 確保選中的節點在可見範圍內 treeView1.SelectedNode.EnsureVisible(); ``` The I/O operation has been aborted because of either a thread exit or an application request System.Net.Sockets.SocketException(995) 1. 過多的連線:如果您的應用程式同時執行大量的網路請求或連線,可能會導致系統無法處理所有的請求,從而引發錯誤。您可以嘗試限制同時進行的連線數量,或者使用非同步方式處理網路操作,以避免阻塞UI線程。 2. 網路問題:這個錯誤可能也是由於網路連接不穩定或斷線引起的。您可以確保您的網路連接是穩定的,並且在進行網路操作之前檢查連接狀態。 3. 异常处理:當出現這個錯誤時,您可以使用try-catch語句捕獲SocketException並進行適當的處理。例如,您可以顯示一個錯誤訊息給使用者,或者重新嘗試網路操作。 ## 240902 #### 工作紀錄: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 偵測網頁上傳成功的success訊息 wait = WebDriverWait(driver, 10) # 使用CSS Selector定位成功訊息元素 success_message = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.success-message'))).text print(success_message) ``` ## 240828 #### 工作紀錄: * 8/10 and HU# < 41200000000000820000和Missing Container的資料Location=Assy', Container='-' * 測過AutoRelease的Container Lookup時間已經抓很緊了(網頁搜尋很慢),可能沒辦法減少等待時間 * mms_mm新增Need_By_Date,以及可以一次查詢多個OPS(中間加逗號就可以了) #### Observation: * Release台車跑很慢 * 確定的視窗會干擾作業 #### Problem 資料庫有Airlock但是LTS沒有 ``` 41200000000000825835 T2_STG_Cart_117 AirLock T2_STG_Cart_117 Assembly 2024-08-22 23:14:39.360 2088 ``` ## 240827 * Observation: 人員會先把Cart-NBC一個一個綁上Kit Audit(清空+綁到Kit Audit) * Problem: 拆PO會有重複資料出現 * Problem: 出現第一次更新沒有抓到資料,第二次更新就有資料的情況 * Solved: Unable to find 'C:\\Users\\e193088\\OneDrive - Applied Materials\\Code\\ca.crt' when adding binary and data files. ``` pyinstaller --add-data 'ca.crt;seleniumwire' --add-data 'ca.key;seleniumwire' --onefile 'AutoToolSet.py' ``` ## 240820 * 發現問題: 有可能有些確定都上傳成功的物料在LTS上卻沒有上傳 ->做完Daily Report之後可以做一個Double check ## 240819 * 發現問題: 進到Missing Container中的物料很多 -> 很多舊資料都跑到Missing Container了 FinishUnloading()中邏輯判斷沒有加上Belong_Request_Name,所以會把舊資料丟到Missing Container中 ->已經更新邏輯了,需要小心查看是否會影響到原本Unloading作業 ->實際測試41200000000000824010(大料)看起來是沒問題 * 發現問題:更新邏輯----ex.41200000000000797380 現在很比較少用,看不出來問題在哪 New Think: **十倍成長思維**-你無法藉由自己過去的思考方式來發揮十倍成長,需要抓出**兩成關鍵要務**和其他八成無足輕重的事,並且改變80%現行做法為新方法。 -> 有沒有可能讓一台RFID完全吃掉所有Kit Audit的量呢?讓工作效率變成10倍。 優點:減少人員x工作時間、減少RFID reader作業互相影響 要如何達成呢? * Observation 1 ---- Capibility 分析Kit Audit目前的量、是否有可能完全只用一台就吃掉所有物料 * Observation 2 ---- 解決RFID難題:誤刷和無法感應 在做Kit Audit的人旁邊測試是否真的使用RFID的誤刷、無法感應比例有多少 * Observation 3 跟著現在所有流程跑一次,了解所有動作、需要的人員安排、分出兩成關鍵要務和八成可以利用自動化軟體替代的部分。 ## 240815 觀察: * 現在主要用來點料的是最外排的第一台電腦 * Think: 可能是因為腹地空間大,也方便放到台車上 * 有些物料過長,需要兩台台車頭尾連在一起 * 每天需要放的台車很多(需要實際數據),圍著Staging成一圈,不能一次放一台後送進去? * Assembly裡面也有很多空掉的台車閒置 * 現在所有的RFID機器都被閒置Q^Q * 垃圾(拆下來的包裝)很有可能會跟SKID混在一起堆放 * 點料的動作很多種,有些需要拆掉包裝後包起來放 * 電腦耗電率高 *? 有沒有可能讓SKID跟台車的連結更多,更方便點料上車?* 安排車車的單子:(人員每天手抄) PO OPS Cart 12345 0100 001 0200 025 0300 025 0400 025 12222 0200 245 ... ... ... ## 240814 Staging SMPPS Think: * RFID硬體要怎麼優化方便使用 * 現在預想/設計的動線是最佳的嗎?是否貼近實際需求?要如何優化? * 混PO需要被監測 * 刷完物料需要去找台車,這樣是對的嗎? * 最後使用視覺化來呈現動線、分布等 * 現在實際使用率 ---------------------------------------------- Dashboard 統計資料 派車PO/skid統計 台車利用率 Finance ~~串接資料(.py)~~ Docker 派車更新出錯會發信件的機制 ## 240731 完成sheet3的Ranking ## 240729 Error Message Record(Web)完成[testversion] 等Tony確認過後再上到正式版 ## 240723 派車限制(H) =>改好了!但選多筆物料時有點奇怪,等Tony回來討論一下 readMS小改版 ver9.3 ``` cmd python -m PyInstaller -F --add-data "data/QtrConverter.xlsx;data" 9_read_MS.py ``` ## 240722 W/H 手動更新exe檔 ## 240708 7/5 MSreader 7/8 LTS update test start ## 240702 * 修正派車系統急件問題 ``` js // ReferenceError: Invalid left-hand side expression in postfix operation sessionStorage.emergencyCount = parseInt(sessionStorage.emergencyCount)++; ``` js不能寫++只能寫+1 * 解決Chromedriver關不掉的問題 driver.quit()要加在最後面 ## 240701 * 確認0.1.6版本執行順利 * 增加MessageBox錯誤訊息的Tag * 調整Aging_report auto download的關閉方式 * 解決單次更新內可能會重複Insert更新前不再資料庫中的物料問題 * 解決Staging遇到的object disposed problem * LTS Auto_update網頁查詢測試連接 ## 240628 * 複製現有的DB格式變成新的testdb ``` sql USE [MaterialManagement] GO SELECT * into TransactionHistory_testdb FROM [dbo].[Transaction_History] where 1 = 0; GO ``` 複製資料表的結構和資料到testdb,用一個假的where來避免複製資料 * 釋出0.1.6解決多PO問題 * 發現單次更新內可能會重複Insert更新前不再資料庫中的物料 ## 240627 * 研究[ArgumentOutOfRangeException](https://learn.microsoft.com/zh-tw/dotnet/api/system.argumentoutofrangeexception?view=net-8.0") 可能的問題: 1. 您正在使用空字串或 String.Empty 。 2. 您正在根據該字串內子字串的位置操作字串,而且無法判斷是否確實找到子字串。 3. 您已嘗試擷取超出目前字串範圍的子字串。 ``` System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'index') at System.Windows.Forms.TreeNodeCollection.get_Item(Int32 index) ``` * 加入每個動作對Transaction Date的更變 * 確認交接手冊 ## 240611 * 釋出SMPPS0611最新版,加入AutoToolSet.py的exe * 更新Container List 資料庫 * 解決ContainderInfo中抓取資料不同Belong_Request_Name的問題 ## 240604 * SMPPS version0.1.4 release 更動: * origine/master push * 增加Step2的OPS顯示 * readMS version 8 release -> 等待確認 -> 已確認 * 增加log檔案 ## 240527 * 確認Material Management功能正常 * LTS update ## 240520 * 看code * 異常處理in手冊 ## 240516 * 跟LTS對談方法 * 更新網頁 * 確認是否可以撈3~5月的車次清單,裏面有急件“E” 的記錄 ## 240513 [Query mode](https://andyludeveloper.medium.com/%E7%8E%A9-django-part-6-%E6%9F%A5%E8%A9%A2%E8%B3%87%E6%96%99-query-model-af542ed8eb5e) ## 240509 今天開始決定反著紀...往下拉太長了 Task: * 更改查詢系統的資料庫參照(所有有HU Number的物料都要找的到) * 確定所有的物料查到的Location都是30分鐘內最新的->跟LTS對談 * 新增單筆物料Transaction History的串接Modal * 幫忙查看Transaction History更改後遺失的資料及原因 TODO 建立一個新的地圖頁面 ## 240321 today's task 了解網頁相關知識,以及完成快到期的線上必修課程 ~~1. Restful API~~ ~~2. status code~~ ~~3. json response~~ ~~4. ONBOARDING HR course~~ ~~5. DEMO understanding~~ ### Restful API Representational State Transfer (REST) 是一種軟體架構,它對 API 的運作方式施加了條件。 RESTful API由三部份組成 nouns: 固定的URL verb: * get 讀取 * post 新增 * put 更新 * delete 移除 content types: 內容格式 RESTful API在發送request時,固定Route只改變METHOD(verb),也可以固定API請求規則。 [這個網站解釋的特別清楚~](https://hackmd.io/@monkenWu/Sk9Q5VoV4/https%3A%2F%2Fhackmd.io%2F%40gen6UjQISdy0QDN62cYPYQ%2FH1yxwXyNN?type=book) ### status code 2xx = Success(成功) 3xx = Redirect(重定向) 4xx = User error(客戶端錯誤) 5xx = Server error(伺服器端錯誤) ### Json request JavaScript Object Notation (JSON) JSON 物件基本上就是 JavaScript 物件,而陣列也可以是有效的 JSON 物件 順便複習了一下HTML ### ONBOARDING HR course Applied's main customer The U.S. -- intel South Korea -- samsung Japan -- Fujitsu Taiwan -- tsmc Applied 學習資源: [AUG-Linkind learning](https://amat.sabacloud.com/Saba/Web_spf/NA3P1PRD0037/app/shared;spf-url=pages%2Fpagelistview%2Fpgcnt000000000041382) ### Source https://aws.amazon.com/tw/what-is/restful-api/ https://developer.mozilla.org/zh-TW/docs/Learn/JavaScript/Objects/JSON https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods ## 240325 task ~~1. 開晨會~~ ~~2. Brief intro~~ ~~3. 去staging接電線/組裝RFID機器~~ ## 240326 ~~1. 去staging 測試RFID 機器~~ ~~2. 寫派車系統自動更新程式Loop + timer~~ ### timer 利用固定1hr去掉執行時間 ``` while true start_time = time.time() ... time.sleep(60*60-(time.time() - start_time)) ``` ## 240328 ~~1. simba, MMS, Data Management使用者介面了解~~ 2. bootstrap 熟悉Django和Bootstrap的連結 https://www.w3schools.com/django/django_update_model.php ## 240401 ~~1. 確認臺車編號~~ ~~已和Cage詢問,下午確認~~ 0402已確認,送出列印(前1~99號前面沒有補0) ~~2. 安裝RFID讀取程式~~ ~~3. 製作感應棒標籤,改寫編號~~ 已嘗試改寫1~6 4. Material Management介面構想 MMS沒有權限 ## 240408 軟體上線週 無限Debug * 下載版本管理 * 使用者切換->軟體要放在公用 * 驅動程式安裝 * 材料準備 * 實際運作時會需要的功能增加 * 暫停感應、感應範圍改善 * 錯誤刪除 * 感應速率調整 * 字體放大 這些錯誤其實應該要在測試之前就完成Debug,流程要真的走好多次才行,測試非常重要 雖然待在Staging走來走去很累,但是真的在現場才可以發覺哪些需求,以及發現問題所在(例如上傳錯誤、電腦共用會到處亂跑等) 之後如果需要安裝較大的軟體的話可能要尋找其他方式,只用線上上傳下載真的好慢... ## 240416 MMS web 新增頁面Materail Management的部分 Processing Logic: 1. urls.py 新增 urlpatterns ``` url(r'^test/$', views.testOutput, name='test'), ``` 2. view.py 增加function 呼叫html ``` py def testOutput(req): transactionHistory = TransactionHistory.objects.using('material') # var = class in models.py中的物件('material'為setting中dataset的access way') stmaResult = list(transactionHistory.filter(RFIDTAGID=fixedHU).values()) # stmaResult == staging material result return render(req, 'material_management.html') ``` 3. 新增html檔案 4. js渲染資料 *btw* 完成code git管理: 先在Sam電腦中建一個repo後共享 ``` $ git config --global http.sslBackend schannel $ git clone https://amjpn-my.sharepoint.com/:f:/g/personal/sam_tu_amat_com/... ``` 但是用我的terminal run server error 要注意更換環境時的套件管理 ## 240418 需要Sam確認環境套件版本 [Django 模型與資料庫](https://ithelp.ithome.com.tw/articles/10212427) ## 240422 HTML + CSS 格式排版頭好痛QQ [bootstrap排版](https://bootstrap5.hexschool.com/docs/5.0/forms/layout/) g(x/y)-(1~5) x y軸的間隔1~5(小到大) 利用div切出row and col ```html <div class="row g-3"> <div class="col"> <input type="text" class="form-control" placeholder="First name" aria-label="First name"> </div> <div class="col"> <input type="text" class="form-control" placeholder="Last name" aria-label="Last name"> </div> </div> ``` 前端資料用form傳入查詢資料 [form with django](https://ithelp.ithome.com.tw/articles/10304458?sc=pt) ``` chat GPT 示範 ``` Q() 依次查詢多樣query的時候可以使用Q() ```python q_objects = Q() if query1: q_objects &= Q('query1'=query1) if query2: q_objects &= Q('query2'=query2) if query3: q_objects &= Q('query3'=query3) results = StagingMaterial.objects.filter(q_objects).value("column") ``` !注意: 在Q中和filter中的條件等列式,**不可以加入空格** ``` return HttpResponse(Part_No) ``` 不知道為甚麼抓不出POST進去的變數(頁面空白) https://prod.liveshare.vsengsaas.visualstudio.com/join?1DB51157F1684AFB96E59F570EBFA53BCAA6 ## 240423 [render & redirect](https://ithelp.ithome.com.tw/articles/10236351) ## 240429 * ~~解決Auto download LTS的問題,成功安裝在Edward電腦上~~ * 增加Material Management功能細節 * 明天要詢問使用著需做更進一步修改 * ~~資安線上課程due on 5/6~~ [Create a Data Table in Bootstrap 5](https://www.youtube.com/watch?v=EKSPK_Zk9X8) Quanty, user col WSB query transaction history for each HU No link Large Part, Transaction History ``` html <!DOCTYPE html> <html> <head> <style> /* 隱藏modal,初始狀態下不顯示 */ .modal { display: none; position: fixed; z-index: 1; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0,0,0,0.4); } /* modal內容區域 */ .modal-content { background-color: #fefefe; margin: 15% auto; padding: 20px; border: 1px solid #888; width: 80%; } /* modal關閉按鈕 */ .close { color: #aaa; float: right; font-size: 28px; font-weight: bold; } .close:hover, .close:focus { color: black; text-decoration: none; cursor: pointer; } </style> </head> <body> <table border="1"> <tr> <td onclick="openModal()">點擊打開 Modal</td> </tr> </table> <!-- modal --> <div id="myModal" class="modal"> <!-- modal內容 --> <div class="modal-content"> <!-- modal關閉按鈕 --> <span class="close" onclick="closeModal()">&times;</span> <p>這是modal的內容。</p> </div> </div> <script> // 取得modal元素 var modal = document.getElementById("myModal"); // 取得關閉modal的<span>元素(關閉按鈕) var span = document.getElementsByClassName("close")[0]; // 點擊表格單元格打開modal function openModal() { modal.style.display = "block"; } // 點擊關閉按鈕關閉modal function closeModal() { modal.style.display = "none"; } // 點擊modal外的區域關閉modal window.onclick = function(event) { if (event.target == modal) { modal.style.display = "none"; } } </script> </body> </html> ``` ## 240502 檢查網頁Transaction History之錯誤原因 ->參照之DB錯誤 ***在設計資料庫欄位時要注意使用者目的!*** 因為想要Review容積使用率,因此在儲存Data時需要也將size及使用車種之size都記錄起來。 若資料(SKID)之後可能會被覆蓋掉,也需要更小心資料的儲存方式,將需要的資料留下來。 ## 240507 跟網頁modal取資料奮戰中 Query OR => |= Q() Query AND &= Q("a"=A) ```python def my_view(request): results = [...] combined_query = Q() for result in results: result_id = result['id'] combined_query |= Q(id=result_id) history_entries = History.objects.filter(combined_query) ``` 偵測使用者事件觸發 ```javascript const myButton = document.getElementById('myButton'); myButton.addEventListener('click', function(event) { event.preventDefault(); // send ajax to django $.ajax({ type: 'POST', url: '/my_django_view/', data: { event: 'pointer_event_data' }, success: function(response) { //success }, error: function(error) { //error } }); }); ```