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