国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

如何自己實(shí)現(xiàn)一個(gè)可自定義業(yè)務(wù)流程步驟的工作流

2019-11-11 03:53:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

項(xiàng)目功能需求簡(jiǎn)述

由于業(yè)務(wù)需要,需要一個(gè)申請(qǐng)-審批的工作流,并且業(yè)務(wù)流程是不固定的,需要能靈活配置,比如現(xiàn)在是:開(kāi)始->部門經(jīng)理審批->結(jié)束,可能之后就會(huì)變?yōu)殚_(kāi)始->部門經(jīng)理審批->部門領(lǐng)導(dǎo)審批->結(jié)束。因此不能把代碼寫死,必須做成高可配置的。


UML設(shè)計(jì)

這里寫圖片描述


項(xiàng)目設(shè)計(jì)說(shuō)明

車輛申請(qǐng)項(xiàng)目

一個(gè)項(xiàng)目名稱,也可以是其他的,比如請(qǐng)假項(xiàng)目,報(bào)銷項(xiàng)目等都可以。主要就是提出申請(qǐng)時(shí)需要填寫的表單信息。

任務(wù)列表

當(dāng)用戶填完申請(qǐng)項(xiàng)目之后,王任務(wù)列表中插入一條數(shù)據(jù),記錄所屬項(xiàng)目、當(dāng)前步驟、任務(wù)狀態(tài)(審批中、任務(wù)結(jié)束)、使用的流程版本、下一步執(zhí)行的人,整個(gè)任務(wù)重申請(qǐng)到結(jié)束都只是在更新當(dāng)前步驟、任務(wù)狀態(tài)(審批中、任務(wù)結(jié)束)、下一步執(zhí)行的人這幾個(gè)字段,其他的都不變。也就是一次申請(qǐng)就只會(huì)有一條任務(wù)。

歷史任務(wù)

每一次申請(qǐng)、或者審批步驟都往里邊插入一條數(shù)據(jù),記錄當(dāng)前的審判者、步驟、創(chuàng)建時(shí)間等信息。一個(gè)申請(qǐng)項(xiàng)目中會(huì)有多條記錄。

流程列表

流程的添加,供申請(qǐng)時(shí)選擇所屬流程,流程可設(shè)置啟用或不啟用狀態(tài)。

流程步驟

比如申請(qǐng)車輛這個(gè)流程的所有步驟。省內(nèi)用車:開(kāi)始->步驟1:部門經(jīng)理審批->結(jié)束;長(zhǎng)途用車:開(kāi)始->步驟1:部門經(jīng)理審批->步驟2:部門領(lǐng)導(dǎo)審批->結(jié)束

步驟處理角色

每個(gè)步驟由哪個(gè)角色來(lái)處理。比如:步驟:部門經(jīng)理審批——部門經(jīng)理,步驟:部門領(lǐng)導(dǎo)審批——部門領(lǐng)導(dǎo)。

角色

系統(tǒng)角色,主要做權(quán)限控制。

企業(yè)員工

系統(tǒng)用戶。

車輛管理

企業(yè)的所有車輛。


初始化數(shù)據(jù)

角色

這里寫圖片描述

用戶

這里寫圖片描述

車輛

這里寫圖片描述

步驟處理角色

這里寫圖片描述

流程

這里寫圖片描述

流程步驟

這里寫圖片描述

項(xiàng)目流程說(shuō)明演示

這里演示一個(gè)開(kāi)始->部門經(jīng)理審批->部門領(lǐng)導(dǎo)審批->結(jié)束的流程

提出申請(qǐng)

先填寫好信息,再點(diǎn)擊確定申請(qǐng),則開(kāi)始申請(qǐng),并往歷史流程和任務(wù)列表插入一條數(shù)據(jù)

這里寫圖片描述 點(diǎn)擊申請(qǐng) 這里寫圖片描述 插入兩條數(shù)據(jù) 這里寫圖片描述 這里寫圖片描述

自己項(xiàng)目中的代碼為:

/** * 選澤下一步審批人 */ @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");//項(xiàng)目ID //根據(jù)項(xiàng)目ID查詢項(xiàng)目基本信息 -> 找出這個(gè)項(xiàng)目使用的流程 -> 查看這個(gè)流程的第一步是那哪角色審批 //-> 查詢用戶中是這個(gè)角色的所有用戶供選擇 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; } /** * 提交申請(qǐng) * @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");//項(xiàng)目ID String USER_ID=pd.getString("USER_ID");//選澤的用戶ID //-------------往任務(wù)列表中插入一條數(shù)據(jù)-------------------- pd.put("ITEMID", APPLY_ID); //任務(wù)ID pd.put("ACTORID", '1'); //步驟ID: -1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("STATE", "審核流程進(jìn)行中"); //審核狀態(tài) PageData pds=applyService.findById(pd); pd.put("VERSION", pds.getString("SQLX")); //流程版本ID 也就是他的申請(qǐng)類型ID pd.put("NextUserID",USER_ID);//下一步審批者ID String TASKLIST_ID=this.get32UUID(); pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.save(pd); //-------------往歷史任務(wù)列表中插入一條數(shù)據(jù)-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當(dāng)前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務(wù)ID pd.put("ACTORID","0"); //步驟ID:-1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("MEMO", USERNAME+"提出申請(qǐng)"); //備注 pd.put("OperaTEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創(chuàng)建時(shí)間 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; }

部門經(jīng)理審批

有待審批任務(wù)的人點(diǎn)擊待我審批任務(wù)后就會(huì)列出來(lái) 這里寫圖片描述

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

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

部門領(lǐng)導(dǎo)審批

部門領(lǐng)導(dǎo)以及是這個(gè)審批流程中的最后一個(gè)審批 所以選擇車輛而不是下一步處理人 這里寫圖片描述 更新任務(wù)列表 這里寫圖片描述 插入歷史紀(jì)錄 這里寫圖片描述

審批代碼

部門經(jīng)理審批和部門領(lǐng)導(dǎo)審批的代碼都是一樣的,就算在新增其他流程代碼也是不需要修改的。

/** * 選擇下一步審批人,流程繼續(xù) */ @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");//項(xiàng)目ID //根據(jù)項(xiàng)目ID查詢項(xiàng)目基本信息 -> 找出這個(gè)項(xiàng)目使用的流程 -> 查看這個(gè)流程的第一步是那哪角色審批 //-> 查詢用戶中是這個(gè)角色的所有用戶供選擇 int nowCount=tasklistService.findNowCount(pd);//當(dāng)前步驟 int allCount=tasklistService.findCount(pd);//總的步驟 if(allCount==nowCount){//供頁(yè)面判斷是否是最后 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(); //如果當(dāng)前次數(shù)+1是最后一次,則進(jìn)入派車頁(yè)面// if(nowCount+1==tasklistService.findCount(pd)){// mv.setViewName("information/car/list");// mv.addObject("msg","tasklist/submitApplyresult");// mv.addObject("pd", pd);// }else {//否則進(jìn)入設(shè)置下一個(gè)審批者頁(yè)面 mv.setViewName("information/tasklist/tasklist_chooseUser"); mv.addObject("pd", pd); mv.addObject("userList",userList); mv.addObject("carList",carList); if(allCount==nowCount) {//供頁(yè)面判斷是最后 mv.addObject("msg","endtaskSubmitApplyresult");//同意 繼續(xù)下一步的角色選擇 }else { mv.addObject("msg","taskSubmitApplyresult");//最后一個(gè)派車同意 繼續(xù)下一步的角色選擇 } return mv; } /** * 同意派車,流程結(jié)束 * @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");//項(xiàng)目ID String Car_ID=pd.getString("Car_ID");//選澤的車輛ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當(dāng)前任務(wù)ID //-------------更新任務(wù)列表的下一個(gè)審批者和下一步的步驟ID-------------------- int nowCount=tasklistService.findNowCount(pd); int allCount=tasklistService.findCount(pd);// if(nowCount<allCount){ pd.put("ACTORID", -1); //步驟ID: -1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("STATE", "流程結(jié)束,請(qǐng)?zhí)崛≤囕v:"+Car_ID); //審核狀態(tài) pd.put("NextUserID","");//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd); //-------------往歷史任務(wù)列表中插入一條數(shù)據(jù)-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當(dāng)前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務(wù)ID pd.put("ACTORID",nowCount); //步驟ID:-1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("MEMO", USERNAME+"同意申請(qǐng),審核流程結(jié)束"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創(chuàng)建時(shí)間 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; } /** * 同意的審核,繼續(xù)下一個(gè)審批人選澤,流程繼續(xù) * @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");//項(xiàng)目ID String USER_ID=pd.getString("USER_ID");//選澤的用戶ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當(dāng)前任務(wù)ID //-------------更新任務(wù)列表的下一個(gè)審批者和下一步的步驟ID-------------------- int nowCount=tasklistService.findNowCount(pd); int allCount=tasklistService.findCount(pd);// if(nowCount<allCount){ pd.put("ACTORID", nowCount+1); //步驟ID: -1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("STATE", "審核流程進(jìn)行中"); //審核狀態(tài) pd.put("NextUserID",USER_ID);//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd);// }else {// pd.put("ACTORID", "-1"); //步驟ID: -1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái)// pd.put("STATE", "審核流程結(jié)束"); //審核狀態(tài)// pd.put("NextUserID","");//下一步審批者ID// pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID// tasklistService.edit(pd);// } //-------------往歷史任務(wù)列表中插入一條數(shù)據(jù)-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當(dāng)前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務(wù)ID pd.put("ACTORID",nowCount); //步驟ID:-1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("MEMO", USERNAME+"同意申請(qǐng)"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創(chuàng)建時(shí)間 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; } /** * 不同意的審核,流程結(jié)束 * @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");//項(xiàng)目ID String TASKLIST_ID=pd.getString("TASKLIST_ID");//當(dāng)前任務(wù)ID pd.put("ACTORID", "-1"); //步驟ID: -1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("STATE", "流程結(jié)束"); //審核狀態(tài) pd.put("NextUserID","");//下一步審批者ID pd.put("TASKLIST_ID",TASKLIST_ID ); //主鍵ID tasklistService.edit(pd); //-------------往歷史任務(wù)列表中插入一條數(shù)據(jù)-------------------- Subject currentUser = SecurityUtils.getSubject();//shiro管理的session Session session = currentUser.getSession(); String USERNAME = session.getAttribute(Const.SESSION_USERNAME).toString(); //獲取當(dāng)前登錄者loginname pd.put("ITEMID", APPLY_ID); //任務(wù)ID pd.put("ACTORID","-1"); //步驟ID:-1表示結(jié)束 其他則按照流程定義里的執(zhí)行順序來(lái) pd.put("MEMO", USERNAME+"不同意申請(qǐng)"); //備注 pd.put("OPERATEUSERID", USERNAME); //操作人 pd.put("CREATEDATE", DateUtil.getTime()); //操作創(chuàng)建時(shí)間 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; }
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新源县| 梓潼县| 托里县| 彭山县| 嵊州市| 汉源县| 苏尼特左旗| 郓城县| 德惠市| 二连浩特市| 蒲江县| 砀山县| 专栏| 桑植县| 辽阳县| 灌阳县| 武清区| 南丹县| 措勤县| 普格县| 达州市| 和平县| 龙里县| 永胜县| 大厂| 黎城县| 库尔勒市| 阿合奇县| 定结县| 曲靖市| 抚远县| 紫云| 磐石市| 岑溪市| 独山县| 随州市| 韶关市| 安塞县| 二连浩特市| 武安市| 绥芬河市|