근무관리체계 개발일지 [4] - 데모 프로젝트 완성

최원빈·2022년 10월 18일
0

내 목표는 대대의 모든 근무를 자동으로 짜는 프로그램을 만들어 보는 것이었고,

이 환경에 적용할 필요가 있어보여 비슷하지만 작은 규모의 프로젝트부터 만들어보았다.

모든 인원의 모든 근무가 아닌, 당직근무자와 당직근무에 대해서만 자동화 프로그램을 먼저 만들어 보았고,
결과적으로 성공했다.

간부님들과 선임분들께 좋게 보이려면 UI/UX향상이 필수였기에 별 짓을 다했다 ㅋㅋ

  1. 인트라넷 돌아다니면 괜찮은 폰트 웹페이지마다 Source뒤져서 다운받아 쓰기
  2. 파스텔톤 컬러 적용(싸지방에서 컬러 해시값 찾아서 들고와서 타이핑..ㅋㅋ)
  3. 편의성 기능추가
    3.1 버튼만 누르면 알아서 복사되는 버튼
    3.2 본인의 근무를 쉽게 확인할 수 있도록 이름을 누르면 자신의 근무만 하이라이팅
    3.3 근무자 인수인계에 따라 근무자명 변경
    3.4 통계치 확인 (누가 어떤 근무를 몇번 섰는지)

통계치를 보여주는 기능이 호응이 엄청났다.

제공하는 달력 상으로 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호봉인데 시간이 충분할 지 모르겠다...ㅋㅋㅋ

profile
FrontEnd Developer

0개의 댓글