forked from HANYANG/HANYANG_MES
649 lines
28 KiB
JavaScript
649 lines
28 KiB
JavaScript
//import {SvelteGantt, SvelteGanttTable, MomentSvelteGanttDateAdapter, SvelteGanttExternal} from 'https://cdn.jsdelivr.net/npm/svelte-gantt@4.0.9-beta/+esm';
|
|
import {SvelteGantt, SvelteGanttTable, MomentSvelteGanttDateAdapter, SvelteGanttExternal} from '/include/vendor/svelte-gantt/index.js';
|
|
|
|
gantt_obj.pplan_make = ( vmode, sdate, plusday ) => {
|
|
document.querySelector("#ProdPlan").innerHTML = "";
|
|
let lux_sdate = sdate ? luxon.DateTime.fromFormat(sdate,'y-MM-dd') : luxon.DateTime.now();
|
|
let lux_fdate = plusday ? lux_sdate.plus(plusday) : lux_sdate;
|
|
let chart_blocks = 0;
|
|
|
|
switch( vmode ){
|
|
case "W":
|
|
let snw = lux_sdate.toFormat('c')-1;
|
|
let fnw = 7-lux_fdate.toFormat('c');
|
|
lux_sdate = lux_sdate.minus({days:snw});
|
|
lux_fdate = lux_fdate.plus({days:fnw});
|
|
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'weeks').weeks)+1;
|
|
break;
|
|
case "M":
|
|
lux_sdate = lux_sdate.minus({days:lux_sdate.c.day-1});
|
|
lux_fdate = lux_fdate.minus({days:lux_fdate.c.day-1}).plus({months:1}).minus({days:1});
|
|
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'months').months) + 1;
|
|
break;
|
|
default:
|
|
chart_blocks = Math.floor(lux_fdate.diff(lux_sdate,'days').days) + 1;
|
|
}
|
|
|
|
ajax_json({
|
|
url: ajax_url,
|
|
data: {mode: 'getScheduleList', sdate:lux_sdate.toFormat('y-MM-dd'), fdate:lux_fdate.toFormat('y-MM-dd'), sfact:document.querySelector("#S_FACLT_CD").value },
|
|
success: function (data) {
|
|
if (data.code) {
|
|
gantt_obj.currentStart = data.data.sdate_millis;
|
|
gantt_obj.currentEnd = data.data.fdate_millis;
|
|
gantt_obj.wkStartTime = data.data.wkStartTime;
|
|
gantt_obj.varsFactInfo = data.data.varsFactInfo; /*.filter(fac => {
|
|
return !document.querySelector("#S_FACLT_CD").value || document.querySelector("#S_FACLT_CD").value === fac.FACLT_CD;
|
|
});*/
|
|
gantt_obj.varsWtimeInfo = data.data.varsWtimeInfo.filter(wt => wt.USE_FLG === "Y" && wt.RUNSTOP_FLG !== 'Y').sort((a,b) => (a.ST_TM > b.ST_TM)?1:-1);
|
|
gantt_obj.varsSchInfo = data.data.varsSchInfo; //근무일정보
|
|
gantt_obj.varsSchIscm = data.data.varsSchInfo.reduce( (rev, hl) => {rev[hl.DT] = hl; return rev}, {});
|
|
//gantt_obj.varsHolyInfo = data.data.varsSchInfo.filter(hl => hl.DAY_TYPE === 'H');
|
|
//HolyInfo가 아니라 DayInfo가 있어야 한다.
|
|
|
|
//ganttdata = generateData(gantt_obj.currentStart, gantt_obj.currentEnd);
|
|
ganttdata = data.data.wo_data;
|
|
ganttdata.tasks = ganttdata.tasks.map( t => { return {...t, to:getTo_addHolytime(t, gantt_obj) } } );
|
|
|
|
let st_obj = luxon.DateTime.fromMillis(gantt_obj.currentStart);
|
|
let ed_obj = luxon.DateTime.fromMillis(gantt_obj.currentEnd);
|
|
|
|
const timeRanges = gantt_obj.varsSchInfo.reduce( (row, cur, idx) => {
|
|
if( cur.DAY_TYPE === 'H' ){
|
|
row.push({
|
|
id: 'Holy'+cur.DT,
|
|
//from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').toMillis(),
|
|
//to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:1}).toMillis(),
|
|
from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({hours:gantt_obj.wkStartTime}).toMillis(),
|
|
to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:1,hours:gantt_obj.wkStartTime}).toMillis(),
|
|
classes: null,
|
|
label: '휴일'
|
|
});
|
|
}else{
|
|
gantt_obj.varsWtimeInfo.filter( wt => wt.SHIFT_ID === cur.DAY_SHAPE ).forEach((w, i) => { //휴게시간 표시
|
|
let st = w.ST_TM.split(':');
|
|
let ed = w.ED_TM.split(':');
|
|
|
|
let adstday = 0;
|
|
let adedday = 0;
|
|
if( Number(st[0]) < gantt_obj.wkStartTime ){
|
|
adstday = 1;
|
|
}
|
|
if( Number(ed[0]) <= gantt_obj.wkStartTime ){
|
|
adedday = 1;
|
|
}
|
|
let cls = null
|
|
if( w.TM_TYPE === 'OFF' ){
|
|
cls = 'off_hours';
|
|
}
|
|
row.push({
|
|
id: w.TM_TYPE+'_'+cur.DT+'_'+ i,
|
|
//from: st_obj.plus({days:idx, hours:st[0], minutes:st[1]}),
|
|
//to: st_obj.plus({days:idx+adday, hours:ed[0], minutes:ed[1]}),
|
|
from: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:adstday, hours:st[0],minutes:st[1]}).toMillis(),
|
|
to: luxon.DateTime.fromFormat(cur.DT, 'y-MM-dd').plus({days:adedday, hours:ed[0],minutes:ed[1]}).toMillis(),
|
|
classes: cls,
|
|
resizeHandleWidth: 0,
|
|
label: w.WORK_TM_NM
|
|
});
|
|
});
|
|
}
|
|
return row;
|
|
}, [] );
|
|
// const timeRanges = [...Array(Math.round(ed_obj.diff(st_obj,'days').days)).keys()].reduce((row, idx) => {
|
|
// let nowDT = st_obj.plus({days:idx}).toFormat('y-MM-dd');
|
|
// if( gantt_obj.varsHolyInfo.filter(h => h.DT === nowDT).length === 0 ){ //휴일이 아닌경우
|
|
// gantt_obj.varsWtimeInfo./*filter(wt => wt.SHIFT_ID === ).*/forEach((w, i) => { //휴게시간 표시
|
|
// let st = w.ST_TM.split(':');
|
|
// let ed = w.ED_TM.split(':');
|
|
// let cls = null
|
|
// if( w.TM_TYPE === 'OFF' ){
|
|
// cls = 'off_hours';
|
|
// }
|
|
//
|
|
// row.push({
|
|
// id: w.TM_TYPE+'_'+nowDT+'_'+ i,
|
|
// from: st_obj.plus({days:idx, hours:st[0], minutes:st[1]}),
|
|
// to: st_obj.plus({days:idx, hours:ed[0], minutes:ed[1]}),
|
|
// classes: cls,
|
|
// resizeHandleWidth: 0,
|
|
// label: w.WORK_TM_NM
|
|
// });
|
|
// });
|
|
// }
|
|
//
|
|
// gantt_obj.varsHolyInfo.forEach((h, i) => { //휴일표시
|
|
// row.push({
|
|
// id: 'Holy'+nowDT+'_'+i,
|
|
// from: luxon.DateTime.fromFormat(h.DT, 'y-MM-dd').toMillis(),
|
|
// to: luxon.DateTime.fromFormat(h.DT, 'y-MM-dd').plus({days:1}).toMillis(),
|
|
// classes: null,
|
|
// label: '휴일'
|
|
// });
|
|
// });
|
|
//
|
|
// return row;
|
|
// }, []);
|
|
|
|
gantt_obj.gantt_option = {
|
|
rows: ganttdata.rows,
|
|
tasks: ganttdata.tasks,
|
|
timeRanges,
|
|
headers: (function (){
|
|
switch( vmode ){
|
|
case "W":
|
|
return [{ unit: 'week', format: "Wterm", sticky: true, }, { unit: 'day', format: "dd일", sticky: true, /*offset:7*/ } ];
|
|
case "M":
|
|
return [{ unit: 'month', format: "y/MM", sticky: true, }, { unit: 'day', format: "dd", sticky: true, } ]
|
|
default:
|
|
return [{ unit: 'day', format: 'y-MM-dd', sticky: true, }, {unit: 'hour', format: "HH시", sticky: true, }];
|
|
}
|
|
})(),
|
|
//headers: [{unit: 'day', format: 'y년 MM월 dd일'}, {unit: 'hour', format: "HH시",}],
|
|
//headers: [{ unit: 'week', format: "Wterm", }, { unit: 'day', format: "dd일", } ],
|
|
//headers: [{ unit: 'month', format: "MM월", }, { unit: 'week', format: "WofM", }, { unit: 'day', format: "dd", } ],
|
|
//headers: [{ unit: 'month', format: "MM월", }, { unit: 'week', format: "WofM", } ],
|
|
fitWidth: false,
|
|
from: gantt_obj.currentStart,// + gantt_obj.wkStartTime*3600*1000, //(챠트의 시작시간을 wkStatTime 으로 할경우 아래를 제거한다.)
|
|
to: gantt_obj.currentEnd,// + gantt_obj.wkStartTime*3600*1000, //(챠트의 시작시간을 wkStatTime 으로 할경우 아래를 제거한다.)
|
|
rowHeight: 42,
|
|
resizeHandleWidth: 0,
|
|
columnUnit: (function (){
|
|
switch( vmode ){
|
|
case "W":
|
|
return 'hour';
|
|
case "M":
|
|
return 'hour';
|
|
default:
|
|
return 'minute';
|
|
}
|
|
})(),
|
|
columnOffset: (function (){
|
|
switch( vmode ){
|
|
case "W":
|
|
return 1;
|
|
case "M":
|
|
return 3;
|
|
default:
|
|
return 60;
|
|
}
|
|
})(),
|
|
magnetUnit: (function (){
|
|
switch( vmode ){
|
|
case "W":
|
|
return 'hour';
|
|
case "M":
|
|
return 'hour';
|
|
default:
|
|
return 'minute';
|
|
}
|
|
})(),
|
|
magnetOffset: (function (){
|
|
switch( vmode ){
|
|
case "W":
|
|
return 1;
|
|
case "M":
|
|
return 3;
|
|
default:
|
|
return 60;
|
|
}
|
|
})(),
|
|
tableHeaders: [{title: '설 비', property: 'label', width: 140, type: 'tree'}],
|
|
tableWidth: 140,
|
|
minWidth: 1450 * chart_blocks,
|
|
zoomLevels: [],
|
|
ganttTableModules: [SvelteGanttTable],
|
|
taskElementHook: (node, task) => {
|
|
node.addEventListener('dblclick', () => {
|
|
task.enableDragging && popPlanRouteInfo(node, task); //개별수정
|
|
/* 챠트에서 조정한 데이터 반영 문제 때문에 사용안함. 챠트에서 조정하지 않는다면 이것을 이용해 전체 수정한다.
|
|
if( task.enableDragging ){
|
|
ajax_json({
|
|
url: ready_ajax_url,
|
|
data: {
|
|
mode:"getCondDetail",
|
|
MNG_NO:task.usrdata.MNG_NO,
|
|
},
|
|
success: function(data){
|
|
if( data.code ){
|
|
Tb_funcs_planroute.init(data.data);
|
|
}else{
|
|
kuls_alert(data.mesg);
|
|
}
|
|
}
|
|
});
|
|
}*/
|
|
});
|
|
},
|
|
dateAdapter: new MomentSvelteGanttDateAdapter(function (milliseconds) {
|
|
let lux_obj = luxon.DateTime.fromMillis(milliseconds);
|
|
return {
|
|
'format': function (format) {
|
|
let rev = null
|
|
switch (format) {
|
|
case "Wterm":
|
|
rev = lux_obj.toFormat('y-MM-dd') + ' ~ ' + lux_obj.plus({days:6}).toFormat('y-MM-dd');
|
|
break;
|
|
case "WofM":
|
|
rev = weekOfMonth(milliseconds) + '주차';
|
|
break;
|
|
default :
|
|
rev = lux_obj.toFormat(format);
|
|
}
|
|
return rev;
|
|
},
|
|
}
|
|
}),
|
|
}
|
|
|
|
gantt_obj.gantt = new SvelteGantt({
|
|
target: document.getElementById('ProdPlan'),
|
|
props: gantt_obj.gantt_option,
|
|
});
|
|
|
|
gantt_obj.gantt.api.tasks.on.changed((tasks) => { //task 변경
|
|
tasks.forEach(tgt => {
|
|
let _thisrow = tgt.targetRow;
|
|
let _thistask = tgt.task;
|
|
//_thisrow.model.to = getTo_addHolytime( _thistask.model, gantt_obj );
|
|
_thistask.model.to = getTo_addHolytime( _thistask.model, gantt_obj );
|
|
|
|
if (_thisrow) { //row 변경처리
|
|
_thistask.model.usrdata.FACLT_CD = _thisrow.model.usrdata.FACLT_CD;
|
|
_thistask.model.usrdata.FACLT_NM = _thisrow.model.usrdata.FACLT_NM;
|
|
}
|
|
//_thistask.model.html = set_task_title(works[(_thistask.model.cnt % 5)], _thistask.model.from, _thistask.model.to); //시간표시 변경
|
|
|
|
_thistask.model.usrdata.PLN_ST_TM = luxon.DateTime.fromMillis(_thistask.model.from).toFormat('y-MM-dd HH:mm');
|
|
_thistask.model.usrdata.PLN_ED_TM = luxon.DateTime.fromMillis(_thistask.model.to).toFormat('y-MM-dd HH:mm');
|
|
_thistask.model.usrdata._STATUS_ = 'U'; //수정 Flag
|
|
_thistask.model.html = task_title(_thistask.model.usrdata);
|
|
document.toto = _thistask.model;
|
|
gantt_obj.gantt.updateTask(_thistask.model);
|
|
});
|
|
});
|
|
|
|
} else {
|
|
kuls_alert(data.mesg);
|
|
}
|
|
},
|
|
error: function (request, status, error) {
|
|
kuls_alert(error.message);
|
|
},
|
|
complete: function () {
|
|
//ccnt = 0;
|
|
//drag_block();
|
|
}
|
|
});
|
|
};
|
|
|
|
|
|
// gantt_obj.gantt.api.tasks.on.select((task) => {
|
|
// jQuery("[data-task-id="+task[0].model.id+"]").off().on("keydown",function(e){
|
|
// jQuery(e.target).remove();
|
|
// });
|
|
// });
|
|
|
|
|
|
jQuery.datetimepicker.setLocale('ko');
|
|
|
|
// gantt_ext = new SvelteGanttExternal(document.getElementById('newTask'), {
|
|
// gantt,
|
|
// onsuccess: (row, date, gantt) => {
|
|
// const id = 5000 + Math.floor(Math.random() * 1000);
|
|
// gantt_obj.gantt.updateTask({
|
|
// id,
|
|
// label: `Task #${id}`,
|
|
// from: date,
|
|
// to: date+3600000*3,
|
|
// classes: colors[(Math.random() * colors.length) | 0],
|
|
// resourceId: row.model.id
|
|
// });
|
|
// },
|
|
// elementContent: () => {
|
|
// const element = document.createElement('div');
|
|
// element.innerHTML = 'New Task';
|
|
// element.className = 'sg-external-indicator';
|
|
// return element;
|
|
// }
|
|
// });
|
|
|
|
const task_title = (usrdata) => {
|
|
let timefrm = dateRformat(usrdata['PLN_TERM_TM'], { dan: 'm' });
|
|
return `<div class='d-flex flex-column'><div class='font08 lh-1' style='line-height: 120%;'>${usrdata['OP_NM']} [${usrdata['MNG_NO']}]</div><div class='font06 lh-sm'>${usrdata['PLN_ST_TM'].substring(5)} ~ (${timefrm})</div></div>`;
|
|
}
|
|
|
|
/*
|
|
* 1. 휴일과 휴식시간이 있다.
|
|
* 2. 휴일에는 휴식시간을 포함하지 않는다.
|
|
* 3. 계산의 결과값에 휴일/휴식이 포함되면 추가하고 다시 확인을 반복한다.
|
|
*
|
|
*
|
|
* */
|
|
const prev_base_days = 10; //이전 몇일전 데이터까지 불러올지 여부 (planing.ajax.php 도 같이 확인)
|
|
const getTo_addHolytime = ( data, gobj ) => { //휴일/휴게 시간 추가
|
|
let datemillisec = 24*3600*1000;
|
|
let hourmillisec = 3600*1000;
|
|
let minmillisec = 60*1000;
|
|
let dur_addtime = data.usrdata.PLN_TERM_TM*minmillisec;
|
|
let holy_addtime = 0;
|
|
let wtime_addtime = 0;
|
|
|
|
const stime = data.from; //시작 시간
|
|
let ntime = stime; //작업/휴게시간이 적용된 시간
|
|
let worktime = data.usrdata.PLN_TERM_TM * minmillisec; //총 작업시간(분)
|
|
let worksum = 0; //작업시간 합계(분)
|
|
let dayzero = 0; //체크 날짜의 00:00:00 시간
|
|
|
|
do {
|
|
let nday = luxon.DateTime.fromMillis(ntime - gobj.wkStartTime*hourmillisec).toFormat('y-MM-dd'); //날짜만
|
|
let dz = luxon.DateTime.fromFormat(nday,'y-MM-dd');
|
|
if( dayzero === dz.ts ) break;
|
|
dayzero = dz.ts;
|
|
|
|
let Wtime = [];
|
|
if( gobj.varsSchIscm[nday] ){
|
|
if( gobj.varsSchIscm[nday].DAY_TYPE === "H" ){
|
|
// Wtime = [{
|
|
// ST_TM: gobj.wkStartTime.toString().padStart(2,"0")+":00",
|
|
// ED_TM: gobj.wkStartTime.toString().padStart(2,"0")+":00",
|
|
// }];
|
|
Wtime = [{
|
|
stsec: dayzero + gobj.wkStartTime*hourmillisec,
|
|
edsec: dayzero + datemillisec + gobj.wkStartTime*hourmillisec,
|
|
}];
|
|
}else{
|
|
Wtime = gobj.varsWtimeInfo.filter(wt => wt.SHIFT_ID == gobj.varsSchIscm[nday].DAY_SHAPE ).map( wt => {
|
|
let st = wt.ST_TM.split(':');
|
|
let ed = wt.ED_TM.split(':');
|
|
|
|
let adstday = 0;
|
|
let adedday = 0;
|
|
if( Number(st[0]) < gobj.wkStartTime ){
|
|
adstday = 1;
|
|
}
|
|
if( Number(ed[0]) <= gobj.wkStartTime ){
|
|
adedday = 1;
|
|
}
|
|
|
|
return {
|
|
stsec: dayzero + adstday*datemillisec + st[0]*hourmillisec + st[1]*minmillisec,
|
|
edsec: dayzero + adedday*datemillisec + ed[0]*hourmillisec + ed[1]*minmillisec,
|
|
}
|
|
} ).sort( (a,b) => a.stsec > b.stsec ? 1:-1 );
|
|
}
|
|
}
|
|
|
|
Wtime.forEach( wd => { //휴게 시간 추가
|
|
let stsec = wd.stsec;
|
|
let edsec = wd.edsec;
|
|
|
|
let n2time = ntime+worktime; //임시 작업종료시간
|
|
if( ntime < edsec && n2time > stsec){
|
|
if( ntime >= stsec && ntime < edsec ){ //작업시작시간이 휴게시간 중간에 있을경우 (작업시간이 휴게시간에 포함된경우)
|
|
ntime = edsec; //작업시작시간을 휴게시간 마지막으로 이동만.
|
|
}else if( n2time > stsec && n2time < edsec ){ //작업종료시간이 휴게시간 중간에 있을경우
|
|
worktime = n2time - stsec; //임시작업종료시간과 휴게시작시간이 겹치는 부분을 남은시간으로 하고
|
|
ntime = edsec; //작업시작시간을 휴게시간 마지막으로
|
|
}else if( ntime <= stsec && n2time >= edsec ){ //휴게시간이 작업시간에 포함되어 있을 경우
|
|
worktime = n2time - stsec; //임시작업종료시간과 휴게마지막시간이 겹치는 부분을 남은시간으로 하고
|
|
ntime = edsec; //작업시작시간을 휴게시간 마지막으로
|
|
}
|
|
}
|
|
} );
|
|
|
|
if( ntime + worktime > dayzero+datemillisec + gobj.wkStartTime*hourmillisec ){
|
|
worktime -= (dayzero+datemillisec + gobj.wkStartTime*hourmillisec) - ntime;
|
|
ntime = (dayzero+datemillisec + gobj.wkStartTime*hourmillisec);
|
|
}else{
|
|
ntime += worktime;
|
|
worktime = 0;
|
|
}
|
|
} while ( worktime > 0 );
|
|
|
|
// do {
|
|
// let nday = luxon.DateTime.fromMillis(ntime).toFormat('y-MM-dd'); //날짜만
|
|
// let dz = luxon.DateTime.fromFormat(nday,'y-MM-dd');
|
|
// if( dayzero === dz.ts ) break;
|
|
// dayzero = dz.ts;
|
|
//
|
|
// if( gobj.varsHolyInfo.filter(h => h.DT === nday).length !== 0 ){ //휴일이면
|
|
// ntime = dayzero + datemillisec;
|
|
// }else{
|
|
// gobj.varsWtimeInfo.forEach( wd => { //휴게 시간 추가
|
|
// //시작시간이 몇 번 들어가느냐가 기준
|
|
// let st = wd.ST_TM.split(':');
|
|
// let ed = wd.ED_TM.split(':');
|
|
//
|
|
// let adstday = 0;
|
|
// let adedday = 0;
|
|
// if( Number(st[0]) < gobj.wkStartTime ){
|
|
// adstday = 1;
|
|
// }
|
|
// if( Number(ed[0]) <= gobj.wkStartTime ){
|
|
// adedday = 1;
|
|
// }
|
|
//
|
|
// let stsec = dayzero + adstday*datemillisec + st[0]*hourmillisec + st[1]*minmillisec;
|
|
// let edsec = dayzero + adedday*datemillisec + ed[0]*hourmillisec + ed[1]*minmillisec;
|
|
//
|
|
// // if( stsec > edsec ){ //휴게 종료시간을 다음날로 지정
|
|
// // edsec += datemillisec;
|
|
// // }
|
|
//
|
|
// let n2time = ntime+worktime; //임시 작업종료시간
|
|
// if( ntime < edsec && n2time > stsec){
|
|
// if( ntime >= stsec && ntime < edsec ){ //작업시작시간이 휴게시간 중간에 있을경우 (작업시간이 휴게시간에 포함된경우)
|
|
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로 이동만.
|
|
// }else if( n2time > stsec && n2time < edsec ){ //작업종료시간이 휴게시간 중간에 있을경우
|
|
// worktime = n2time - stsec; //임시작업종료시간과 휴게시작시간이 겹치는 부분을 남은시간으로 하고
|
|
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로
|
|
// }else if( ntime <= stsec && n2time >= edsec ){ //휴게시간이 작업시간에 포함되어 있을 경우
|
|
// worktime = n2time - stsec; //임시작업종료시간과 휴게마지막시간이 겹치는 부분을 남은시간으로 하고
|
|
// ntime = edsec; //작업시작시간을 휴게시간 마지막으로
|
|
// }else{
|
|
// /*
|
|
// if( (ntime + (worktime-worksum)*1000) > (dayzero + datemillisec) ){ //남은 시간의 합산이 내일로 넘어가면
|
|
// ntime = dayzero + datemillisec;
|
|
// worksum =
|
|
// }else{ //아니면 그냥 추가
|
|
// ntime += (worktime-worksum)*1000;
|
|
// worksum = worktime;
|
|
// }*/
|
|
// }
|
|
// }
|
|
// } );
|
|
//
|
|
// //시작시간이 전날의 휴게시간 안에 포함되어있을때...를 고려 해봐야 한다.
|
|
// if( ntime + worktime > dayzero + datemillisec ){
|
|
// worktime -= (dayzero+datemillisec) - ntime;
|
|
// ntime = (dayzero+datemillisec);
|
|
// }else{
|
|
// ntime += worktime;
|
|
// worktime = 0;
|
|
// }
|
|
// }
|
|
// } while ( worktime > 0 );
|
|
return ntime + worktime;
|
|
/*
|
|
gobj.varsHolyInfo.forEach( hd => { //휴일 24시간 추가
|
|
let btime = luxon.DateTime.fromFormat(hd.DT,'y-MM-dd').ts;
|
|
if( data.from <= btime && (data.from+dur_addtime) > btime ){
|
|
holy_addtime += datemillisec;
|
|
}
|
|
} );
|
|
|
|
let fromzero = luxon.DateTime.fromFormat(luxon.DateTime.fromMillis(data.from).toFormat('yyMMdd'),'yyMMdd').ts;
|
|
gobj.varsWtimeInfo.sort((a,b) => (a.ST_TM > b.ST_TM)?1:-1).forEach( wd => { //휴게 시간 추가
|
|
//시작시간이 몇 번 들어가느냐가 기준
|
|
let st = wd.ST_TM.split(':');
|
|
let ed = wd.ED_TM.split(':');
|
|
let stsec = st[0]*hourmillisec + st[1]*minmillisec;
|
|
let edsec = ed[0]*hourmillisec + ed[1]*minmillisec;
|
|
let chasec = 0; //추가할 휴게 시간
|
|
|
|
if( stsec > edsec ){
|
|
chasec = datemillisec - stsec + edsec;
|
|
}else{
|
|
chasec = edsec - stsec;
|
|
}
|
|
|
|
let s = 0;
|
|
let btime = fromzero + stsec; //휴게 시작시간
|
|
let ftime = fromzero + edsec; //휴게 종료시간
|
|
|
|
if( btime < data.from && ftime > data.from ){
|
|
wtime_addtime += (ftime - data.from);
|
|
}
|
|
|
|
while( data.from <= btime && (data.from + dur_addtime + holy_addtime + wtime_addtime) > btime ){ //24시간씩 증가시키며 휴게시간 추가
|
|
wtime_addtime += chasec;
|
|
btime += datemillisec; //24시간 추가
|
|
}
|
|
} );
|
|
return data.from + dur_addtime + holy_addtime + wtime_addtime;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
const popPlanRouteInfo = function( node, task ){
|
|
//팝업 템플릿 로드 후 모달 출력
|
|
//let per_period = 6; //10분단위
|
|
let per_period = 1; //1시간 단위
|
|
vnLoad('','/ksvc/inc/popup.inc.php', '#pop_plan_route_info', function(loadHtml){
|
|
let popPlanModal = kuls_modal(loadHtml);
|
|
let dtfrm = 'y-MM-dd HH:mm';
|
|
varsFactInfo.forEach( fct => {
|
|
let opt = document.createElement("option");
|
|
opt.value = fct.FACLT_CD;
|
|
opt.text = fct.FACLT_NM;
|
|
document.querySelector("#V_FACLT_CD").append(opt);
|
|
} );
|
|
document.querySelector("#pop_form_route .V_OP_NM").innerHTML = task.usrdata.OP_NM;
|
|
//document.querySelector("#pop_form_route .V_FACLT_NM").innerHTML = task.usrdata.FACLT_NM;
|
|
document.querySelector("#pop_form_route .V_MNG_NO").innerHTML = task.usrdata.MNG_NO;
|
|
document.querySelector("#pop_form_route .V_ST").innerHTML = task.usrdata.ST;
|
|
document.querySelector("#pop_form_route .V_CT").innerHTML = task.usrdata.CT;
|
|
document.querySelector("#pop_form_route #V_MNG_BG").value = task.usrdata.MNG_BG||'#000001';
|
|
document.querySelector("#pop_form_route #V_PLM_ST_TM").value = luxon.DateTime.fromMillis(task.from).toFormat(dtfrm);
|
|
//document.querySelector("#pop_form_route #V_PLM_ED_TM").value = luxon.DateTime.fromMillis(task.to).toFormat(dtfrm);
|
|
document.querySelector("#pop_form_route #V_FACLT_CD").value = task.usrdata.FACLT_CD;
|
|
document.querySelector("#pop_form_route #V_PLN_TERM_TM").innerText = task.usrdata.PLN_TERM_TM;
|
|
jQuery('.dtime_picker').datetimepicker({
|
|
allowTimes: [...Array(24*per_period).keys()].map(idx=>Math.floor(idx/per_period).toString().padStart(2,'0')+':'+(idx%per_period).toString().padEnd(2,'0')),
|
|
format: "Y-m-d H:i",
|
|
defaultTime: luxon.DateTime.now().toFormat("HH:")+Math.floor(luxon.DateTime.now().toFormat("mm")/10).toString().padEnd(2,'0'),
|
|
});
|
|
|
|
['click','keypress'].forEach(evt => document.querySelector("#btnPutRoute").addEventListener(evt, function(){
|
|
task.from = luxon.DateTime.fromFormat(document.querySelector("#pop_form_route #V_PLM_ST_TM").value,dtfrm).toMillis();
|
|
//task.to = luxon.DateTime.fromFormat(document.querySelector("#pop_form_route #V_PLM_ED_TM").value,dtfrm).toMillis();
|
|
task.to = getTo_addHolytime( task, gantt_obj );
|
|
task.resourceId = document.querySelector("#V_FACLT_CD").value;
|
|
task.html = task_title(task.usrdata);
|
|
let bgcolor = document.querySelector("#pop_form_route #V_MNG_BG").value;
|
|
let odia = task.usrdata.OUT_DIA.slice(0,1);
|
|
if( bgcolor != '#000001' ){
|
|
task.bgcolor = bgcolor;
|
|
task.usrdata.MNG_BG = bgcolor;
|
|
gantt_obj.gantt_option.tasks.forEach( t => {
|
|
// if( t.usrdata.MNG_NO == task.usrdata.MNG_NO ){
|
|
// t.bgcolor = bgcolor;
|
|
// }
|
|
if( t.usrdata.OUT_DIA.slice(0,1) === odia ){
|
|
t.bgcolor = bgcolor;
|
|
}
|
|
} );
|
|
|
|
document.querySelectorAll(".col_odia"+odia).forEach(codiv => codiv.style.backgroundColor = bgcolor);
|
|
}
|
|
task.usrdata._STATUS_ = "U";
|
|
gantt_obj.gantt.updateTask(task);
|
|
popPlanModal.delete();
|
|
}));
|
|
|
|
|
|
});
|
|
};
|
|
|
|
let ccnt = 0;
|
|
let stoblk = null;
|
|
const drag_block = () => { //svelte gantt 에 콜백이 존재하면 대체한다. - 사용중지
|
|
stoblk && window.clearTimeout(stoblk);
|
|
|
|
stoblk = window.setTimeout(()=>{
|
|
if( jQuery(".sg-task").length ){
|
|
gantt_obj.gantt_option.tasks.forEach(task => {
|
|
if( !task.enableDragging ){
|
|
jQuery(`[data-task-id=${task.id}]`).removeClass("dragging-enabled").addClass("opacity-40 font-italic");
|
|
}
|
|
});
|
|
}
|
|
drag_block();
|
|
},++ccnt*ccnt*ccnt*ccnt*20);
|
|
};
|
|
|
|
gantt_obj.pplan_make('',luxon.DateTime.now().toFormat('y-MM-dd'),{days:addday});
|
|
|
|
|
|
document.querySelector("#S_SO_PLAN_DT").addEventListener("change", function(){
|
|
let newdate = {};
|
|
let adval = document.querySelector("#S_DT_ADTERM").value-1;
|
|
switch( document.querySelector("#S_DT_TYPE").value ){
|
|
case "W": newdate = {days:adval*7}; break;
|
|
case "M": newdate = {months:adval}; break;
|
|
default: newdate = {days:adval};
|
|
}
|
|
gantt_obj.pplan_make(document.querySelector("#S_DT_TYPE").value,this.value,newdate);
|
|
});
|
|
|
|
['click','keypress'].forEach( evt => document.querySelector("#btn_plan_prev").addEventListener(evt, function(){
|
|
let newdate = {};
|
|
let adval = document.querySelector("#S_DT_ADTERM").value-1;
|
|
switch( document.querySelector("#S_DT_TYPE").value ){
|
|
case "W": newdate = {days:adval*7+7}; break;
|
|
case "M": newdate = {months:adval+1}; break;
|
|
default: newdate = {days:adval+1};
|
|
}
|
|
document.querySelector("#S_SO_PLAN_DT").value = luxon.DateTime.fromMillis(gantt_obj.currentStart).minus(newdate).toFormat('y-MM-dd');
|
|
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
|
|
}));
|
|
|
|
['click','keypress'].forEach( evt => document.querySelector("#btn_plan_next").addEventListener(evt, function(){
|
|
let newdate = {};
|
|
let adval = document.querySelector("#S_DT_ADTERM").value-1;
|
|
switch( document.querySelector("#S_DT_TYPE").value ){
|
|
case "W": newdate = {days:adval*7+7}; break;
|
|
case "M": newdate = {months:adval+1}; break;
|
|
default: newdate = {days:adval+1};
|
|
}
|
|
document.querySelector("#S_SO_PLAN_DT").value = luxon.DateTime.fromMillis(gantt_obj.currentStart).plus(newdate).toFormat('y-MM-dd');
|
|
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
|
|
}));
|
|
|
|
document.querySelectorAll("#S_DT_TYPE, #S_DT_ADTERM").forEach(tgt => tgt.addEventListener("change", function(){
|
|
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
|
|
}));
|
|
|
|
document.querySelector("#S_FACLT_CD").addEventListener("change", function(){
|
|
document.querySelector("#S_SO_PLAN_DT").dispatchEvent(new Event('change'));
|
|
});
|
|
|
|
|
|
|
|
['click','keypress'].forEach( evt => document.querySelector("#btnPutPPlan").addEventListener( evt, function(){
|
|
ajax_json({
|
|
url: ajax_url,
|
|
data: {mode:"setPlanTimeRoute", reqdata:JSON.stringify(gantt_obj.gantt_option.tasks.filter(task => task.usrdata._STATUS_==="U").map( task => task.usrdata))},
|
|
success: function(data){
|
|
if( data.code ){
|
|
kuls_success("적용 되었습니다.");
|
|
}else{
|
|
kuls_alert(data.mesg);
|
|
}
|
|
}
|
|
});
|
|
}));
|
|
|
|
const Tb_funcs_planroute = new planrouteManager(); |