本篇博客的主要内容是:
本篇博客的需要注意的点有:
(1)根据业务需求,规划好整体的代码结构和编码逻辑;
(2)一种目前认可的编程小细节;(PS:随着以后经验增多,可能会抛弃这种想法,或者有其他理解)
(3)程序中的容易改变的常量,设置成外部调用的策略(以前做项目的时候遇到过,然后这也是非常常用的处理策略!!!!!)
(4)每写完一个Service模块,也及时进行单元测试!!!这一步很重要,步步为营;;;否则到最后,前台到后台都编写好后再测试,因为战线较长,一旦出错就比较难定位啦;
目录
一:创建 LeaveFormService类:实现请假申请业务逻辑
(3)在Employee的Dao中,增加一个查询上级的方法:selectLeader()方法
(4)selectLeader()方法在employee.xml中的实现:动态SQL的分析
(5)程序中的容易改变的常量,设置成外部调用的策略(以前做项目的时候遇到过,然后这也是非常常用的处理策略!!!!!)
一:创建 LeaveFormService类:实现请假申请业务逻辑
创建LeaveFormService类:来实现请假申请的业务逻辑:
1.LeaveFormService
package com.imooc.oa.service;
import com.imooc.oa.dao.EmployeeDao;
import com.imooc.oa.dao.LeaveFormDao;
import com.imooc.oa.dao.ProcessFlowDao;
import com.imooc.oa.entity.Employee;
import com.imooc.oa.entity.LeaveForm;
import com.imooc.oa.entity.ProcessFlow;
import com.imooc.oa.utils.MybatisUtils;
import java.util.Date;
/**
* 请假单流程服务
*/
public class LeaveFormService {
/**
*
* @param form:前台界面提交过来的【请假表单数据】的LeaveForm对象;(是不包含formId属性的)
* @return:将【请假表单数据】存储到数据库后,包含formId属性值的LeaveForm对象;
*/
public LeaveForm createLeaveForm(LeaveForm form){
LeaveForm savedForm = (LeaveForm) MybatisUtils.executeUpdate(sqlSession -> {
//1.持久化form表单数据,8级以下员工表单state状态为processing,8级(总经理)state状态为approved
EmployeeDao employeeDao = sqlSession.getMapper(EmployeeDao.class);
Employee employee = employeeDao.selectById(form.getEmployeeId());
if (employee.getLevel() == 8) {
form.setState("approved");
} else {
form.setState("processing");
}
LeaveFormDao leaveFormDao = sqlSession.getMapper(LeaveFormDao.class);//持久化form表单数据
leaveFormDao.insert(form);
//2.增加第一条流程数据,说明表单已提交,状态为complete
ProcessFlowDao processFlowDao = sqlSession.getMapper(ProcessFlowDao.class);
ProcessFlow flow1 = new ProcessFlow();
flow1.setFormId(form.getFormId());//在上面持久化form表单后,form对象的formId属性就被初始化了
flow1.setOperatorId(employee.getEmployeeId());
flow1.setAction("apply");
flow1.setCreateTime(new Date());
flow1.setOrderNo(1);
flow1.setState("complete");
flow1.setIsLast(0);
processFlowDao.insert(flow1);
//3.分情况创建其余流程数据
//3.1 7级以下员工,生成部门经理审批任务,请假时间大于36小时,还需生成总经理审批任务
if (employee.getLevel() < 7) {
Employee dmanager = employeeDao.selectLeader(employee);//查询上级领导(部门经理)
ProcessFlow flow2 = new ProcessFlow();
flow2.setFormId(form.getFormId());
flow2.setOperatorId(dmanager.getEmployeeId());
flow2.setAction("audit");
flow2.setCreateTime(new Date());
flow2.setOrderNo(2);
flow2.setState("process");
long diff = form.getEndTime().getTime() - form.getStartTime().getTime(); //获取请假的时间长度
float hours = diff / (1000 * 60 * 60) * 1f;//请假时间:小时为单位
if (hours >= BussinessConstants.MANAGER_AUDIT_HOURS){
flow2.setIsLast(0); //如果请假时间大于32小时,还需要总经理审批,自然这不是工作流程的最后一个
processFlowDao.insert(flow2);
// 总经理的部分
Employee manager = employeeDao.selectLeader(dmanager);
ProcessFlow flow3 = new ProcessFlow();
flow3.setFormId(form.getFormId());
flow3.setOperatorId(manager.getEmployeeId());
flow3.setAction("audit");
flow3.setCreateTime(new Date());
flow3.setOrderNo(3);