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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2024/3/12 windows 21 豆豆

本篇博客的主要內容是:

?本篇博客的需要注意的點有:

(1)根據業務需求,規劃好整體的代碼結構和編碼邏輯;

(2)一種目前認可的編程小細節;(PS:隨著以后經驗增多,可能會拋棄這種想法,或者有其他理解)

(3)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)

(4)每寫完一個Service模塊,也及時進行單元測試!!!這一步很重要,步步為營;;;否則到最后,前臺到后臺都編寫好后再測試,因為戰線較長,一旦出錯就比較難定位啦;

目錄

一:創建?LeaveFormService類:實現請假申請業務邏輯

1.LeaveFormService

2.說明

(1)這些操作需要設置在一個事務機制下

(2)代碼結構分析

(3)在Employee的Dao中,增加一個查詢上級的方法:selectLeader()方法

(4)selectLeader()方法在employee.xml中的實現:動態SQL的分析

(5)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)

二:實際測試:

測試1:基層員工,請假72小時以上:

測試2:基層員工,請假72小時以內:

測試3:部門經理(這兒是研發部部門經理為例)

測試4:總經理


一:創建?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狀態為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表單數據leaveFormDao.insert(form);//2.增加第一條流程數據,說明表單已提交,狀態為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.分情況創建其余流程數據//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級員工,生成總經理審批任務,系統自動通過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()方法

為了實現這個功能一步步去寫就行:(先在EmployeeDao中定義方法,然后去employee.xml中去實現方法就好了):

@Param("emp")的一點說明:這種用法以前接觸過,但在目前的線中,還是第一次遇到;

關于@Param("emp")經過實測總結如下:

● 使用@Param("emp")的策略是:

?

● 不使用@Param("emp")的策略是:

?

● 二者的區別對比:

而且經過實測:下面這樣是不行的:即,既然已經給參數起了別名,在XML中就必須通過別名的方式去獲取值;


(4)selectLeader()方法在employee.xml中的實現:動態SQL的分析

具體分析為:


(5)程序中的容易改變的常量,設置成外部調用的策略(以前做項目的時候遇到過,然后這也是非常常用的處理策略!!!!!)

BussinessConstants:注意這個變量【靜態,final,名字全大寫并用下劃線連接不同的單詞;】

package com.imooc.oa.service;/*** 業務常量*/ 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());} }

運行結果:

數據庫的效果:完全符合預期效果

因為是72小時及以上,所以需要部門經理審批,也需要總經理審批。當前的狀態是部門經理正在審批(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());} }

運行結果:

數據庫的效果:完全符合預期效果

因為是72小時以內,所以只需要部門經理審批就行了;

?

測試3:部門經理(這兒是研發部部門經理為例)

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 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("研發部部門經理請假單");form.setCreateTime(new Date());LeaveForm savedForm = leaveFormService.createLeaveForm(form);System.out.println(savedForm.getFormId());} }

運行結果:

數據庫的效果:完全符合預期效果

部門經理的請假申請,直接有總經理審批;

?

測試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());}}

運行結果:

數據庫的效果:完全符合預期效果

可以看到,總經理的申請在流程表中業生成了兩條記錄;(對于這個,我目前的理解是“這應該是一個設計不太好的地方”;;但感覺,目前自己的理解可能有誤)

?

?

總結

以上是生活随笔為你收集整理的OA系统十七:请假申请三:【请假申请】这个内嵌界面中【提交请假表单数据】的Service层;(PS:在EmployeeDao中初次遇到@Param()参数设置)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。