아래 로직은 시작일과 종료일을 가지고 그 사이 일자를 구하여
필요한 요일과 일자에 대해서만 코드를 저장(그 외 일자도 저장) 하는 로직이다
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate start = LocalDate.parse(start_dt, formatter);
LocalDate end = LocalDate.parse(end_dt, formatter);
Map<String, Object> params = new HashMap<>();
int daysBetween = (int) ChronoUnit.DAYS.between(start, end);
List<LocalDate> weeks = IntStream.iterate(0, i -> i + 1).limit(daysBetween + 1).mapToObj(i -> start.plusDays(i)).collect(Collectors.toList());
List<List<String>> weeks__ = new ArrayList<>();
params.put("P_COMPANY_CD", this.getCompanyCode());
params.put("P_USER_ID", this.getUserId());
params.put("P_USER_IP", this.getRemoteHost());
params.put("P_WRTR_EMP_NO", wrtr_emp_no);
params.put("P_WORKTM_CD", worktm_cd);
params.put("P_START_DT", start_dt);
params.put("P_END_DT", end_dt);
params.put("P_REQ_DOC_NO", req_doc_no);
params.put("P_APPLY_WEEKS", apply_weeks);
params.put("P_GWAPRVLST_CD", null);
for (Map<String, String> empInfo_ : empInfo) {
params.put("P_EMP_NO", empInfo_.get("emp_no"));
params.put("P_DEPT_CD", empInfo_.get("dept_cd"));
params.put("P_PJT_CD", empInfo_.get("pjt_cd"));
// 전체 일자 등록
for (LocalDate weeks_ : weeks) {
params.put("P_BWRK_DT", weeks_.format(formatter));
params.put("P_ELAS_FG", null);
if (weeks_.format(formatter).equals(start.format(formatter))) {
params.put("P_ELAS_FG", "BS");
}
if (weeks_.format(formatter).equals(end.format(formatter))) {
params.put("P_ELAS_FG", "BE");
}
dao.plan_merge(params);
}
// LocalDate 월요일: 1 ~ 일요일 7
// ERP10요일 월요일: 2 ~ 일요일 1
List<Integer> days = Arrays.asList(2, 3, 4, 5, 6, 7, 1); // erp10 요일하고 매핑
List<List<Integer>> fs = Arrays.asList(frst, scnd);
for (int i = 0; i < weeks.size() / 7; i++) {
List<String> week = new ArrayList<>();
for (int j = i * 7; j < (i + 1) * 7; j++) {
LocalDate date = weeks.get(j);
if (fs.get((i + 2) % 2).contains(days.get(date.getDayOfWeek().getValue()))) {
week.add(date.format(formatter));
}
}
weeks__.add(week);
}
// 전체일자 등록 및 시작일, 끝일에만 BS || BE 저장 후 근무유형이 있는 일자만 따로 UPDATE
for (List<String> d : weeks__) {
for (String s : d) {
params.put("P_START_TM", start_tm);
params.put("P_END_TM", end_tm);
params.put("P_PLAN_TM", Integer.parseInt(endtm) - Integer.parseInt(starttm));
params.put("P_BWRK_DT", s);
params.put("P_FLE_BWRK_TP_CD", fle_bwrk_tp_cd);
dao.plan_udt(params);
}
}
}