HANYANG_REACT/www/ksvc/prod/reg_plan/reg_plan.js

568 lines
16 KiB
JavaScript

/*
* @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: "<i class='bi'></i>"
});
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();