/* * @Overview 생산계획등록 */ class Tb_main_class { constructor(container) { this.ajaxUrl = "./reg_plan.ajax.php"; this.tbList = ""; this.lastGroupId = 0; this.container = document.querySelector(container); this.table = this.container.querySelector(".hy-table"); this.addBtn = this.container.querySelector(".add-btn"); this.removeBtn = this.container.querySelector(".remove-btn"); } /* * @Overview 생산계획등록 * @Parameter DATABASE로부터 받은 데이터 * @function DB 데이터 가공하여 테이블에 바인딩. */ manageData(data) { // console.log(data); let _this = this; let arr = new Array(); const result = Object.groupBy(data.data, ({ id }) => id) for(let i=0; i<=Object.values(result).length; i++){ // console.log(Object.values(result)[]); let makingITEM = Object.values(result)[i]?.map(function(rst){ let tempITEM ={}; // let date = rst.PLAN_DT.date.slice(0, 10); let date = rst.PLAN_DT.slice(0, 10).replace(/-/g, '_'); let arr = new Array(); tempITEM['id'] = rst.id tempITEM['PLAN_FACLT_CD'] = rst.PLAN_FACLT_CD tempITEM['PLAN_FACLT_NM'] = rst.PLAN_FACLT_NM tempITEM['WRK_TEAM'] = rst.WRK_TEAM tempITEM['SEPER'] = "그룹" tempITEM[`AM_PLAN_QTY_${date}`] = rst.AMITEM tempITEM[`PM_PLAN_QTY_${date}`] = rst.PMITEM tempITEM[`NI_PLAN_QTY_${date}`] = rst.NIITEM _this.lastGroupId = parseInt(rst.id); return tempITEM; }) let makingQTY = Object.values(result)[i]?.map(function(rst){ let tempQTY ={}; let date = rst.PLAN_DT.slice(0, 10).replace(/-/g, '_'); let arr = new Array(); tempQTY['id'] = rst.id tempQTY['SEPER'] = "계획" tempQTY['PLAN_FACLT_CD'] = rst.PLAN_FACLT_CD tempQTY['PLAN_FACLT_NM'] = rst.PLAN_FACLT_NM tempQTY['WRK_TEAM'] = rst.WRK_TEAM tempQTY[`AM_PLAN_QTY_${date}`] = rst.AMQTY tempQTY[`PM_PLAN_QTY_${date}`] = rst.PMQTY tempQTY[`NI_PLAN_QTY_${date}`] = rst.NIQTY _this.lastGroupId = parseInt(rst.id); return tempQTY; }) let makingPRD = Object.values(result)[i]?.map(function(rst){ let tempPRD ={}; let date = rst.PLAN_DT.slice(0, 10).replace(/-/g, '_'); let arr = new Array(); tempPRD['id'] = rst.id tempPRD['SEPER'] = "실적" tempPRD['PLAN_FACLT_CD'] = rst.PLAN_FACLT_CD tempPRD['PLAN_FACLT_NM'] = rst.PLAN_FACLT_NM tempPRD['WRK_TEAM'] = rst.WRK_TEAM tempPRD[`AM_PLAN_QTY_${date}`] = rst.AMPRD tempPRD[`PM_PLAN_QTY_${date}`] = rst.PMPRD tempPRD[`NI_PLAN_QTY_${date}`] = rst.NIPRD _this.lastGroupId = parseInt(rst.id); return tempPRD; }) const sumObjItem = {}; const sumObjQty = {}; const sumObjPrd = {}; if(makingITEM !==undefined){ makingITEM.forEach(obj => { Object.keys(obj).forEach(key => { sumObjItem[key] = obj[key]; }); }); makingQTY.forEach(obj => { Object.keys(obj).forEach(key => { sumObjQty[key] = obj[key]; }); }); makingPRD.forEach(obj => { Object.keys(obj).forEach(key => { sumObjPrd[key] = obj[key]; }); }); arr.push(sumObjItem); arr.push(sumObjQty); arr.push(sumObjPrd); } } return arr; } /* * @Overview 데이터 조회 함수 * @Parameter ajax 비동기통신에서 프로시져 사용할 "mode" / input 태그의 id에 해당하는 test */ getMainList(mode, ...test) { const talert= window.setTimeout(()=> { this.tbList.alert("Loading ...") }, 1000); let arr = test; // console.log(arr); // let testList = new Array(); let data = new Object(); for (let i = 0; i < arr.length; i++) { let temp = [arr[i]]; // console.log(temp); // if (document.getElementById(arr[i]).type == "checkbox") { // data[temp] = document.getElementById(temp).checked ? "Y" : "N"; // } else { data[temp] = document.getElementById(temp)?.value; // } } data.mode = mode; // let USEFLAG = document.getElementById("USE_FLG").checked?"Y":"N"; //사용여부 ajax_json({ url: this.ajaxUrl, data: data, success: (data) => { if (data.code) { //DB에서 받아온 데이터 가공하는 manageData 함수 참조 this.tbList.setData(this.manageData(data)); } else { kuls_alert(data.mesg); } }, error: (req, status, err) => { kuls_alert(err.message); }, complete: () => { window.clearTimeout(talert); this.tbList.clearAlert(); // this.setFilter(); // this.tbList.getRows().forEach(row=>{ // row.getCell("PLAN_FACLT_CD").getElement().addEventListener("click",(e)=>{ // this.rowClick(e,row); // }) // }); }, }); return true; } /* * @Overview 데이터 필터 함수 * @Parameter 없음 */ setFilter() { this.tbList =""; this.init(); this.getMainList( "getPlanList", "team_pop", "product_pop", "sub_product_pop", "plan_date" ); } /* * @Overview 테이블 행 추가 함수 * @Parameter 없음 * @function 기본키, _STATUS_:I 값을 넣은 행 추가 */ addRow() { this.lastGroupId += 1; // Tabulator 인스턴스에 데이터 추가 this.tbList.addRow({ SEQ_NO: this.lastGroupId, SEPER: "그룹", _STATUS_: "I", SEPER_ID: "GRP", }); this.tbList.addRow({ SEQ_NO: this.lastGroupId, SEPER: "계획", _STATUS_: "I", SEPER_ID: "PLAN", }); this.tbList.addRow({ SEQ_NO: this.lastGroupId, SEPER: "실적", SEPER_ID: "PRD", }); } /* * @Overview 테이블 행 삭제 함수 * @Parameter 없음 * @function 선택된 모든 행 삭제 */ removeRow() { const selectedRows = this.tbList.getRows().filter((row) => { return row.getData().check === "Y"; }); if (selectedRows.length > 0) { kuls_confirm("삭제", "하시겠습니까?", () => { // 선택된 각 행 삭제 selectedRows.forEach((row) => { // STAUS D로 바꾸기 row.getData()._STATUS_ = row.getData()._STATUS_ == "I" ? null : "D"; const rowElement = row.getElement(); rowElement.classList.add("remove-row"); }); }); } else { kuls_alert("삭제할 행을 선택해주세요."); } } /* * @Overview 테이블 행 클릭 함수 * @Parameter 셀 * @function 클릭한 테이블 행의 전체 그룹 선택(3줄씩) */ groupRowClick(e, tgt) { const rows = tgt.getRows(); rows.forEach((row) => { if (row.isSelected()) { row.deselect(); tgt.getElement().classList.remove("select"); } else { row.select(); tgt.getElement().classList.add("select"); } }); } /* * @Overview 테이블 셀 클릭 함수 * @Parameter 이벤트, 타겟 * @function 클릭한 셀에 따라 각각 다른 이벤트 설정 * @function 팝업, 체크박스 등 */ cellClick(e, tgt) {} /* * @Overview 테이블 셀 수정 함수 * @Parameter 셀 * @function 셀 편집이 이후 저장될수 있도록 _STATUS_:U로 데이터 업데이트 * @function 팀, 설비 열의 경우 한번만 수정해도 같이 수정되도록 함. */ cellEdited(cell) { let _this = this; const std = cell.getRow().getData().id; cell.getRow().getGroup().getRows().filter(function(data){ return data._row.data.id === std ?data._row.data._STATUS_ = 'U' : '' }) } /* * @Overview 데이터 편집 함수 * @Parameter 없음 * @function _STATUS_ 값이 있는 데이터만 추려서 없으면 생성, 있으면 수정하기 */ putData() { let _this = this; let talert = window.setTimeout(() => { _this.tbList.alert("Loading ...") }, 1000); const result = Object.groupBy(this.tbList.getData().filter((row) => row._STATUS_), ({ id }) => id) // console.log(JSON.stringify(result)); // 저장 시 상태 변화 없는 row 요청 X if (this.tbList.getData().filter((row) => row._STATUS_).length == 0) { // this.getMainList(); return false; } const blankObj = []; const reqData = []; this.tbList.getRows().forEach((row) => { // console.log(row.getData('_STATUS_')) if (row.getData()["_STATUS_"]) { if ( Object.keys(row._row.data) .filter((key) => key !== "_STATUS_" && key !== "USE_FLG") .every((key) => { const value = row._row.data[key]; return value === undefined || value === ""; }) ) { blankObj.push(row); } else { reqData.push(row.getData()); } } }); let postdata = { mode: "putPlan", reqdata: JSON.stringify(result), date : document.getElementById('plan_date').value }; ajax_json({ url: this.ajaxUrl, data: postdata, success: function (data) { if (data.code) { kuls_success("저장되었습니다."); _this.getMainList("getPlanList", "team_pop", "sub_product_pop", "plan_date"); } else { // kuls_alert(data.mesg); } }, error: function (request, status, error) { kuls_alert("잘못된 값을 입력하였습니다"); //프로시져에서 반환 메시지 수정 필요 }, complete: function () { window.clearTimeout(talert); _this.tbList.clearAlert(); }, }); } /* * @Overview 날짜 가져오는 함수 * @Parameter 없음 * @function 현재 날짜 부터 일주일간 리스트화 하기 */ getDate() { const columns = []; const daysToAdd = 7; // Including today and the next 6 days // console.log(document.querySelector("#date_st").value); for (let i = 0; i < daysToAdd; i++) { const date = new Date(document.querySelector("#plan_date").value); date.setDate(date.getDate() + i); // Formatting the date to "MM월 DD일" format let year = date.getFullYear(); let month = ("0" + (date.getMonth() + 1)).slice(-2); // Adding leading zero let day = ("0" + date.getDate()).slice(-2); // Adding leading zero let formattedDate = `${month}월 ${day}일`; const varsITEM_GRP2 = { "":"", ...varsITEM_GRP, } columns.push({ title: formattedDate, columns: [ { field: "AM_PLAN_QTY_" + year + "_" + month + "_" + day, title: "오전", hozAlign: "center", editor: tb_custom_editor.regPlan, editorParams:{checkPoint: 'SEPER',values: varsITEM_GRP2,}, formatter: tb_custom_formatter.selectOrNum, formatterParams:{checkPoint: 'SEPER'}, width: '50', editable: (cell) => { return cell.getRow().getPosition() % 3 !== 0; }, }, { field: "PM_PLAN_QTY_" + year + "_" + month + "_" + day, title: "오후", hozAlign: "center", editor: tb_custom_editor.regPlan, editorParams:{checkPoint: 'SEPER',values: varsITEM_GRP2,}, formatter: tb_custom_formatter.selectOrNum, formatterParams:{checkPoint: 'SEPER'}, width: '50', editable: (cell) => { return cell.getRow().getPosition() % 3 !== 0; }, }, { field: "NI_PLAN_QTY_" + year + "_" + month + "_" + day, title: "야간", hozAlign: "center", width: '50', editor: tb_custom_editor.regPlan, editorParams:{checkPoint: 'SEPER',values: varsITEM_GRP2,}, formatter: tb_custom_formatter.selectOrNum, formatterParams:{checkPoint: 'SEPER'}, editable: (cell) => { return cell.getRow().getPosition() % 3 !== 0; }, }, ], }); } return columns; } /* * @Overview 최초 실행 함수 * @Parameter 없음 */ init() { let fields = ""; // field 정의 fields = [ {field: "id", title: "id", width: '100', editor:"input",visible:false}, {field: "WRK_TEAM", title: "설비그룹", width: '100' ,visible: false}, {field: "PLAN_FACLT_CD", title: "설비", width: '100',frozen:true, formatter: tb_custom_formatter.rowspan_3}, {field: "PLAN_FACLT_NM", title: "설비명", width: '100',frozen:true, formatter: tb_custom_formatter.rowspan_3}, {field: "SEPER", title: "구분", width: '100'}, // 날짜 필드 동적으로 넣을것 오늘부터 7일까지 ...this.getDate(), ]; let commonFieldData = ""; commonFieldData = { headerSort: true, vertAlign: "middle", hozAlign: "center", resizable: "header", //Resize 는 헤더에서만 가능 headerHozAlign: "center", //헤더 정렬 headerSortTristate: true, //데이터 정렬 => 정/역/초기화 }; // this.tbList = ""; this.tbList = null; // 변수를 null로 설정 this.tbList = new Tabulator(this.table, { layout: "fitColumns", clipboard:true, clipboardCopySelector: "table", clipboardPasteParser: function(clipboard){ console.log(clipboard) return clipboard.split("\n").map(function(row){ let cells = row.split("\t"); return {name: cells[0], age: cells[1], col: cells[2], dob: cells[3]}; }); }, clipboardPasteAction:"replace", // data: [ // { groupId: this.lastGroupId, SEPER: "그룹" }, // { groupId: this.lastGroupId, SEPER: "계획" }, // { groupId: this.lastGroupId, SEPER: "실적" }, // ], //기본 데이터 columns: fields, //컬럼 설정 groupBy: "WRK_TEAM", groupHeader: (value, count, data) =>{ // console.log(data) return data[0].WRK_TEAM; }, columnDefaults: commonFieldData, groupStartOpen: true, headerSortElement: "" }); this.tbList.on("cellEdited", (e, tgt) => { this.cellEdited && this.cellEdited(e, tgt); }); } init2(){ // 데이터 불러오기 this.tbList.on("tableBuilt", () => { this.getMainList( "getPlanList", "team_pop", "product_pop", "sub_product_pop", "plan_date" ); }); // console.log(this.tbList.getRows()); // row 클릭 시에 this.tbList.on("groupClick", (e, tgt) => { this.groupRowClick && this.groupRowClick(e, tgt); }); // cell 클릭 시에 this.tbList.on("cellClick", (e, tgt) => { this.cellClick && this.cellClick(e, tgt); }); // cell 수정 시에 // // 추가 // ["click", "keypress"].forEach((evt) => { // this.addBtn.addEventListener(evt, () => { // console.log("test"); // this.addRow && this.addRow(); // }); // }); // // 삭제 // ["click", "keypress"].forEach((evt) => { // this.removeBtn.addEventListener(evt, () => { // // 삭제 함수 // this.removeRow(); // }); // }); // 엑셀 ["click", "keypress"].forEach((evt) => { const excelBtn = document.querySelector("#excel_data"); excelBtn.addEventListener(evt, () => { tb_common_funtions.tabu2xls3(this.tbList, "생산계획", "생산계획") }); }); // 조회 ["click", "keypress"].forEach((evt) => { const filterBtn = document.querySelector("#filter_btn"); filterBtn.addEventListener(evt, () => { // setFilter 또는 setData this.init(); this.setFilter(); // this.getMainList("getPlanList","team_pop","product_pop","sub_product_pop"); }); }); // 저장 ["click", "keypress"].forEach((evt) => { const putBtn = document.querySelector("#put_btn"); putBtn.addEventListener(evt, () => { this.putData(); }); }); } } const Tb_production_plan = new Tb_main_class("#main_table"); Tb_production_plan.init(); Tb_production_plan.init2();