亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何自己實現一個可自定義業務流程步驟的工作流

2019-11-11 03:53:07
字體:
來源:轉載
供稿:網友

項目功能需求簡述

由于業務需要,需要一個申請-審批的工作流,并且業務流程是不固定的,需要能靈活配置,比如現在是:開始->部門經理審批->結束,可能之后就會變為開始->部門經理審批->部門領導審批->結束。因此不能把代碼寫死,必須做成高可配置的。


UML設計

這里寫圖片描述


項目設計說明

車輛申請項目

一個項目名稱,也可以是其他的,比如請假項目,報銷項目等都可以。主要就是提出申請時需要填寫的表單信息。

任務列表

當用戶填完申請項目之后,王任務列表中插入一條數據,記錄所屬項目、當前步驟、任務狀態(審批中、任務結束)、使用的流程版本、下一步執行的人,整個任務重申請到結束都只是在更新當前步驟、任務狀態(審批中、任務結束)、下一步執行的人這幾個字段,其他的都不變。也就是一次申請就只會有一條任務。

歷史任務

每一次申請、或者審批步驟都往里邊插入一條數據,記錄當前的審判者、步驟、創建時間等信息。一個申請項目中會有多條記錄。

流程列表

流程的添加,供申請時選擇所屬流程,流程可設置啟用或不啟用狀態。

流程步驟

比如申請車輛這個流程的所有步驟。省內用車:開始->步驟1:部門經理審批->結束;長途用車:開始->步驟1:部門經理審批->步驟2:部門領導審批->結束

步驟處理角色

每個步驟由哪個角色來處理。比如:步驟:部門經理審批——部門經理,步驟:部門領導審批——部門領導。

角色

系統角色,主要做權限控制。

企業員工

系統用戶。

車輛管理

企業的所有車輛。


初始化數據

角色

這里寫圖片描述

用戶

這里寫圖片描述

車輛

這里寫圖片描述

步驟處理角色

這里寫圖片描述

流程

這里寫圖片描述

流程步驟

這里寫圖片描述

項目流程說明演示

這里演示一個開始->部門經理審批->部門領導審批->結束的流程

提出申請

先填寫好信息,再點擊確定申請,則開始申請,并往歷史流程和任務列表插入一條數據

這里寫圖片描述 點擊申請 這里寫圖片描述 插入兩條數據 這里寫圖片描述 這里寫圖片描述

自己項目中的代碼為:

/** * 選澤下一步審批人 */ @RequestMapping(value="/submitApply") public ModelAndView submitApply() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID //根據項目ID查詢項目基本信息 -> 找出這個項目使用的流程 -> 查看這個流程的第一步是那哪角色審批 //-> 查詢用戶中是這個角色的所有用戶供選擇 pd.put("nowCount","1"); List<User> userList=userService.listAllUserByApply(pd); mv.setViewName("information/apply/tasklist_chooseUser"); mv.addObject("msg","submitApplyresult"); mv.addObject("pd", pd); mv.addObject("userList",userList); return mv; } /** * 提交申請 * @return * @throws Exception */ @RequestMapping(value="/submitApplyresult") public ModelAndView submitApplyresult() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID String USER_ID=pd.getString("USER_ID");//選澤的用戶ID //-------------往任務列表中插入一條數據-------------------- pd.put("ITEMID", APPLY_ID); //任務ID pd.put("ACTORID", '1'); //步驟ID: -1表示結束 其他則按照流程定義里的執行順序來 pd.put("STATE", "審核流程進行中"); //審核狀態 PageData pds=applyService.findById(pd); pd.put("VERSION", pds.getString("SQLX")); //流程版本ID 也就是他的申請類型ID pd.put("NextUserID",USER_ID);//下一步審批者ID String TASKLIST_ID=this.get32UUID(); pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.save(pd); //-------------往歷史任務列表中插入一條數據-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務ID pd.put("ACTORID","0"); //步驟ID:-1表示結束 其他則按照流程定義里的執行順序來 pd.put("MEMO", USERNAME+"提出申請"); //備注 pd.put("OperaTEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創建時間 String TASKHISTORY_ID=this.get32UUID(); pd.put("TASKHISTORY_ID",TASKHISTORY_ID ); //主鍵ID taskHistoryService.save(pd); //-----------------------------------------------------// mv.addObject("msg","success"); mv.setViewName("save_result"); return mv; }

部門經理審批

有待審批任務的人點擊待我審批任務后就會列出來 這里寫圖片描述

在審核界面可以選擇同意或者拒絕 如果同意的話會判斷目前是不是最后一個步驟,是就選澤車輛,不是就選擇下一步的處理角色。 如果不同意的話則直接結束流程。

目前還不是最后一步 這里寫圖片描述 更新任務列表 這里寫圖片描述 歷史任務插入一條數據 這里寫圖片描述

部門領導審批

部門領導以及是這個審批流程中的最后一個審批 所以選擇車輛而不是下一步處理人 這里寫圖片描述 更新任務列表 這里寫圖片描述 插入歷史紀錄 這里寫圖片描述

審批代碼

部門經理審批和部門領導審批的代碼都是一樣的,就算在新增其他流程代碼也是不需要修改的。

/** * 選擇下一步審批人,流程繼續 */ @RequestMapping(value="/taskSubmitApply") public ModelAndView taskSubmitApply() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID //根據項目ID查詢項目基本信息 -> 找出這個項目使用的流程 -> 查看這個流程的第一步是那哪角色審批 //-> 查詢用戶中是這個角色的所有用戶供選擇 int nowCount=tasklistService.findNowCount(pd);//當前步驟 int allCount=tasklistService.findCount(pd);//總的步驟 if(allCount==nowCount){//供頁面判斷是否是最后 pd.put("iSLast",1); }else pd.put("iSLast",0); pd.put("nowCount",nowCount+1); List<User> userList=userService.listAllUserByApply(pd); List<Car> carList=carService.carlistAll(); //如果當前次數+1是最后一次,則進入派車頁面// if(nowCount+1==tasklistService.findCount(pd)){// mv.setViewName("information/car/list");// mv.addObject("msg","tasklist/submitApplyresult");// mv.addObject("pd", pd);// }else {//否則進入設置下一個審批者頁面 mv.setViewName("information/tasklist/tasklist_chooseUser"); mv.addObject("pd", pd); mv.addObject("userList",userList); mv.addObject("carList",carList); if(allCount==nowCount) {//供頁面判斷是最后 mv.addObject("msg","endtaskSubmitApplyresult");//同意 繼續下一步的角色選擇 }else { mv.addObject("msg","taskSubmitApplyresult");//最后一個派車同意 繼續下一步的角色選擇 } return mv; } /** * 同意派車,流程結束 * @return * @throws Exception */ @RequestMapping(value="/endtaskSubmitApplyresult") public ModelAndView endtaskSubmitApplyresult() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID String Car_ID=pd.getString("Car_ID");//選澤的車輛ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當前任務ID //-------------更新任務列表的下一個審批者和下一步的步驟ID-------------------- int nowCount=tasklistService.findNowCount(pd); int allCount=tasklistService.findCount(pd);// if(nowCount<allCount){ pd.put("ACTORID", -1); //步驟ID: -1表示結束 其他則按照流程定義里的執行順序來 pd.put("STATE", "流程結束,請提取車輛:"+Car_ID); //審核狀態 pd.put("NextUserID","");//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd); //-------------往歷史任務列表中插入一條數據-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務ID pd.put("ACTORID",nowCount); //步驟ID:-1表示結束 其他則按照流程定義里的執行順序來 pd.put("MEMO", USERNAME+"同意申請,審核流程結束"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創建時間 String TASKHISTORY_ID=this.get32UUID(); pd.put("TASKHISTORY_ID",TASKHISTORY_ID ); //主鍵ID taskHistoryService.save(pd); //-----------------------------------------------------// mv.addObject("msg","success"); mv.setViewName("save_result"); return mv; } /** * 同意的審核,繼續下一個審批人選澤,流程繼續 * @return * @throws Exception */ @RequestMapping(value="/taskSubmitApplyresult") public ModelAndView taskSubmitApplyresult() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID String USER_ID=pd.getString("USER_ID");//選澤的用戶ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當前任務ID //-------------更新任務列表的下一個審批者和下一步的步驟ID-------------------- int nowCount=tasklistService.findNowCount(pd); int allCount=tasklistService.findCount(pd);// if(nowCount<allCount){ pd.put("ACTORID", nowCount+1); //步驟ID: -1表示結束 其他則按照流程定義里的執行順序來 pd.put("STATE", "審核流程進行中"); //審核狀態 pd.put("NextUserID",USER_ID);//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd);// }else {// pd.put("ACTORID", "-1"); //步驟ID: -1表示結束 其他則按照流程定義里的執行順序來// pd.put("STATE", "審核流程結束"); //審核狀態// pd.put("NextUserID","");//下一步審批者ID// pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID// tasklistService.edit(pd);// } //-------------往歷史任務列表中插入一條數據-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務ID pd.put("ACTORID",nowCount); //步驟ID:-1表示結束 其他則按照流程定義里的執行順序來 pd.put("MEMO", USERNAME+"同意申請"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創建時間 String TASKHISTORY_ID=this.get32UUID(); pd.put("TASKHISTORY_ID",TASKHISTORY_ID ); //主鍵ID taskHistoryService.save(pd); //-----------------------------------------------------// mv.addObject("msg","success"); mv.setViewName("save_result"); return mv; } /** * 不同意的審核,流程結束 * @return * @throws Exception */ @RequestMapping(value="/refuseapply") public ModelAndView refuseapply() throws Exception{ logBefore(logger, "提交Apply"); ModelAndView mv = this.getModelAndView(); PageData pd = new PageData(); pd = this.getPageData(); String APPLY_ID=pd.getString("APPLY_ID");//項目ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當前任務ID pd.put("ACTORID", "-1"); //步驟ID: -1表示結束 其他則按照流程定義里的執行順序來 pd.put("STATE", "流程結束"); //審核狀態 pd.put("NextUserID","");//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd); //-------------往歷史任務列表中插入一條數據-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務ID pd.put("ACTORID","-1"); //步驟ID:-1表示結束 其他則按照流程定義里的執行順序來 pd.put("MEMO", USERNAME+"不同意申請"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創建時間 String TASKHISTORY_ID=this.get32UUID(); pd.put("TASKHISTORY_ID",TASKHISTORY_ID ); //主鍵ID taskHistoryService.save(pd); //-----------------------------------------------------// mv.addObject("msg","success"); mv.setViewName("save_result"); return mv; }
上一篇:cpp 12.9

下一篇:PAT B1021. 個位數統計 (15)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线视频二区| 精品视频www| 欧美激情在线播放| 日韩欧美在线免费| 亚洲精品久久久久久久久久久| 欧美精品久久久久久久久久| 久久久精品久久| 午夜免费在线观看精品视频| 精品国偷自产在线视频| 亚洲国产精品va在看黑人| 欧美色欧美亚洲高清在线视频| 亚洲自拍另类欧美丝袜| 青青久久av北条麻妃海外网| 日韩欧美在线免费观看| 欧美一级视频免费在线观看| 精品国产拍在线观看| 国产在线观看精品一区二区三区| 国产精品福利在线观看网址| 欧美激情在线一区| 精品成人国产在线观看男人呻吟| www.日韩.com| 国产午夜精品免费一区二区三区| 成人精品视频在线| 国产精品揄拍500视频| 欧美高清理论片| 亚洲精品久久7777777| 欧美巨乳美女视频| 91av视频在线播放| 国产精品久久久久久久久粉嫩av| 亚洲电影中文字幕| 亚洲三级 欧美三级| 久久久久久久电影一区| 欧美激情欧美激情| 欧美在线影院在线视频| 国产精品久久久久久中文字| 亚洲第一视频网站| 在线电影欧美日韩一区二区私密| 亚洲免费av片| 亚洲激情免费观看| 国产一区二区三区在线免费观看| 亚洲第一区第一页| 成人午夜激情免费视频| 91色中文字幕| 国产不卡一区二区在线播放| 亚洲最大av网| 欧日韩在线观看| 欧美一级片久久久久久久| 日韩av在线免费观看一区| 久久在线观看视频| 91久久嫩草影院一区二区| 91精品久久久久久久| 一色桃子一区二区| 国产精品免费视频久久久| 日韩中文字幕网| 精品高清一区二区三区| 国产美女久久久| 精品女同一区二区三区在线播放| 日韩欧美在线视频观看| 国产精品自产拍在线观| 精品久久久久久国产91| 国产精品永久免费| 国产精品三级美女白浆呻吟| 精品国产一区久久久| 日韩电影视频免费| 亚洲国产精品va在线看黑人动漫| www.美女亚洲精品| 欧美性猛交xxxx免费看| 久久97精品久久久久久久不卡| 午夜精品久久久99热福利| 亚洲国产成人在线视频| 国产精品美女免费看| 亚洲欧美国产精品久久久久久久| 中文字幕欧美精品日韩中文字幕| 日韩成人在线播放| 在线播放亚洲激情| 欧美午夜久久久| 粉嫩av一区二区三区免费野| 久久99青青精品免费观看| 久久久久久久久综合| 亚洲欧美国产一区二区三区| 精品成人国产在线观看男人呻吟| 91豆花精品一区| 欧美夫妻性生活xx| 国产亚洲成精品久久| 丝袜情趣国产精品| 国产成人aa精品一区在线播放| 4438全国亚洲精品在线观看视频| 欧美国产乱视频| 欧美亚洲日本网站| 美女av一区二区三区| 久久视频免费观看| 亚洲美女av网站| 久热精品视频在线免费观看| 欧美影院在线播放| 久久免费视频在线| 国产成人精品在线播放| 色偷偷噜噜噜亚洲男人| 98精品在线视频| 久久这里有精品视频| 亚洲精品日韩在线| 这里只有精品久久| 久久久亚洲福利精品午夜| 欧美一级在线亚洲天堂| 欧美国产第二页| 国产欧美日韩中文字幕在线| 欧美又大又粗又长| 精品福利视频导航| 亚洲 日韩 国产第一| 国产精品精品视频| 欧美成人久久久| 欧美xxxwww| 亚洲精品中文字幕女同| 亚洲精品电影在线| 国产免费一区二区三区在线能观看| 国产精品www色诱视频| 亚洲free嫩bbb| 日韩视频在线一区| 色综合亚洲精品激情狠狠| 26uuu久久噜噜噜噜| 亚洲午夜未删减在线观看| 97久久国产精品| 日韩欧美精品网址| 亲子乱一区二区三区电影| 久久精品中文字幕免费mv| 欧美日韩高清在线观看| 97视频在线看| 欧美另类交人妖| 亚洲一区av在线播放| 国产精品视频免费在线观看| 亚洲国模精品一区| 97香蕉久久夜色精品国产| 美女扒开尿口让男人操亚洲视频网站| 亚洲综合自拍一区| 亚洲视频999| 亚洲欧洲自拍偷拍| 最近2019中文字幕第三页视频| 精品亚洲永久免费精品| 2020欧美日韩在线视频| 欧美韩日一区二区| 色久欧美在线视频观看| 成人写真视频福利网| 国产精品成人一区| 欧洲日韩成人av| 中文字幕成人精品久久不卡| 亚洲男人天堂网| 亚洲人成77777在线观看网| 日本久久中文字幕| 姬川优奈aav一区二区| 成人av资源在线播放| 亚洲精品久久久久中文字幕欢迎你| 欧美伊久线香蕉线新在线| 亚洲视频在线观看网站| 精品国产999| 亚洲性69xxxbbb| 精品色蜜蜜精品视频在线观看| 国产精品综合网站| 亚洲第一黄色网| 成人av.网址在线网站| 国产精品99久久久久久久久久久久| 亚洲精品视频在线播放| 日韩av网址在线观看| 亚洲精品电影网在线观看| 伊人青青综合网站| 91成人在线视频|