근무관리체계 개발일지 [3] - 핵심 로직

최원빈·2022년 10월 17일
0

지난번 구조에 이어 핵심 로직을 더 구상해봤다.

가장 적절한 근무자?

근무는 요일마다, 오전 오후마다 다르고
근무자종류별로 각 근무를 선 횟수총 근무 횟수가 있다.

종류별 근무횟수를 따지자니,
월화수목금토일이 전부 AAAAAAA로 들어가도 논리적으로 맞게 되고

총 근무횟수를 따지자니,
운이 좋은 사람은 주말 근무를 계속 회피하게된다.

그래서 둘을 적절하게 조합해야했다.

결론은

  1. 총 근무 횟수를 따져서 다른사람들과 얼마나 차이나는지
  2. 그 종류의 근무를 선 횟수가 다른사람들과 얼마나 차이나는지

두 가지 기준을 가지고 가중치를 바꿔가며 적절한 수치를 찾아내려 노력했다.

현재 추천하고있는 날짜를 1씩 늘려가며 그날의 추천인을 뽑는 방법이기에, 가중치에 따라 다른 결과가 나왔다.

중대원들과 같이 당직을 서고있는 간부님들께 보여주며 검증받고, 적절한 수치인 (1번의 편차 * 5) + (2번의 편차 * 3) 이라는 식을 얻게 되었다.

근무에 자주 들어가는것은 아무래도 피로도를 많이 동반하기에, 가중치를 더 높게 주는 것에 모두들 동의했다.

// MAX_LENGTH 는 총 며칠간의 근무를 추천해줄지를 정한 값이다
// 사용하는 프로그램에선 3650일 정도로 넉넉히 잡아 퍼포먼스를 보였다.
for(let i = now; i <= now + MAX_LENGTH; i++){
  let todayUsers = copy(userData.userList);
  let beforeUsers = [...getUser(now - 1), ...getUser(now - 2)]
  todayUsers = todayUsers.filter((user) => beforeUsers.find((before) => before == user))
  
  // 이전 2일 내에 근무가 없던 유저들끼리 가중치 비교
  todayUsers.sort(compareWeight);
  calendar[i].workData[0].user = todayUsers[0];
}

데이터 이동

이 프로그램을 만드는건 당직병의 컴퓨터고,
이 프로그램을 가장 자주 보게 될 사람은 중대장님이시다.

아마 수정소요에 대해서도 중대장님께서 관리하실텐데, 병사들은 또 당직병 컴퓨터로 본인의 근무를 확인하니, 데이터를 넘겨주거나 넘겨받을 방법이 필요했다.

localStorage에 담을 데이터를 그대로 복사해서 파일로 넘기고,
받는쪽에서는 손쉽게 setItem할 수 있게끔 clipboard 복사를 구현하고 싶었다.

복사를 라이브러리 없이 직접 구현해본 것은 처음이라 공부하는 과정이 꽤나 재밌었다.
document.execCommand("copy") 를 활용해서 구현했는데,
이는 다음 포스팅으로 남기려한다.
다른 복사 방식들도 써보며 비교했는데, 내가 필요한 기능을 구현하기엔 적절했다.

파일의 이동은... 인트라넷의 간부님 계정을 이용해서....ㅋㅋㅋㅋ

profile
FrontEnd Developer

0개의 댓글