diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml index aa00ffa..63e9001 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index fdc35ea..c5772e2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,5 @@ - - - + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index cf0fa2a..0000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1759408913305 - - - - \ No newline at end of file diff --git a/src/main/java/com/dota/Main.java b/src/main/java/com/dota/Main.java index 2bfd999..c85738e 100644 --- a/src/main/java/com/dota/Main.java +++ b/src/main/java/com/dota/Main.java @@ -2,38 +2,279 @@ package com.dota; import com.dota.domain.Doctor; import com.dota.domain.Week; -import com.dota.domain.doctors.*; +import com.dota.domain.WorkEnum; + +import java.util.Arrays; public class Main { + static Doctor gl; + static Doctor zl; + static Doctor ttt; + static Doctor zy; + static Doctor ln; + static Doctor zh; + static Doctor tgy; public static void main(String[] args) { - var gl = new GuLei(); - var zl = new ZhangLiang(); - var ttt = new TangTingTing(); - var zy = new ZuYi(); - var ln = new LiNing(); - var zh = new ZhouHui(); - var tgy = new TianGuoYan(); + init(); var doctorOrder = new Doctor[]{ - gl,zl,ttt,zy,ln,zh + gl, zl, ttt, zy, ln, zh }; - var outputOrder = new Doctor[] { - ln,zy,ttt,zl,zh,gl,tgy + var outputOrder = new Doctor[]{ + ln, zy, ttt, zl, zh, gl, tgy }; - schedule(doctorOrder); - print(2, outputOrder); + + for (int i = 0; i < 2; i++) { + schedule(doctorOrder, outputOrder); + } } - static void schedule(Doctor[] doctorOrder) { + static void init() { + gl = new Doctor("顾磊"); + gl.group = 1; + zl = new Doctor("章亮"); + zl.opd = 3; + zl.works[3] = WorkEnum.OPD; + ttt = new Doctor("唐婷婷"); + ttt.opd = 2; + ttt.works[2] = WorkEnum.OPD; + zy = new Doctor("杨祖怡"); + zy.group = 1; + ln = new Doctor("李宁"); + ln.opd = 4; + ln.works[4] = WorkEnum.OPD; + zh = new Doctor("周晖"); + zh.opd = 1; + zh.works[1] = WorkEnum.OPD; + tgy = new Doctor("田国燕"); + tgy.opd = 0; + tgy.group = 0; + tgy.works[0] = WorkEnum.OPD; + zh.swap = gl; + ttt.swap = zl; } - static void print(int weeks, Doctor[] outputOrder) { - for (int i = 0; i < weeks; i++) { - for (Week value : Week.values()) { - System.out.print(value.getValue()); + static void schedule(Doctor[] doctors, Doctor[] outputOrder) { + // 日期 + int days = 0; + // 医生下标 + int idx = 0; + + for (int k = 0; k < 2; k++) { + for (int i = 0; i < 7; i++) { + var d = doctors[idx]; + + if (d.firstRest) { + d.firstRest = false; + d.works[0] = WorkEnum.HOLIDAY; + } + + // 值班第二天是值休 + // 周六值班有两天额外休息 + if (i == 5) { + d.restCount = 2; + d.works[6] = WorkEnum.HOLIDAY; + } else if (i == 4) { //周五值班有额外一天休息 + d.works[5] = WorkEnum.HOLIDAY; + d.restCount = 1; + } else if (i == 6) { // 周日值班有一天额外休息 + d.restCount = 1; + d.firstRest = true; + } else { + d.works[days + 1] = WorkEnum.HOLIDAY; + } + + if (d.works[days] == WorkEnum.OPD) { + d.works[days] = WorkEnum.OPD_AND_DUTY; + } else { + d.works[days] = WorkEnum.DUTY; + } + + days = (days + 1) % 7; + idx = (idx + 1) % doctors.length; + } + + fix(doctors); + rest(doctors); + print(outputOrder); + for (Doctor d : doctors) { + d.reset(); + } + } + } + + // 给有调休的安排休息 + // 保证同一组必须有一个在 + static void rest(Doctor[] doctors) { + for (Doctor doctor : doctors) { + if (doctor.lastRestCount == 0) { + continue; + } + + int count = 0; + for (int j = 0; j < 5; j++) { + if (checkRest(j, doctor, doctors)) { + doctor.works[j] = WorkEnum.REST; + count++; + } + + if (count==doctor.lastRestCount) { + break; + } + } + } + for (Doctor doctor : doctors) { + doctor.lastRestCount = doctor.restCount; + } + } + + // 判断是否有门诊和值班冲突,有的话调整一下 + // 冲突的情况是前一天值班,门诊那天变调休了,因此没有门诊或者门诊值班的安排 + static void fix(Doctor[] doctors) { + for (Doctor d : doctors) { + if (d.name.equals("杨祖怡") || d.name.equals("顾磊")) { + continue; + } + + if (Arrays.stream(d.works).anyMatch(workEnum -> + workEnum == WorkEnum.OPD || workEnum == WorkEnum.OPD_AND_DUTY)) { + continue; + } + + if (d == ln) { + ln.works[3] = WorkEnum.OPD_AND_DUTY; + zl.works[3] = WorkEnum.WORK; + zl.works[4] = WorkEnum.OPD; + } + + if (d == zl) { + ln.works[3] = WorkEnum.OPD; + zl.works[4] = WorkEnum.OPD; + } + + // 周晖固定周二门诊,所以不能周一值班 + if (d == zh) { + zh.works[0] = WorkEnum.WORK; + zh.works[1] = WorkEnum.OPD; + // 和顾磊换值班 + int t = getDuty(gl); + zh.works[t] = gl.works[t]; + if (t < 6) { + zh.works[t + 1] = gl.works[t + 1]; + } + + if (t < 4) { + gl.works[t] = WorkEnum.WORK; + gl.works[t + 1] = WorkEnum.WORK; + } + if (t == 4) { + zh.restCount = 1; + gl.restCount = 0; + gl.works[4] = WorkEnum.WORK; + gl.works[5] = WorkEnum.REST; + } + if (t == 5) { + zh.restCount = 2; + gl.restCount = 0; + gl.works[5] = WorkEnum.REST; + gl.works[6] = WorkEnum.REST; + } + if (t == 6) { + zh.restCount = 1; + zh.firstRest = true; + gl.restCount = 0; + gl.firstRest = false; + gl.works[6] = WorkEnum.REST; + } + + gl.works[0] = WorkEnum.DUTY; + gl.works[1] = WorkEnum.HOLIDAY; + } + + // 唐婷婷固定周三门诊,周二值班的话和章亮换一下 + if (d == ttt) { + ttt.works[1] = WorkEnum.WORK; + ttt.works[2] = WorkEnum.OPD; + //和章亮换值班 + int t = getDuty(zl); + ttt.works[t] = zl.works[t]; + if (t < 6) { + ttt.works[t + 1] = zl.works[t + 1]; + } + + if (t < 4) { + zl.works[t] = WorkEnum.WORK; + zl.works[t + 1] = WorkEnum.WORK; + } else if (t == 4) { + ttt.restCount = 1; + zl.restCount = 0; + zl.works[4] = WorkEnum.WORK; + zl.works[5] = WorkEnum.REST; + } else if (t == 5) { + ttt.restCount = 2; + zl.restCount = 0; + zl.works[5] = WorkEnum.REST; + zl.works[6] = WorkEnum.REST; + } else if (t == 6) { + ttt.restCount = 1; + ttt.firstRest = true; + zl.restCount = 0; + zl.firstRest = false; + zl.works[6] = WorkEnum.REST; + } + + zl.works[1] = WorkEnum.DUTY; + zl.works[2] = WorkEnum.HOLIDAY; + } + } + } + + static int getDuty(Doctor d) { + for (int i = 0; i < d.works.length; i++) { + if (d.works[i] == WorkEnum.DUTY) { + return i; + } + } + return -1; + } + + //判断某天是否可以休息 + //祖怡和顾磊是一组,其他人是一组 + static boolean checkRest(int day, Doctor doctor, Doctor[] doctors) { + // 只有日班才会安排休息 + if (doctor.works[day] != WorkEnum.WORK) { + return false; + } + + for (Doctor d : doctors) { + if (doctor.group == d.group) { + var w = d.works[day]; + if (w == WorkEnum.WORK || + w == WorkEnum.OPD || + w == WorkEnum.DUTY || + w == WorkEnum.OPD_AND_DUTY) { + return true; + } + } + } + return false; + } + + static void print(Doctor[] outputOrder) { + System.out.printf("%10s", " "); + for (Week value : Week.values()) { + System.out.printf("%10s", value.getValue()); + } + + System.out.println(" "); + for (Doctor doctor : outputOrder) { + System.out.printf("%10s", doctor.name); + for (WorkEnum work : doctor.works) { + System.out.printf("%10s", work.getName()); } System.out.println(" "); } + System.out.println(" "); } } \ No newline at end of file diff --git a/src/main/java/com/dota/domain/Doctor.java b/src/main/java/com/dota/domain/Doctor.java index 2b1a0f6..cb20890 100644 --- a/src/main/java/com/dota/domain/Doctor.java +++ b/src/main/java/com/dota/domain/Doctor.java @@ -1,15 +1,27 @@ package com.dota.domain; public class Doctor { - // 有多少调休 + public String name; + // 上周的调休 + public int lastRestCount; + // 下周的调休 public int restCount = 0; // 门诊时间 - public Week opd; + public int opd; // 值班 public Week duty; + //值班和门诊冲突时换班的医生 + public Doctor swap; + + //周一是否有值休 + public boolean firstRest; + + //所属分组 + public int group = 2; + public WorkEnum[] works = new WorkEnum[]{ WorkEnum.WORK, WorkEnum.WORK, @@ -19,4 +31,25 @@ public class Doctor { WorkEnum.REST, WorkEnum.REST, }; + + public Doctor(String name) { + this.name = name; + } + + public void reset() { + for (int i = 0; i < 5; i++) { + works[i] = WorkEnum.WORK; + } + for (int i = 5; i < 7; i++) { + works[i] = WorkEnum.REST; + } + + switch (name) { + case "周晖" -> works[1] = WorkEnum.OPD; + case "唐婷婷" -> works[2] = WorkEnum.OPD; + case "李宁" -> works[3] = WorkEnum.OPD; + case "章亮" -> works[4] = WorkEnum.OPD; + } + } + } diff --git a/src/main/java/com/dota/domain/Week.java b/src/main/java/com/dota/domain/Week.java index 970bbf6..99dd393 100644 --- a/src/main/java/com/dota/domain/Week.java +++ b/src/main/java/com/dota/domain/Week.java @@ -8,7 +8,7 @@ public enum Week { FRI("周五"), SAT("周六"), SUM("周日"); - private String value; + private final String value; Week(String value) { this.value= value; diff --git a/src/main/java/com/dota/domain/WorkEnum.java b/src/main/java/com/dota/domain/WorkEnum.java index ead086a..974f849 100644 --- a/src/main/java/com/dota/domain/WorkEnum.java +++ b/src/main/java/com/dota/domain/WorkEnum.java @@ -4,10 +4,18 @@ public enum WorkEnum { OPD("门诊"), REST("休息"), - WORK("白班"), + WORK("日班"), DUTY("值班"), - HOLIDAY("调休"), - OPD_AND_WORK("门诊值班"); + HOLIDAY("值休"), + OPD_AND_DUTY("门诊值班"); - WorkEnum(String name){} + private final String name; + + WorkEnum(String name){ + this.name = name; + } + + public String getName(){ + return name; + } } diff --git a/src/main/java/com/dota/domain/doctors/GuLei.java b/src/main/java/com/dota/domain/doctors/GuLei.java deleted file mode 100644 index 6d15b10..0000000 --- a/src/main/java/com/dota/domain/doctors/GuLei.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; - -public class GuLei extends Doctor { - public GuLei(){ - } -} diff --git a/src/main/java/com/dota/domain/doctors/LiNing.java b/src/main/java/com/dota/domain/doctors/LiNing.java deleted file mode 100644 index c589443..0000000 --- a/src/main/java/com/dota/domain/doctors/LiNing.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; -import com.dota.domain.WorkEnum; - -public class LiNing extends Doctor { - public LiNing(){ - this.works[4] = WorkEnum.OPD; - } -} diff --git a/src/main/java/com/dota/domain/doctors/TangTingTing.java b/src/main/java/com/dota/domain/doctors/TangTingTing.java deleted file mode 100644 index a46e969..0000000 --- a/src/main/java/com/dota/domain/doctors/TangTingTing.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; -import com.dota.domain.WorkEnum; - -public class TangTingTing extends Doctor { - public TangTingTing(){ - this.works[2] = WorkEnum.OPD; - } -} diff --git a/src/main/java/com/dota/domain/doctors/TianGuoYan.java b/src/main/java/com/dota/domain/doctors/TianGuoYan.java deleted file mode 100644 index 91c54d5..0000000 --- a/src/main/java/com/dota/domain/doctors/TianGuoYan.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; -import com.dota.domain.WorkEnum; - -public class TianGuoYan extends Doctor { - public TianGuoYan(){ - this.works[0] = WorkEnum.OPD; - } -} diff --git a/src/main/java/com/dota/domain/doctors/ZhangLiang.java b/src/main/java/com/dota/domain/doctors/ZhangLiang.java deleted file mode 100644 index d470d0c..0000000 --- a/src/main/java/com/dota/domain/doctors/ZhangLiang.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; -import com.dota.domain.WorkEnum; - -public class ZhangLiang extends Doctor { - public ZhangLiang(){ - this.works[3] = WorkEnum.OPD; - } -} diff --git a/src/main/java/com/dota/domain/doctors/ZhouHui.java b/src/main/java/com/dota/domain/doctors/ZhouHui.java deleted file mode 100644 index a3b4c4e..0000000 --- a/src/main/java/com/dota/domain/doctors/ZhouHui.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; -import com.dota.domain.WorkEnum; - -public class ZhouHui extends Doctor { - public ZhouHui(){ - this.works[1] = WorkEnum.OPD; - } -} diff --git a/src/main/java/com/dota/domain/doctors/ZuYi.java b/src/main/java/com/dota/domain/doctors/ZuYi.java deleted file mode 100644 index 57a4153..0000000 --- a/src/main/java/com/dota/domain/doctors/ZuYi.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.dota.domain.doctors; - -import com.dota.domain.Doctor; - -public class ZuYi extends Doctor { -}