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()">×</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
}
});
});
```