2021年12月8日 星期三

ICUmodle 專案 dropdown出來較其他功能緩慢問題

整串的邏輯大約是這樣

1開始載入時 撈取下拉選單,回給前端排列畫面,並產生全域List供篩選使用

2按鈕功能觸發查詢該病患資料

3依照病患id查詢病患該表項資料

4顯示該病患該表項資料


問題

當4顯示資料的時候, 有去使用到1的下拉選單的List

但是發現, 我操作查詢該病患的表項資料速度快的時候,

會發生顯示問題, 開f12發現, 顯示需要的list並沒有撈回來, 他就已經執行篩選顯示


找尋根源問題

一開始推測, getDropdown需要更多的時間, 所以讓他在網頁中載入順序提前,

但是發現, 這還是沒有解決問題

因此, 我做了一個操作




我嘗試在下拉選單組完選單內容的最後印出"finished"字樣

好讓我知道, 什麼時候才把下拉選單組完

此時我發現, 這個finished差不多讓我等了6秒鐘

很明顯, 如果說我整套操作動作在6秒鐘內完成

很有可能會組資料的時候List還沒有準備好


因此

到底為什麼撈取dropdown會需要撈取這麼久呢?

就是這裡的核心問題






我注意到在等待dropdown回傳的過程中,

他在等待account做了很多查詢

我原本以為是權限相關

回去看code發現

原來為了取得帳號名稱

程式查找出整個account內容

因為其權限是eager撈出來的不是lazyload(當初設計上問題)

因此這邊撈出account會再重新把所有權限功能子功能run一遍

整體就是慢在這邊


解法

我使用另一個只撈id和name的Repo function, 準確的撈取我要的資料->帳號名稱

代替原本把account下面所有關聯查出來

大約看到finished在console中, 不到1秒就跑出來了

而證實拖累效能問題的確在這裡


finished!



2021年12月2日 星期四

模糊查詢遇到null情況的小坑


String medicalId = pbSearch.getMedicalId()==""?null:pbSearch.getMedicalId(); 		
String identityId = pbSearch.getIdentityId()==""?null:pbSearch.getIdentityId();
String fullname = pbSearch.getFullname()==""?"":pbSearch.getFullname();
String mode = pbSearch.getMode();
PageRequest pageRequest =  size == 0 ? null:  PageRequest.of(--page, size, Sort.by("sysTime").descending());	
PagepatientBasicList = patientBasicRepo.findVoByDomainAndMedicalIdOrIdentityIdOrFullnameOrMode(domain
				,medicalId, identityId, fullname,mode,pageRequest);
                
@Query("select new com.ICU.ICUmodule.vo.caseManage.PatientBasicVo(pb.id as id, pb.medicalId as medicalId, pb.identityId as identityId, pb.fullname as fullname, "
+ "pb.telephone as telephone, pb.localDate as localDate, pb.treatment as treatment, pr.mode as mode) "
+ "from patient_basic pb left join patient_returned pr on pb.id=pr.patientBasic.id "
+ "where pb.domain=:doamin and (:medicalId is null or pb.medicalId =:medicalId) and (:identityId is null or pb.identityId =:identityId) and (:fullname is '' or pb.fullname LIKE '%' || :fullname||'%') and (:mode is null or pr.mode =:mode)")
Page findVoByDomainAndMedicalIdOrIdentityIdOrFullnameOrMode(String doamin, String medicalId,
			String identityId, String fullname, String mode, Pageable pageRequest);

在一般情況下, 若是要判斷是否為 null 再拉進JPQL裡面做is null or object.xxx = :xxx

然而在模糊查詢的時候, 這裡若為 null 帶入到JPQL LIKE語法, 會產生判斷JPQL語法錯誤問題

因此在這裡LIKE語法是不能帶null, 而要給""字串來做判斷, 這樣JPQL就不會run出問題, 也可以進行模糊查詢及一般查詢

2021年12月1日 星期三

日期組成流水號

String no = repo.getLastIoNo();
String prefix = new SimpleDateFormat("yyyyMMdd").format(new Date());
prefix = prefix.substring(prefix.length() - 6);

        if(no != null && no.matches("^" + prefix + "\\d{3}$")) {
            no = String.valueOf(Integer.valueOf(no) + 1);
        } else if(no == null || !no.matches("^" + prefix + "\\d{3}$")) {
            no = String.format("%s%s", prefix, "001");
        } else {
            throw new Exception("Create StockIoMaster io_no fail");
        }

簡單的說, 這個組成的流水碼最後會變成yyMMdd001, 後面會隨數字變多yyMMdd002, 接續增加

而這組流水碼, 會從001開始, 如果資料庫有取出東西, 且同一prefix的情況, 會自動將序號轉成數字

加一, 這樣就產生一組新的序號在資料庫中

取資料的寫法如下


@Query("select max(m.ioNo) from stock_io_master as m")
String getLastIoNo();

2021年11月13日 星期六

英文閱讀的技巧

 utube筆記


增進英文閱讀方式全解析 

https://www.youtube.com/watch?v=DMQNNq3R3Hs

閱讀有兩種 

1 Intensive reading 密集閱讀 

少而精 ex 課文, 英文雜誌, 新聞 會提取出最多語文知識, 通常有老師幫助, 會較有挑戰

學習模式專注度高>突破舒適圈

2 Extensive reading 廣泛閱讀

多而廣的涉略 ex 小說 培養閱讀習慣語感, 可以提升閱讀文章速度, 大約自己的程度

放鬆休閒 舒適即可>有興趣最重要

補充: https://elt.oup.com/student/readersleveltest/?cc=tw&selLanguage=zh


英文速讀法 語言學觀點教你提升閱讀速度

https://www.youtube.com/watch?v=vSpUGt0CeNU


找topic sentence & 找關鍵字>skim and scan跳著看抓到重點

從語言學去看

1 閱讀速度快的能力

a 具有word recognition辨識字能力, 不需要有意識的去思考意思(下意思), 看到一個字不需要多花0.5秒去想他的意思, 不是認字能力, 而是對這個字的熟悉度, 看到一個字不會在上面停留太久

b 具有prosody拆句子能力, 一段一段拆開, 在轉折時拆開, 對句子結構拆開, 把一整團的字組合成一個小的意義單位, 從word轉成multi-word unit多字意義組合, 再轉成meaing意義

2 加速閱讀的練習方法

a extensive reading 大量閱讀, 閱讀會持續不間斷

b repeated reading 目的為了, 看到同一個字能很快反應, 那就是重複的看到同一個字, 每一次看都會越看越快, 可以提升自信心跟閱讀速度

3 保持閱讀速度的小技巧

她本身會打拍子


如何訓練閱讀能力 https://www.youtube.com/watch?v=eT962X3R2Mk

看不太懂的地方, 要重覆看, 不要直接下去


英文自學 https://www.youtube.com/watch?v=abqAHF7KSr8

長句中, 要看懂, 看主詞 主要動詞, 其他的是用來形容, 有形容主詞, 有形容動作, 有形容受詞

基本上這些形容刪去, 並不會影響意思, 所以抓住主軸反而簡化, 好理解



2021年10月20日 星期三

js 使用class時 引入, 以及全域變數問題 (Uncaught SyntaxError: Cannot use import statement outside a module)


當我們使用class的時候

可能如下









這種時候引入有兩方面

一面

引入的js地方要加上

import CheckFormatForDate from '../common/CheckFormatForDate.js';

另外該js在被引入html的時候, 要宣告type = "module"

如下



如果沒有宣告type="module"則會報 

Uncaught SyntaxError: Cannot use import statement outside a module


另外~當宣告成module, 該檔案中的變數就會和其他檔案的變數隔離

如果要做全域變數, 讓所有引入的module都能夠使用

可以用

window.aaa="aaa"; //宣告

var aaa = window.aaa; //取值

也可以用session

我自己想到另外的方式, 就是把它塞在畫面上隱藏的input中

也是可以解決變數被隔離但是你想做到全域變數的效果


回歸原本 如果不用class 直接引入js也是有全域變數的效果

2021年10月19日 星期二

save Vo 時 關聯被刪掉

簡單的說

因為雙向關聯的關係, 我們有可能會另外造一個Vo去接畫面上修改的內容

比方說, 角色, 更改名字的時候

但是這時候因為Vo中並沒有把關連帶進去

以至於我們直接拿Vo去new一個物件塞起來存, 他原本的關聯就會被儲存為沒關聯


因此, 若是在修改的動作下, 前面Vo丟進來的時候, 應該要先Get到該物件的entity

然後再把其中的屬性值Copy過去才對

原本有問題的寫法





改成



量身訂做建議(37 歲,6 年 Java 後端工程師)from chatgpt

🎯 量身訂做建議(37 歲,6 年 Java 後端工程師) 1️⃣ 先看你的條件 年齡 37 屬於「中高年資」工程師,履歷上的 深度 / 系統設計能力 會比「語言多寡」更重要。 6 年 Java 後端 代表你在 Spring Boot、資料庫、API 設計...