OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)
本篇博客的主要內容是:
?本篇博客的需要注意的點有:
(1)根據(jù)業(yè)務需求,規(guī)劃好整體的代碼結構和編碼邏輯;
(2)一種目前認可的編程小細節(jié);(PS:隨著以后經驗增多,可能會拋棄這種想法,或者有其他理解)
(3)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)
(4)每寫完一個Service模塊,也及時進行單元測試!!!這一步很重要,步步為營;;;否則到最后,前臺到后臺都編寫好后再測試,因為戰(zhàn)線較長,一旦出錯就比較難定位啦;
目錄
一:創(chuàng)建?LeaveFormService類:實現(xiàn)請假申請業(yè)務邏輯
1.LeaveFormService
2.說明
(1)這些操作需要設置在一個事務機制下
(2)代碼結構分析
(3)在Employee的Dao中,增加一個查詢上級的方法:selectLeader()方法
(4)selectLeader()方法在employee.xml中的實現(xiàn):動態(tài)SQL的分析
(5)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)
二:實際測試:
測試1:基層員工,請假72小時以上:
測試2:基層員工,請假72小時以內:
測試3:部門經理(這兒是研發(fā)部部門經理為例)
測試4:總經理
一:創(chuàng)建?LeaveFormService類:實現(xiàn)請假申請業(yè)務邏輯
創(chuàng)建LeaveFormService類:來實現(xiàn)請假申請的業(yè)務邏輯:
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:前臺界面提交過來的【請假表單數(shù)據(jù)】的LeaveForm對象;(是不包含formId屬性的)* @return:將【請假表單數(shù)據(jù)】存儲到數(shù)據(jù)庫后,包含formId屬性值的LeaveForm對象;*/public LeaveForm createLeaveForm(LeaveForm form){LeaveForm savedForm = (LeaveForm) MybatisUtils.executeUpdate(sqlSession -> {//1.持久化form表單數(shù)據(jù),8級以下員工表單state狀態(tài)為processing,8級(總經理)state狀態(tài)為approvedEmployeeDao 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表單數(shù)據(jù)leaveFormDao.insert(form);//2.增加第一條流程數(shù)據(jù),說明表單已提交,狀態(tài)為completeProcessFlowDao 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.分情況創(chuàng)建其余流程數(shù)據(jù)//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);flow3.setState("ready");//因為,需要部門經理審批后,才會輪到總經理審批,所以state是ready;flow3.setIsLast(1);processFlowDao.insert(flow3);}else {flow2.setIsLast(1);processFlowDao.insert(flow2);}}//3.2 7級員工,生成總經理審批任務else if (employee.getLevel() == 7){ // 這條請假申請是部門經理提交的Employee manager = employeeDao.selectLeader(employee);ProcessFlow flow = new ProcessFlow();flow.setFormId(form.getFormId());flow.setOperatorId(manager.getEmployeeId());flow.setAction("audit");flow.setCreateTime(new Date());flow.setState("process");flow.setOrderNo(2);flow.setIsLast(1);processFlowDao.insert(flow);}//3.3 8級員工,生成總經理審批任務,系統(tǒng)自動通過else if (employee.getLevel() == 8) {ProcessFlow flow = new ProcessFlow();flow.setFormId(form.getFormId());flow.setOperatorId(employee.getEmployeeId());flow.setAction("audit");flow.setResult("approved");//自動審批通過flow.setReason("自動通過");flow.setCreateTime(new Date());flow.setAuditTime(new Date());flow.setState("complete");//已經自動審批通過了,所以這個任務是completeflow.setOrderNo(2);flow.setIsLast(1);processFlowDao.insert(flow);}return form;});return savedForm;} }2.說明
(1)這些操作需要設置在一個事務機制下
因為這一套操作需要一榮俱榮、一損俱損,所以將這些操作放在了一個MybatisUtils.executeUpdate()中,這樣才會把這些操作放在一個事務機制下,讓這一套操作要么全部成功,要么一個也不做;
(2)代碼結構分析:
(3)在Employee的Dao中,增加一個查詢上級的方法:selectLeader()方法
為了實現(xiàn)這個功能一步步去寫就行:(先在EmployeeDao中定義方法,然后去employee.xml中去實現(xiàn)方法就好了):
@Param("emp")的一點說明:這種用法以前接觸過,但在目前的線中,還是第一次遇到;
關于@Param("emp")經過實測總結如下:
● 使用@Param("emp")的策略是:
?
● 不使用@Param("emp")的策略是:
?
● 二者的區(qū)別對比:
而且經過實測:下面這樣是不行的:即,既然已經給參數(shù)起了別名,在XML中就必須通過別名的方式去獲取值;
(4)selectLeader()方法在employee.xml中的實現(xiàn):動態(tài)SQL的分析
具體分析為:
(5)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)
BussinessConstants:注意這個變量【靜態(tài),final,名字全大寫并用下劃線連接不同的單詞;】
package com.imooc.oa.service;/*** 業(yè)務常量*/ public class BussinessConstants {public static final int MANAGER_AUDIT_HOURS=72;//總經理請假審批時間閾值 }這種策略,以前做項目的時候經常遇到,而且這是非常常見的編程策略,也是一種非常好的編程習慣,需要留意并在實際中加以應用!!!
二:實際測試:
測試1:基層員工,請假72小時以上:
package com.imooc.oa.service;import com.imooc.oa.entity.LeaveForm; import org.junit.Test;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import static org.junit.Assert.*;public class LeaveFormServiceTest {LeaveFormService leaveFormService = new LeaveFormService();/*** 市場部基層員工請假單(72小時以上)測試用例* @throws ParseException*/@Testpublic void createLeaveForm1() throws ParseException{SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");LeaveForm form = new LeaveForm();form.setEmployeeId(8l);form.setStartTime(sdf.parse("2020032608"));form.setEndTime(sdf.parse("2020040118"));form.setFormType(1);form.setReason("市場部員工請假單(72小時以上)");form.setCreateTime(new Date());LeaveForm savedForm = leaveFormService.createLeaveForm(form);System.out.println(savedForm.getFormId());} }運行結果:
數(shù)據(jù)庫的效果:完全符合預期效果
因為是72小時及以上,所以需要部門經理審批,也需要總經理審批。當前的狀態(tài)是部門經理正在審批(state=process),總經理準備審批(state=ready)
?
測試2:基層員工,請假72小時以內:
package com.imooc.oa.service;import com.imooc.oa.entity.LeaveForm; import org.junit.Test;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import static org.junit.Assert.*;public class LeaveFormServiceTest {LeaveFormService leaveFormService = new LeaveFormService();/*** 市場部員工請假單(72小時內)測試用例* @throws ParseException*/@Testpublic void createLeaveForm2() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");LeaveForm form = new LeaveForm();form.setEmployeeId(8l);form.setStartTime(sdf.parse("2020032608"));form.setEndTime(sdf.parse("2020032718"));form.setFormType(1);form.setReason("市場部員工請假單(72小時內)");form.setCreateTime(new Date());LeaveForm savedForm = leaveFormService.createLeaveForm(form);System.out.println(savedForm.getFormId());} }運行結果:
數(shù)據(jù)庫的效果:完全符合預期效果
因為是72小時以內,所以只需要部門經理審批就行了;
?
測試3:部門經理(這兒是研發(fā)部部門經理為例)
package com.imooc.oa.service;import com.imooc.oa.entity.LeaveForm; import org.junit.Test;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import static org.junit.Assert.*;public class LeaveFormServiceTest {LeaveFormService leaveFormService = new LeaveFormService();/*** 研發(fā)部部門經理請假單測試用例* @throws ParseException*/@Testpublic void createLeaveForm3() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");LeaveForm form = new LeaveForm();form.setEmployeeId(2l);form.setStartTime(sdf.parse("2020032608"));form.setEndTime(sdf.parse("2020040118"));form.setFormType(1);form.setReason("研發(fā)部部門經理請假單");form.setCreateTime(new Date());LeaveForm savedForm = leaveFormService.createLeaveForm(form);System.out.println(savedForm.getFormId());} }運行結果:
數(shù)據(jù)庫的效果:完全符合預期效果
部門經理的請假申請,直接有總經理審批;
?
測試4:總經理
package com.imooc.oa.service;import com.imooc.oa.entity.LeaveForm; import org.junit.Test;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;import static org.junit.Assert.*;public class LeaveFormServiceTest {LeaveFormService leaveFormService = new LeaveFormService();/*** 總經理請假單測試用例* @throws ParseException*/@Testpublic void createLeaveForm4() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");LeaveForm form = new LeaveForm();form.setEmployeeId(1l);form.setStartTime(sdf.parse("2020032608"));form.setEndTime(sdf.parse("2020040118"));form.setFormType(1);form.setReason("總經理請假單");form.setCreateTime(new Date());LeaveForm savedForm = leaveFormService.createLeaveForm(form);System.out.println(savedForm.getFormId());}}運行結果:
數(shù)據(jù)庫的效果:完全符合預期效果
可以看到,總經理的申請在流程表中業(yè)生成了兩條記錄;(對于這個,我目前的理解是“這應該是一個設計不太好的地方”;;但感覺,目前自己的理解可能有誤)
?
?
總結
以上是生活随笔為你收集整理的OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中声明子程序,哪位师傅知道51单片
- 下一篇: 华铸DCcae80 铸铝 压铸软件.ra