---
# System prepended metadata

title: TAK 2021Q2

---

# TAK 2021Q2
## AS 機制前優化
### 為何需要優化
- Server資料需要有備援機制，以防正在運行的Server有問題時可以無痛快速地切換另一台主機，使原本的服務能夠正常
- 架構圖
![](https://i.imgur.com/IvnqB4J.jpg)


## PC人數使用時間統計
### MSSQL語法
- 通用資料表運算式 (CTE)
- nest CASE WHEN

![](https://i.imgur.com/wu1Gdpq.png)

```mermaid
graph TB
A[Initial HOL] --> B[擷取當日所在月份,日期在月份以內的資料]
B[擷取當日所在月份,日期在月份以內的資料]-->C[起始時間與結束時間在同一日]
B[擷取當日所在月份,日期在月份以內的資料]-->D[起始時間與結束時間在不同日]
C[起始時間與結束時間在同一日]-->N
D[起始時間與結束時間在不同日]-->E
subgraph 不同日計算邏輯
direction TB
E[1 起始時間在開盤前, 結束時間盤中] --> F[2 起始時間在盤中, 結束時間在開盤前]
F[2 起始時間在盤中, 結束時間在開盤前] --> G[3 起始時間在盤中, 結束時間在盤中]
G[3 起始時間在盤中, 結束時間在盤中] --> H[4 起始時間在盤中, 結束時間在收盤後]
H[4 起始時間在盤中, 結束時間在收盤後] --> I[5 起始時間在開盤前, 結束時間在收盤後]
I[5 起始時間在開盤前, 結束時間在收盤後] --> J[6 起始時間與結束時間都在收盤後]
J[6 起始時間與結束時間都在收盤後] --> K[7 起始時間與結束時間 都在開盤前]
K[7 起始時間與結束時間 都在開盤前] --> L[8 起始時間在收盤後, 結束時間 在開盤後]
L[8 起始時間在收盤後, 結束時間 在開盤後]
end
subgraph 同日計算邏輯
direction TB
N[計算起始時間與結束時間]
end
L --> M
N --> M[當日每人總使用時間]
M --> O[存入每月資料表]
O --> P[提供給前端]
```

## Syslog API 串接
- syslogt 串接
```mermaid
graph LR
H[syslog] --> B[login_log] 
H[syslog] --> C[use_time_log]
H[syslog] --> D[mitake_rainbow]
B[login_log] --> E[login_log format text parser]
C[use_time_log] --> F[use_time format text parser]
D[mitake_rainbow] --> G[mitake_rainbow json parser]
E[login_log format text parser] --> A[chogath]
F[use_time format text parser] --> A[chogath]
G[mitake_rainbow json parser] --> A[chogath]
A[chogath] --> I[MSSQL DB]
```

- 目前Amumu串連架構說明
```mermaid
graph LR
K:::someclass
classDef someclass fill:#f96;
F(Braum) --> B(Chogath)
B(Chogath) --> F(Braum)
B(Chogath) --> A[Amumu GW]
A[Amumu GW] --> B(Chogath)
B(Chogath) --> C(soryu)
K(Syslog) --> B(Chogath)
K(Syslog) --> H
D(PDA) -->|券商資料| B(Chogath)
B(Chogath) --> |多券商資料|D(PDA)
E(研本類股編輯,push alert) --> A[Amumu]
A[Amumu] --> E(研本類股編輯,push alert)
A[Amumu] --> G[前端UI]
H(Chogath Sync) --> B(Chogath)
F(Braum) -->|備份| I(LoginLogBak)
A[Amumu] -->|API| J[PLM]
J[PLM] -->|資料回傳| A[Amumu GW]
```

## goutility
### 建構目的
- 將golang共通性的方法放入此元件內，藉此減少專案間的共用程式碼
### 安裝方式
```
go get -u gitlab01.mitake.com.tw/RD1/GO/goutility.git
```
### golang test 介紹
![](https://i.imgur.com/ziJsFYS.png)

![](https://i.imgur.com/31Y2qAS.png)

![](https://i.imgur.com/YsZVylT.png)

### command line
- 測試package
```shell
go test -v -cover=true gitlab01.mitake.com.tw/RD1/GO/goutility.git/example
```

- 測試檔案
```shell
go test -v -cover=true example.go example_test.go
```

### gotests 介紹
#### 常用操作

1.進入對應的要被生成單元測試的目錄

2.在該目錄下執行命令

3.生成指定函式的單元測試，輸出到命令列，然後複製貼上到目標處。
```shell
gotests -only "函式名稱" 檔名稱.go
```
4.生成全部測試函式

```shell
gotests -all 檔名稱.go
```
```shell
gotests -only " 方法名稱" 檔名稱
```
```shell
gotests -all -w origin.go, origin_test.go
```
會自動建立在當前目錄下，並自動生成測試程式碼,只需要將不同的測試資料按照tests定義的結構寫在 <span style="color:green">//TODO:Add test cases</span>.下面，測試用例就完成了

- 網路文章參考
[github gotests](https://github.com/cweill/gotests)
[golang 测试gotests](https://studygolang.com/articles/26750)

## Amumu複委託API
* 串接研發本部提供的複委託API
![](https://i.imgur.com/KFXS8HH.png)



## 習得工具或技術
- [gotests](https://github.com/cweill/gotests)

## 未來展望學習
- Portman unit test
- goutility unit test & CI
- mysql to mssql