Andy's blog

If you always do what you've always done, you'll always get what you've always got.

0%

2021-07-28-[工作]IWMS盤點序號邏輯整理

前言:
前端需求:進入盤點調整單作業時,當我調整庫存量後,按儲存時此時庫存量必須等於在庫序號數量。若此料號沒有開啟序號管理,則不需判斷。
後端需求:接受的資料僅需包含異動的部分。


參考資料:
同事
JavaScript取出”陣列-物件“重複/不重複值的方法
流程圖


操作流程:

  1. 調整庫存量後
  2. 序號跳窗選取序號(可以選取不同頁碼)
  3. 再次調整庫存量
  4. 再按序號跳窗(必須顯示剛剛步驟二已選過序號)
  5. 序號有可能會被拿掉也有可能被加入
  6. 儲存
  7. 判斷在庫序號數量是否跟調整量相同(若不相同則不能儲存)

程式邏輯:

  1. 序號開啟跳窗,先取得後端資料
1
2
3
4
5
6
7
8
9
10
// 序號選取狀態判斷
function adjustselectedSerialData() {
let grid = $("#Grid_SEAIAL_NUMBER").data("kendoGrid");
let rawArray = $("#Grid_SEAIAL_NUMBER").data("kendoGrid").dataSource._data.toJSON(); // 後端回傳的序號資料

rawArray.filter(item => {
item.STOCK === true ? (grid._selectedIds[item.SEAIAL_NUMBER] = true) : (delete grid._selectedIds[item.SEAIAL_NUMBER]);
});

}
  1. 當使用者有變更資料時,觸發自訂義事件,將變更資料暫存 tempChangeSerial 與異動過後新增在庫序號非在庫序號分別存在兩個陣列中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
let tempChangeSerial = [];
let AddSEAIAL_NUMBER_Data = [];
let MinusSEAIAL_NUMBER_Data = [];

//品號序號暫存
function addTempSerialItem(e) {
let $tr = $(e.target).closest('tr');
let $Grid = $("#Grid_SEAIAL_NUMBER").getKendoGrid();
let $dataItem = $Grid.dataItem($tr).toJSON();

//使用者點了全選/反選ALL
if ($tr.closest("div")[0].className.indexOf("k-grid-header-wrap") !== -1) {
let $Grid = $("#Grid_SEAIAL_NUMBER").data("kendoGrid").dataSource._data.toJSON();
for (let i = 0; i < $Grid.length; i++) {
// 紀錄變更序號 & 更改狀態
$(this).prop('checked') === true ? addSEAIAL_NUMBER_Data($Grid[i]) : minusSEAIAL_NUMBER_Data($Grid[i]);
tempChangeSerial.push($Grid[i]);
};
}
else {
// 紀錄變更序號
$(this).prop('checked') === true ? addSEAIAL_NUMBER_Data($dataItem) : minusSEAIAL_NUMBER_Data($dataItem);
tempChangeSerial.push($dataItem);
}
const set1 = new Set();
tempChangeSerial.reverse();
tempChangeSerial = tempChangeSerial.filter(item => !set1.has(item.SEAIAL_NUMBER) ? set1.add(item.SEAIAL_NUMBER) : false);
}

// 在庫序號數量增加
function addSEAIAL_NUMBER_Data($dataItem) {
const set = new Set();
$dataItem.STOCK = true;
AddSEAIAL_NUMBER_Data.push($dataItem);
AddSEAIAL_NUMBER_Data.reverse();
AddSEAIAL_NUMBER_Data = AddSEAIAL_NUMBER_Data.filter(item => !set.has(item.SEAIAL_NUMBER) ? set.add(item.SEAIAL_NUMBER) : false);
}

// 在庫序號數量減少
function minusSEAIAL_NUMBER_Data($dataItem) {
const set = new Set();
$dataItem.STOCK = false;
MinusSEAIAL_NUMBER_Data.push($dataItem);
MinusSEAIAL_NUMBER_Data.reverse();
MinusSEAIAL_NUMBER_Data = MinusSEAIAL_NUMBER_Data.filter(item => !set.has(item.SEAIAL_NUMBER) ? set.add(item.SEAIAL_NUMBER) : false);
}
  1. 切分頁時、關閉在開啟後每次都會觸發頁面重新渲染原始資料。因此,剛剛有變更資料必須重新覆蓋。
1
2
3
4
5
6
7
8
9
// 使用者有變更,要調整序號狀態
if (tempChangeSerial.length !== 0) {
let Serial = tempChangeSerial;
for (let i = 0; i < Serial.length; i++) {
let temp = Serial[i].SEAIAL_NUMBER;
let stockStatus = Serial[i].STOCK;
stockStatus === true ? (grid._selectedIds[temp] = true) : (delete grid._selectedIds[temp]);
}
}
  1. 序號跳窗儲存
    1. 此次在庫數量變更
    2. 變動序號暫儲存
    3. 所有剛剛變更資料儲存進去共用區域變數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
dataItem.Front_DIFF_QTY = AddSEAIAL_NUMBER_Data.length - MinusSEAIAL_NUMBER_Data.length; //計算此次在庫數量增減
dataItem.SEAIAL_NUMBERList = [...AddSEAIAL_NUMBER_Data, ...MinusSEAIAL_NUMBER_Data];
dataItem.INVT_QTY = dataItem.OLD_INVT_QTY + dataItem.Front_DIFF_QTY;
dataItem.DIFF_QTY = dataItem.INVT_QTY - dataItem.STOCK_QTY;
if (dataItem.SEAIAL_NUMBERList.length !== 0) {
checkChangeSerial_Is_Exist(dataItem); //新增暫存資料
}
checkUpdateDataIs_Exist(dataItem); //新增給後端變更資料
tempChangeSerial = [];
AddSEAIAL_NUMBER_Data = [];
MinusSEAIAL_NUMBER_Data = [];

function checkChangeSerial_Is_Exist(dataItem) {
const set = new Set();
tempChangeSerial.push(dataItem.SEAIAL_NUMBERList[0]);
tempChangeSerial.reverse();
tempChangeSerial = tempChangeSerial.filter(item => !set.has(item.SEAIAL_NUMBER) ? set.add(item.SEAIAL_NUMBER) : false);
dataItem.SEAIAL_NUMBERList = tempChangeSerial; // 加上前次變更內容
}

function checkUpdateDataIs_Exist(dataItem) {
let pushData = dataItem;
const set = new Set();
if (pushData._events !== undefined) {
pushData = pushData.toJSON();
}
SourceItem.push(pushData);
SourceItem.reverse();
SourceItem = SourceItem.filter(item => !set.has(item.ITEM_NO) ? set.add(item.ITEM_NO) : false);
}
  1. 送出前資料數量確認
1
2
3
4
5
6
7
8
9
function checkSendData() {
for (let i = 0; i < SourceItem.length; i++) {
if (SourceItem[i].INVT_QTY !== (SourceItem[i].OLD_INVT_QTY + SourceItem[i].Front_DIFF_QTY)) {
alert(i18n.t("app.ITEM_NO") + SourceItem[i].ITEM_NO + ": " + i18n.t("app.SEAIAL_NUMBER_AND_INVT_QTY_Error"))
return true;
}
return false;
}
}

想法檢討

  1. 預期時間超出 200% ,簡單來說就是原本是一天的工作量。但我最後花了三天才做完。其中有一天都在鬼打牆狀態,直到詢問同事意見後,才突然頓悟。該如何縮短實際跟預估之間的落差?
  • 程式卡關
    1. 抽離當下
    2. 多練習
    3. Google 解題
    4. 持續保有信心
    5. 向外求助
  1. 測試時,發現程式一直有一些小 Bug 雖然不難處理,但頻率有點高,這部分又該如何處理?
  • 絕大部分的不良程式設計習慣都源於無知
    1. 沒自己嘗試就開始Google
    2. 單元測試
    3. Eslint 養成開發習慣
      https://iter01.com/148715.html