---
# System prepended metadata

title: Pixis工作紀錄

---

# Pixis工作紀錄

# 週報 7/22

仍在進行自動產生sql的功能
- 自動依照路由join
- 可建立衍生欄位 並且指定路由 例如IpAddresses.Ip欄位建立HOST_IP衍生欄位 可指定其查詢依賴HostInfos.IpAddressId
- 一對多時自動聚合

Todos
- AB 表 join 時依靠中間表的問題
- 擴充欄位
- 過濾條件

#### RelationBuilder建立範例
```cs
var relations = new RelationBuilder()
            .OnTable("IpAddresses")
                .OnField("Id", FieldType.Int).IsPrimaryKey()
                .OnField("Ip", FieldType.String)
                    .OnSpecifyJoinField("HostIp", "HostInfos", "IpAddressId")
                    .OnSpecifyJoinField("TestIp", "HostInfos", "Id")
            .OnTable("HostInfos")
                .OnField("Id", FieldType.Int).IsPrimaryKey()
                .OnField("IpAddressId", FieldType.Int)
                    .HasJoinRule("IpAddresses", "Id")
                .OnField("MacAddressId", FieldType.Int)
```

#### 建立sql查詢範例1

```cs
var sql = new SqlQueryBuilder(r, "HostInfos")
    .AddField("HostInfos", "Id")
    .AddField("HostInfos", "IpAddressId")
    .AddField("IpAddresses", "Ip")
    .Build();
```

```sql
SELECT
  #HostInfos.Id as HostInfos_Id,
  #HostInfos.IpAddressId as HostInfos_IpAddressId,
  #IpAddresses.Ip as IpAddresses_Ip
FROM HostInfos AS #HostInfos
  LEFT JOIN IpAddresses AS #IpAddresses ON #HostInfos.IpAddressId = #IpAddresses.Id
```
#### 建立sql查詢範例2

```cs
var sql = new SqlQueryBuilder(r, "IpAddresses")
    .AddField("IpAddresses", "Id")
    .AddField("IpAddresses", "Ip")
    .AddField("HostInfos", "Id")
    .Build();
```

```sql
WITH #HostInfos#AGG AS
(
    SELECT
        IpAddressId AS GroupById,
        STRING_AGG(HostInfos.Id, ';') AS Id
    FROM HostInfos
    GROUP BY IpAddressId
)
SELECT
  #IpAddresses.Id as IpAddresses_Id,
  #IpAddresses.Ip as IpAddresses_Ip,
  #HostInfos#AGG.Id as HostInfos_Id
FROM IpAddresses AS #IpAddresses
  LEFT JOIN #HostInfos#AGG ON #IpAddresses.Id = #HostInfos#AGG.GroupById
```




# 7/22

`8:30~10 : 1.5hours`
`12:00~16:30 : 4.5hours`
修正 join route 智障的問題

# 7/21

`10~11 : 1hours`
`12~19 : 7hours`

- TODO

  - AB 表 join 時依靠中間表的問題
  - 擴充欄位
  - 過濾條件
  - 修正 join route 智障的問題

- 必要的限制

# 7/20

`14:00~21:30 : 7.5hours`

- 建立查詢流程 RelationBuilder SqlQueryBuilder

# 7/15

`9:00~9:30 : 0.5hours`

- 建立模擬資料

# 7/13

`11:00~14:00 : 3hours`
`15:00~21:00 : 6hours`
建立模擬資料

實做順序

- 先制定關聯檔
- 制定查詢檔
- 自動生成 sql

# 7/12

`11:00~11:30 : 0.5hours`
討論 vue 表格建立流程

# 7/11

`8:30~9:30 : 1hours`
`12:30~1:30 : 1hours`
測試 sql 查詢

# 7/10

`18:30~21:00 : 2.5hours`
測試用純 sql 建立查詢

# 7/9

`11:00~11:30 : 0.5hours`
討論表格回傳格式

# 7/8

`18:30~21:30 : 3hours`
嘗試動態 group 子項(as list)

卡在一對多的問題上? 如果沒有一對多(轉為字串) 可以做到什麼程度?

- 一對多的禁止項目
  - 禁止作為排序子
  - 禁止作為過濾條件
  - 禁止查詢擴充欄位
  - 沒有下一層

問一下 brian 現況是怎麼做?

# 7/6

`9~12 : 3hours`
完成動態欄位 filter

`13~16 : 3hours`
`18~23 : 5hours`
嘗試建立自適應的複合查詢機制
測試 System.Linq.Dynamic.Core

大致上可以動態查詢 但要更靈活就必須做`動態類`才能更好的 group


# 7/5

`17:00~17:30 : 0.5hours`
與伯彥討論表格相關功能

# 7/4

`08:30~11:00 : 2.5hours`
動態欄位 filter 驗證與除錯

# 7/3

`08:30~10:00 : 1.5hours`
`05:30~7:00 : 1.5hours`
動態欄位 filter 以中序樹建立查詢

# 7/2

`18:30~22:30 : 4hours`
動態欄位 filter 改寫為中序樹解析

# 7/1

`08:30~10:30 : 2hours`
動態欄位 filter

# 6/30

`09~11 : 2hours`
`12~18 : 6hours`

實作動態欄位
動態欄位 filter

# 6/29

`10:30~18:30 : 8hours`

實作動態欄位

# 6/23

`09~10:30 : 1.5hours`
`11:30~16:30 : 5hours`

restore project
ui 模組無法編譯
ModuleLoader 支援多 DB

# 6/18

`15~15:30 : 0.5hours`

與伯彥討論`mainui-lib`的登入過程

# 6/11

`14~14:30 : 0.5hours`

與湯哥討論`mainui-lib與route`

# 6/8

`10~12:30 : 2.5hours`

與湯哥討論`動態欄位`與`vue的auto import`

# 6/5

`16:30~17:30 : 1hours`

協同處理 vue 的 route 問題

# 6/2

`10~17 : 7hours`

完成 IMHubService 的 ClientInfo 取得與復原

開發 devjet 時

- mainsvr 要加參考 devjet 的 project ref (且要=true)
- booter.common 要加參考 devjet (原本 server.common 的 package ref 保留)
- booter 參考 booter.common 要改為 project ref
- server.common 不用加
- 或只加 project ref 到 server.common 其他所有有參考 server.common 的全改為 project ref

專案架構調整完成

- 模組名稱與專案名稱分離(日後 module.json 要指定模組名稱)
- 移除 dev_root
- 剩下 ui 需要 link
- IMHubService 可直接取得 ClientInfo, 模組重載也會自動恢復
- 暫時移除 `Mgmt.Port.Worker模組` 中的 `IEventLogService` 因其宣告在`Mgmt.Logs模組`無法被參考
  - `似乎有掉code?` 還請湯哥檢查一下

# 6/1

`9:30~12 : 2.5hours`
`13~21 : 8hours`

建立管理 client info 的機制 (Client 要能在模組重啟後復原)

翻新目錄架構 (servie 不做 link)

暫時移除 Mgmt.Port.Worker 中的 IEventLogService `似乎有掉code`

mainsvr\.modules\Mgmt.Port.Worker\src\IM\MgmtIMHubService.cs





# 5/31

`19~22 : 3hours`

與湯哥會議
建立管理 client info 的機制 (1.自動獲取 2.自動復原)
要動底層不方便 (卡關 => 調整專案目錄)

# 5/30

`19~22 : 3hours`

繼續處理昨日 pull 下來的專案無法執行建置的問題

建立管理 client info 的機制

# 5/29

`21~22:30 : 1.5hours`

symlink 造成一些問題
例如在連結的檔案更改 但 git 卻沒有反應出來
在原始的檔案更改 連結的檔案卻沒有反應
我測試過 檔案的連結是正常的
但是編輯器與 git 可能有某些機制 例如快取 使其沒辦法立即反應
可以再 link all 依次 會觸發同步的機制

也因為這樣 可能導致某些檔案沒上到 git
我 checkout 最新的 dev 發現了一些問題

太晚了 不確定有沒看錯 XD

# 5/26

`11~21 : 10hours`

- 解決 IMHub 的 scope 異常問題

- TODO. client 還不行

C:\projects\AtheNAC_10\src\apps\probe\dev_root\mainsvr\.modules\Probe.Port.Worker\src\Services\MgmtIMClient.cs

# 5/23

`18~21 : 3hours`

將 hub handler 改為 scoped
(遇到套件找不到版本的問題)

# 5/21

`11~13 : 2hours`

修正模組無發起用開發模式的問題

# 5/18

`8~21 : 13hours`

重構 nuget

套件已全數推到共用 nuget, 版本全數從 0.0.1 開始

```sh
# 安裝nuget cli

# 加入sources (可能不需要username/password也可以restore)
nuget sources add -name pixis -source http://192.168.10.31:5555/v3/index.json -username jim.liu@pixis.com.tw -password 111aaaBBB

# 發佈
nuget push -Source pixis -ApiKey 111aaaBBB symbol.package.1.0.0.snupkg

```

- 檔案結構有改變

  - dev_root => 沒變 但是.modules 移到外面了
  - repos
    - commond => 套件
    - modules => 模組

- modules 移到外面的原因

  - 因為搜尋時容易出現兩個檔案(一個是 symlink)
  - 無法搜尋 symlink 可在 vscode 開啟 search.followSymlinks

- mainui-lib 只保留一個讓 app 共用

- ui 模組在開發模式可以 hot reload 了

- demo2/mgmt/probe 都測過一次 so far so good!

# 5/15

`2hours`

協作 vue mainui-lib 的 export 規劃問題

# 5/14

`2hours`

協作 vue mainui-lib 的 export 消失的問題

# 5/13

`2hours`

與湯哥討論後續
協作 vue mainui-lib 的 export 消失的問題

# 5/12

`11~21 : 10hours`

完成 `IMHub` 新架構的整合與測試

# 5/10

`10~12 : 2hours`
`13~17 : 4hours`

- Unable to load DLL 'wpcap'
  https://www.winpcap.org/install/default.htm

轉移應用

ISendService
LiteLoginStrategy
SwitchBaseInfoStrategy
PortWorkerSetting

# 5/9

`8:30~12:00 : 3.5hours`

json 問題告一段落 model 送收正常

- TODO:
  - db 要可以連
  - LiteLoginStrategy 換成 接收函數處理
  - 命名重構 (再最後併完 dev 才能做)

# 5/8

`8:30~9:30 : 1hours`
終於重新接通 mgmt 跟 probe 的通訊

TODO : message code 改為 function handle
`18~21 : 3hours`
enum code -> function call

# 5/7

`1hours`

vuexy 整併到 demo2 引發的問題
協助分析廠商提供的 api data model

`19~22 : 3hours`

試試看更新 Mgmt.Booter.Common 因為其依賴有更新

# 5/6

`1hours`

vuexy 整併到 demo2 引發的問題

# 5/5

`13~18 :  5hours`

層級區分 : App > (Probe/Mgmt) > Module

關鍵字
sendService.Send

TODO:
已經刪掉 Mgmt.Common 的 SendService 相關內容
再來要加入新的機制到模組中

# 5/4

`9~19 : 10hours`

# 5/3

`13~18: 5hours`
繼續實現

# 5/2

`9~12 14~18: 7hours`

- Server 拆分
  - Emitter : 發送訊息
  - Listener : 接收訊息
- Client 發送接收合併 (分層 比較清晰 不會 call 錯函數?)
- 先在 probe 實作 目標 : 達到方法可在模組中動態擴充 且 使用方便

# 5/1

`9~12 14~18: 7hours`

signalR 的部分 雖然沒有`non-collectible`問題 但不好使用 也很難在不同模組間共用或擴充

故改用註冊 Handler 方式處理 以便共同/分散處理 signalR 的各類訊息

- 以 probe 為例

  - 做為一個 server (AppIMHub)

    - 我要發送訊息給 client => 注入(IHubContext<AppIMHub> hub) 取得 server
    - 我要處理給 probe 的訊息 => 實作 IProbeIMHandler 並註冊

  - 做為一個 client (IMgmtClient)
    - 我要發送訊息給 mgmt => 實作一個 mgmt 的 client (要知道 mgmt 的介面 與 方法 與 DTO)

訊息格式

```json
{
  "ns": "namespace",
  "method": "test",
  "data": {}
}
```

probe/im 下的應該可以全部移到 probe-common

app-common 裡面放 methodName DTO (mgmt/probe 之間)
