日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)

發(fā)布時(shí)間:2024/3/12 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇博客的主要內(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。