前言: 前端需求:進入盤點調整單作業時,當我調整庫存量
後,按儲存時此時庫存量
必須等於在庫序號數量。若此料號沒有開啟序號管理,則不需判斷。 後端需求:接受的資料僅需包含異動的部分。
參考資料: 同事JavaScript取出”陣列-物件“重複/不重複值的方法 流程圖
操作流程:
調整庫存量後
序號跳窗選取序號(可以選取不同頁碼)
再次調整庫存量
再按序號跳窗(必須顯示剛剛步驟二已選過序號)
序號有可能會被拿掉也有可能被加入
儲存
判斷在庫序號數量是否跟調整量相同(若不相同則不能儲存)
程式邏輯:
序號開啟跳窗,先取得後端資料
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]); }); }
當使用者有變更資料時,觸發自訂義事件,將變更資料暫存 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(); 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 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 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 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 ; } }
想法檢討
預期時間超出 200% ,簡單來說就是原本是一天的工作量。但我最後花了三天才做完。其中有一天都在鬼打牆狀態,直到詢問同事意見後,才突然頓悟。該如何縮短實際跟預估之間的落差?
程式卡關
抽離當下
多練習
Google 解題
持續保有信心
向外求助
測試時,發現程式一直有一些小 Bug
雖然不難處理,但頻率有點高,這部分又該如何處理?