规则日历代码分析及使用(三地项目)

1. 使用限制
- 一个资源只能日历方案;
- 日历规则上可配置特殊日历;
- 公休日只支持周休
- 不计算工作时段时,计算特殊日历,不准确;
- 日历班制属性对应自定义档案 SHIFT_PROPERTY

2. 类型枚举
- 规则类别:1- 班次类别;2- 公休日方案;3- 特殊日历
- 日历属性:1- 工作;2- 休息
- 资源属性:0- 工厂;1- 工作中心;2- 工位
- 班制属性:MORNING_SHIFT- 早班;DAY_SHIFT- 白班;EVENING_SHIFT- 晚班;MIDDLE_SHIFT- 中班
- 特殊日期类型:1- 节假日;2- 休息日;3- 节假日加班;4- 休息日加班;5- 普通加班;6- 调整上班

3. 数据库表关键设计分析

image.png

4. 日历实例化计算逻辑:
- 根据资源 id 找到日历规则
- 规则归类(班次、公休规则必须维护且唯一,特殊日历规则可多个):班次规则 shiftRule、公休规则 holidayRule、特殊日历规则 specialRule
- 基于班次和公休计算实例化日历(calculateWorkTime=True 计算工作时段,否则不计算)
- 计算特殊日历(calculateSpecialTime=True 计算特殊日历,否则不计算)

5. 日历实例化代码中关键查询语句

--查询工作中心的工作类型日历规则
String hql_rule = "select r from MbfCalendarRule r where r.isDelete=0 and r.resourceProperty=1 and r.calendarResource=?1 order by ruleLevel";
--查询班次类别
String hql_nwsc = "select nwsc from MbfNewWorkShiftClass nwsc where nwsc.isDelete=0 and nwsc.code=?1";
--查询班次
String hql_swc = "select wsc from MbfWorkShiftClass wsc where wsc.isDelete=0 and wsc.shiftClassCode=?1 order by wsc.shiftSeq";
--查询班次
String hql_ws = "select ws from MbfWorkShift ws left join ws.mbfWorkShiftClass as mbfWorkShiftClass where ws.isDelete=0 and mbfWorkShiftClass.shiftClassCode=?1 order by mbfWorkShiftClass.shiftSeq, ws.workShiftSeq,ws.code";
--查询公休
String hql_holiday = "select hl from MbfHoliday hl where hl.isDelete=0 and hl.code=?1 ";
--查询公休详情
String hql_holidayDtl = "select to_char(hdtl.specialDate,'yyyy-MM-dd'), hdtl.specialType from MbfHolidayDetail hdtl where hdtl.isDelete=0 and hdtl.mbfHoliday.id=?1";