his-根据日期和排班规则得到医生出诊还是休息

  1. 1. 一、数据库表
    1. 1.1. 1.1 排班表
    2. 1.2. 1.2 员工表
  2. 2. 二、分析排班规则
    1. 2.1. 2.1 DAY_OF_WEEK
    2. 2.2. 规则分析
    3. 2.3. 2.2 java代码
    4. 2.4. 2.2 实现截图

一、数据库表

1.1 排班表

1.2 员工表

二、分析排班规则

2.1 DAY_OF_WEEK

在java中,可以通过Calendar获取的系统时间,DAY_OF_WEEK是说一周的周几,但这里的1是从星期天开始的,星期一是2,星期二是3…….以此类推。

以下是截取的源码部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public final static int SUNDAY = 1;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Monday.
*/
public final static int MONDAY = 2;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Tuesday.
*/
public final static int TUESDAY = 3;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Wednesday.
*/
public final static int WEDNESDAY = 4;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Thursday.
*/
public final static int THURSDAY = 5;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Friday.
*/
public final static int FRIDAY = 6;

/**
* Value of the {@link #DAY_OF_WEEK} field indicating
* Saturday.
*/
public final static int SATURDAY = 7;

规则分析

这里我们可以用一串01数字组合代表一周的上下午。

既然1是从星期天开始的,那么我们这也是从这开始!

这里我们拿 星期一三五下午排班为例。

日 一 二 三 四 五 六

00 01 00 01 00 01 00

0 是代表早上,1是下午

比如说,现在的时间是星期五下午,我们找对应排班的医生

1
2
3
4
5
6
7
8
[

{
password=123, scheduling_id=2, delmark=1,
rule_name=星期一三五下午, week_rule=00010001000100,
deptment_id=2, regist_level_id=1, id=4, realname=华佗
}
]

2.2 java代码

EmployeeServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@Service
public class EmployeeServiceImpl implements EmployeeService {

@Autowired
private EmployeeMapper employeeMapper;

@Override
public List<Map<String, Object>> getRegistDoctorList(String deptmentId, String registLevelId) {
return this.getWorkDoctorList(deptmentId, registLevelId);
}

//根据医生的排班情况和当前的系统日期,进行比较,得到当天及午别出诊的医生列表
private List<Map<String, Object>> getWorkDoctorList(String deptmentId, String registLevelId) {
//根据部门名称和挂号级别,得到满足条件的医生列表
List<Map<String, Object>> list = employeeMapper.getRegistDoctorList(deptmentId, registLevelId);
// 得到系统时间
Calendar c = Calendar.getInstance();
//获得从第几位截取医生的排班信息,从星期日作为字符串的第0位
int ruleDay = (c.get(Calendar.DAY_OF_WEEK)-1)*2;
// 获取系统时间是早上还是下午(上午:0,下午:1)
int amOrPm = c.get(Calendar.AM_PM);
// 创建一个新建的List,用来存符合条件的医生信息
List<Map<String, Object>> docs = new ArrayList<>();
// 遍历获得的医生列表
for (Map<String, Object> emp : list) {
// 获取排版规则
String week_rule = (String) emp.get("week_rule");
// 是否上班
char cc = week_rule.charAt(ruleDay + amOrPm);
if (cc=='1') {
docs.add(emp);
}
}
System.out.println(docs);
return docs;
}

}

EmployeeMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 约束声明 -->

<mapper namespace="com.lan.mapper.EmployeeMapper">
<select id="getRegistDoctorList" resultType="java.util.Map">
SELECT *
FROM employee e , scheduling s
WHERE e.deptment_id = #{deptmentId}
AND e.regist_level_id = #{registLevelId}
AND e.scheduling_id = s.id
</select>
</mapper>

2.2 实现截图