내 목표는 대대의 모든 근무를 자동으로 짜는 프로그램을 만들어 보는 것이었고,
이 환경에 적용할 필요가 있어보여 비슷하지만 작은 규모의 프로젝트부터 만들어보았다.
모든 인원의 모든 근무가 아닌, 당직근무자와 당직근무에 대해서만 자동화 프로그램을 먼저 만들어 보았고,
결과적으로 성공했다.
간부님들과 선임분들께 좋게 보이려면 UI/UX향상이 필수였기에 별 짓을 다했다 ㅋㅋ
통계치를 보여주는 기능이 호응이 엄청났다.
제공하는 달력 상으로 start ~ end 까지의 통계를 제공해주는데,
이게 추천해준 미래의 근무들까지도 포함한 통계를 막대그래프로 제공을 해주니
기간이 넓어질수록 내 알고리즘이 추천해주는 근무만 따라가면 모두 고른, 편차가 매우 낮은 근무를 서게 된다는 것을 증명할 수 있었다.
실제로 8개월정도의 기간을 두고 "알고리즘이 추천해주는 근무대로만" 근무를 서면 대부분의 근무량 차이가 많아야 1~2일씩 나게끔 결과가 나왔다.
실제 코드를 못가져오는게 한이다.. 실제론 이거보다 이쁘게 디자인됐다.. 진짜루
중대장님께 보여드렸더니 근무를 서는 인원들만 원한다면 얼마든지 이 프로그램으로 근무를 짜서 사용해도 된다고 허락맡았다.
세상에 이게되네 ㅋㅋㅋㅋ
선임분들도 워낙 착하셔서 내가 만드는 모습을 좋게좋게 봐줬다.
프로그램에 대해서도 다들 긍정. 일단 당직은 이 프로그램으로 해결하도록 하고, 내가 만들고싶었던 전 대대적 근무관리체계를 만드는 것에 한 발짝 가까워졌다.
데이터는 크게 사람 / 달력으로 구분한다
// js 코드의 시작점
let calendar = JSON.parse(localStoarge.getItem("calendar"));
let userData = JSON.parse(localStoarge.getItem("userData"));
달력에는 근무들의 정보와, 공휴일 정보를 담고있다.
개발을 시작한 시점은 2021년 7월 1일이지만, 이전의 근무를 무시할 수 없으므로 2021년 1월 1일을 시작으로 잡았다.
calendar.newHoliday = [30, 31, 32] // ex) 1월 31일, 2월 1일, 2월 2일은 설날로 휴일이다.
calendar.fixedDays[20].workList[0] = { // 주말에는 근무가 오전/오후로 두개이니 길이 1~2의 배열로 관리
user: 1,
workType: 3 // workType이 근무의 종류다. 위 이미지의 평일 ~ 주말 주간 근무까지를 나타냄.
}
고정일 변경은 기존보다 앞으로 갈 수도, 뒤로 갈 수도 있다.
앞으로 당겨진다면 고정됐던 근무들이 추천으로 바뀔것이고,
뒤로 미뤄진다면 추천상태 근무들이 고정될것이다.
function changeFixDay(idx){
if(calendar.fixedDays.length > idx) {
for(let i = calendar.fixedDays.length; i >= idx; i--){
fixToRecommend(i);
}
}
else {
for(let i = calendar.fixedDays.length; i <= idx; i++){
recommendToFix(i);
}
}
}
고정된 근무끼리는 상호 교환할 수 있다.
근무를 바꿀때는, 바뀐 유저의 근무 횟수를 줄이고, 바꾼 유저의 근무수를 늘리는 방법으로 간단하게 해결해도 괜찮다.
이후의 추천근무는 매 페이지 로딩마다 새로 계산한다.
10년치를 계산해도 0.5초대로 끊어지더라. 인원이 6명이여서 그러겠지만, 대형을 다룰때는 시간복잡도를 계산해보며 작성할것이다.
function changeWork(day, workIndex, userId){
const { userId: prevUserId, workType} = calendar.fixedDays[day].workList[workIndex];
userData[prevUserId].workData[workType]--;
userData[userId].workData[workType]++;
calendar.fixedDays[day].workList[workIndex].userId = userId;
// 로컬스토리지 데이터 갱신 이후 새로고침
save();
}
거의 처음 경험하는 쌩 바닐라 자바스크립트 코딩이라 디자인패턴등이 익숙하지 않아서 작성하면서도 이게 맞는지는 잘 구현한건지 증명이 안되서 힘들지만..
적어도 기능은 문제없이 생각대로 구현됐으니 1차적으로 입증했다는 사실이 기분이 좋았다.
다음 당직부턴 처음 목표했던 장기 프로젝트를 만들어볼것이다.
다음주면 일병 6호봉인데 시간이 충분할 지 모르겠다...ㅋㅋㅋ