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
-
-
- 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 {
-}