前兩天我們已經完成了流程定義的管理和表單的定義的管理。今天們將整合這兩大模塊,使他們形成一個標準的工作流程。
?
?
?
?
???????? 在學習 OA 項目時,就像學習其他知識一樣跟著老師的思路走。有的時候東西講的比較多就一頭霧水,這是正常的。但最近我在寫學習總結時候發現老師講的東西很簡單,為什么我們會一頭霧水?原因一,我們用錯的學習方法。首先老師講的是什么他已經給了我們框架了,所以在老師講某個東西時我們要在自己的腦子里有一個宏觀的實現框架。然后再去聽細節,這樣老師無論怎么講我們都在自己的框架內。如果自己的框架錯了就改一下。原因二,我們畏懼新知識,未知領域是我們意象中的巨大敵人。這是錯誤的,我們應該像那樣,我們應該藐視敵人。
?
?
?
???????? 你知道嗎?我近兩天就使用這樣的方法,老師講什么我先在自己的腦子中有框架。然后十分藐視 OA 項目,我看它看得非常簡單。當老師講完某一應用時,我發現自己的框架和實現過程是完全正確的。我應該繼續保持和提升這樣的方法,加強以后的工作和學習效率。
?
?
?
???????? 只要我們用心去體會與發現身邊的事物,我們就可以從他們身上獲得更多的知識。我寫日志本想是能在文字和文章結構上有所提升,但現在提升的遠不只這些。清晰的思路,對知識點的掌握 … 。
?
?
?
???????? 今日的重點內容是將表單實例與流程實例整合運行,關于各申請信息的查詢在此就不做總結了。
?
?
?
一、 審批流轉 之起草申請
?
?
???????? 起草申請便是將所有添加的申請表單列出來,然后用戶選擇相應的申請表單并填寫,然后提交申請:
?
?
?
???????? 下面我們來看一下 ApprovalflowAction 的實現:
?
1. 起草申請
?
/** ? ? * 起草申請(表單定義列表) ? ? */ ? public ActionForward list(ActionMapping mapping, ActionForm form, ? ??????? HttpServletRequest request, HttpServletResponse response) ? ??????? throws Exception { ? ??? // 獲取表單定義列表 ? ??? List<FormDefinition> formDefinitionList = formDefinitionService ? ??? ??????? .findAll(); ? ??? request.setAttribute( "formDefinitionList" , formDefinitionList); ? ??? return mapping.findForward( "list" ); // list. jsp ? } ? ? ? ? ? ? ? ? ? ? ? ? ? |
?
?
???????? 有關 service 的實現,我就不列出來了,因為那十分簡單。
?
?
?
2. 申請頁面
?
???????? 我們應該如何顯示自定義表單?在“ FormDefinition ”實體中有一個“ templatePath ”屬性,我們在顯示頁面調用“ < jsp:include page = " ${formInstance.formDefinition.templatePath} " /> ”即可顯示相關表單。
?
/** ? ? * 申請頁面(填寫表單的頁面) ? ? */ ? public ActionForward applyUI(ActionMapping mapping, ActionForm form, ? ??????? HttpServletRequest request, HttpServletResponse response) ? ??????? throws Exception { ? ??? // 獲取表單定義 ID ? ??? Long id = Long. parseLong (request.getParameter( "formDefinitionId" )); ? ??? // 獲取表單文件路徑 ? ??? FormDefinition formDefinition = formDefinitionService .getById(id); ? ??? return new ActionForward (formDefinition.getTemplatePath()); ? } ? ? ? ? ? ? ? ? ? ? ? ? ? |
?
?
3. 提交申請
?
/** ? ? * 提交表單 ? ? */ ? public ActionForward apply(ActionMapping mapping, ActionForm form, ? ??????? HttpServletRequest request, HttpServletResponse response) ? ??????? throws Exception { ? ??? // 獲取表單定義 ? ??? Long formDefinitionId = Long. parseLong (request ? ??????????? .getParameter( "formDefinitionId" )); ? ??? FormDefinition formDefinition = formDefinitionService ? ??????????? .getById( formDefinitionId ); ? ??? // 獲取當前用戶 ? ??? User user = (User) request.getSession().getAttribute( "user" ); ? ??? // 創建表單實例 ? ??? FormInstance formInstance = new FormInstance(); ? ??? formInstance.setApplicant(user.getEmployee()); ? ??? formInstance.setApplyTime( new Date()); ? ??? formInstance.setFormDefinition(formDefinition); ? ? ? ??? // 保存表單數據 ? ??? for (String name : formDefinition.getFieldDefinitionList().keySet()) { ? ??????? String strValue = request.getParameter(name); ? ??????? Class valueType = formDefinition.getFieldDefinitionList().get(name); ? ??????? Converter converter = ConvertUtils. lookup (valueType); ? ??????? Serializable value = (Serializable) converter.convert(valueType, ? ??????????????? strValue); ? ??????? formInstance.getPropertyMap().put(name, value); ? ??? } ? ? ? ??? // 提交 ? ??? formInstanceService .submitFormInstance(formInstance); ? ??? // 轉到我的申請列表 ? ??? return mapping.findForward( "toMyApplicationList" ); ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
我們有必要,列出“ submitFormInstance ”方法的實現。提交申請后,我們需要將申請數據保存到數據庫中。并開啟流程,使流程開始流轉:
?
/** ? ? * 保存申請并開始流轉 ? ? */ ? public void submitFormInstance(FormInstance formInstance) { ? ??? // 保存表單數據 ? ??? getSession().save(formInstance); ? ??? //------------------ 開啟流程 --------------- ? ??? // 創建流程實例 ? ??? ProcessDefinition pd = getJbpmContext().getGraphSession().findLatestProcessDefinition( "leave" ); ? ??? ProcessInstance pi = pd.createProcessInstance(); ? ??? // 設置變量 ? ??? String applicantActorId = formInstance.getApplicant().getId().toString(); ? ??? // 第一個任務分配給(在這里是申請人) ? ??? pi.getContextInstance().setVariable( "applicantActorId" , applicantActorId); ? ??? // 申請的數據 ? ??? pi.getContextInstance().setVariable( "formInstance" , formInstance); ? ??? // 更新 FormInstance ? ??? // 標題格式: { 表單名稱 }_{ 申請人姓名 }_{ 申請日期 } ? ??? formInstance.setTitle(formInstance.getFormDefinition().getName() + "_" + formInstance.getApplicant().getName() + "_" // ? ??????????? + sdf .format(formInstance.getApplyTime())); ? ??? // 設置狀態為:正在流轉 ... ? ??? formInstance.setStatus(FormInstance. STATUS_PROCESSING ); ? ??? formInstance.setProcessInstanceId(pi.getId()); ? ??? // Signal ? ??? pi.signal(); ? ??? // 辦理任務:提交申請 ? ??? TaskInstance ti = (TaskInstance) pi.getTaskMgmtInstance() // ? ??????????? .getUnfinishedTasks(pi.getRootToken()) // ? ??????????? .iterator().next(); ? ??? ti.start(); ? ???? // 此處會自動將下一個任務觸發(保存到數據庫中) ? ??? ti.end(); ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
?
?
OK ,上面就完成了起草申請的整個過程!
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
