1. 程式人生 > >EOS學習系統---BPS工作流程

EOS學習系統---BPS工作流程

1、首先建立一個“報銷單審批的”流程,然後定義不同的url頁面和對應的邏輯流;

2、具體案例實現如下:

3、表單錄入頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" session="false" %>
<%@page import="com.eos.data.datacontext.UserObject" %>
	
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- 
  - Author(s): Administrator
  - Date: 2018-08-27 17:13:12
  - Description:
-->
<head>
<title>報銷單錄入</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <script src="<%= request.getContextPath() %>/common/nui/nui.js" type="text/javascript"></script>
    
</head>

 <%
  	UserObject userObject =(UserObject)request.getSession().getAttribute("userObject");
  	//通過頁面的workItemID獲取工作項詳細資訊workItem
  	Long workItemID = (Long)request.getAttribute("workItemID");
   %>
   
<body>
	<fieldset style="border:solid 1px #aaa;position:relative;margin:5px 2px 0px 2px;">
      <legend>
        操作員
      </legend>
      <div id="dataform1" style="padding-top:5px;">
        <!-- hidden域 -->
        <input class="nui-hidden" name="trainexpenseinfo.pid"/>
        <div class="nui-hidden" name="trainexpenseinfo.empid" value="<%=userObject.getUserId() %>"></div>
        <div class="nui-hidden" name="trainexpenseinfo.processinstid" ></div>
        <div class="nui-hidden" name="workItemID" id="workItemID"></div>
        <table style="width:100%;height:95%;table-layout:fixed;" class="nui-form-table">
          <tr>
            <td class="form_label">
              報銷單編號:
            </td>
            <td colspan="1">
              <input class="nui-textbox" name="trainexpenseinfo.expcode"/>
            </td>
        </tr>
          <tr>
            <td class="form_label">
             報銷人姓名:
            </td>
            <td colspan="1">
              <input class="nui-textbox" name="trainexpenseinfo.empname" value='<%=userObject.getUserName() %>'/>
            </td>
        </tr>
        <tr>
            <td class="form_label">
              報銷金額:
            </td>
            <td colspan="1">
              <input class="nui-textbox" name="trainexpenseinfo.expmoney"/>
            </td>
          </tr>
          <tr>
            <td class="form_label">
              報銷日期:
            </td>
            <td colspan="1">
              <input class="nui-datepicker" name="trainexpenseinfo.expdate"/>
            </td>
            <td class="form_label">
             是否是預算內專案:
            </td>
            <td colspan="1">
              <input class="nui-dictcombobox" dictTypeId="TRAIN_YESNO" name="trainexpenseinfo.isbugetitem"/>
            </td>
          </tr>
          
          <tr>
            <td class="form_label">
              部門經理:
            </td>
            <td colspan="1">
              <input id="manager" class="nui-textbox" name="trainexpenseinfo.manager" enabled="false"/>
            </td>
            <td class="form_label">
              部門經理意見:
            </td>
            <td colspan="1">
              <input class="nui-textarea" name="trainexpenseinfo.manageradvice" enabled="false"/>
            </td>
          </tr>
          <tr>
            <td class="form_label">
              財務經理:
            </td>
            <td colspan="1">
              <input id="auditor" class="nui-textbox" name="trainexpenseinfo.auditor" enabled="false"/>
            </td>
            <td class="form_label">
              財務經理意見:
            </td>
            <td colspan="1">
              <input class="nui-textarea" name="trainexpenseinfo.auditoradvice" enabled="false"/>
            </td>
          </tr>
        </table>
      </div>
    </fieldset>
	
	<div class="nui-toolbar" style="padding:0px;" borderStyle="border:0;">
        <table width="100%">
          <tr>
            <td style="text-align:center;" colspan="4">
              <a class="nui-button" iconCls="icon-save" onclick="onOk()">
                儲存
              </a>
              <span style="display:inline-block;width:25px;">
              </span>
              <a class="nui-button" iconCls="icon-save" onclick="onConfirm()">
                提交
              </a>
              <span style="display:inline-block;width:25px;">
              </span>
              <a class="nui-button" iconCls="icon-cancel" onclick="onCancel()">
                取消
              </a>
            </td>
          </tr>
        </table>
        
      </div>

	<script type="text/javascript">
    	nui.parse();
    	
    	var form = new nui.Form("#dataform1");
     	form.setChanged(false);
//debugger;
	    var workitemid = <%=workItemID %>;
	    if(workitemid !== null){
	    	loadData();
	    }
	    
	    function onConfirm(){
	    	confirmData();
	    }
	    
        function onOk(){
          saveData();
        }
        
        function setData(data){
          data = nui.clone(data);
          var json = nui.encode({trainexpenseinfo:data});
          $.ajax({
            url:"com.primeton.train.bps.expenseService.getExpense.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              obj = nui.decode(text);
              form.setData(obj);
              form.setChanged(false);
            }
            });
          }
        function loadData(){
          var form = new nui.Form("#dataform1");
          
          var json = nui.encode({workItemID:<%=workItemID %>});
         
          $.ajax({
            url:"com.primeton.train.bps.expenseService.getExpenseByWID.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              obj = nui.decode(text);
              form.setData(obj);
             
	  		nui.get("workItemID").setValue(<%=workItemID %>);
	  		
	  		var empid = nui.get("empid").getValue();
	  		if(empid == null || empid == undefined || empid == ""){
	  			nui.get("empid").setValue(<%=userObject.getUserId() %>);
	  			nui.get("expname").setValue("<%=userObject.getUserName() %>");
	  		} 
	  		
            }
            });
          }
		
        function confirmData(){
          form.validate();
          if(form.isValid()==false) return;

          var data = form.getData(false,true);
          var json = nui.encode(data);

          $.ajax({
            url:"com.primeton.train.bps.expenseService.confirmExpense.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              var returnJson = nui.decode(text);
              if(returnJson.exception == null){
                CloseWindow("saveSuccess");
              }else{
                nui.alert("儲存失敗", "系統提示", function(action){
                  if(action == "ok" || action == "close"){
                    //CloseWindow("saveFailed");
                  }
                  });
                }
              }
              });
            }
            
        function saveData(){
          form.validate();
          if(form.isValid()==false) return;
          
          var data = form.getData(false,true);
          var json = nui.encode(data);

          $.ajax({
            url:"com.primeton.train.bps.expenseService.updateExpense.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              var returnJson = nui.decode(text);
              if(returnJson.exception == null){
                CloseWindow("saveSuccess");
              }else{
                nui.alert("儲存失敗", "系統提示", function(action){
                  if(action == "ok" || action == "close"){
                    //CloseWindow("saveFailed");
                  }
                  });
                }
              }
              });
            }
            
            function onReset(){
              form.reset();
              form.setChanged(false);
            }

            function onCancel(){
              CloseWindow("cancel");
            }

            function CloseWindow(action){

              if(action=="close"){

                }else if(window.CloseOwnerWindow)
                return window.CloseOwnerWindow(action);
                else
                return window.close();
              }
    </script>
</body>
</html>

4、對應的邏輯流

獲取工作項明細:通過頁面傳入的workItemID,使用BPS API的構件queryWorkItemDetail4SDO查詢workitem工作項詳細資訊;
賦值:workitem查詢出來後,將其包含的processinstid賦值給業務表的processinstid,便於查詢業務表資訊;
獲取表單資訊:通過processinstid與業務表的關聯,可以查詢業務表資訊。

獲取報銷單編號:表單錄入成功後,點選提交,轉向下一活動“提交審批流程”,獲取報銷單編號是為了建立流程例項時,為流程名稱和描述起名賦值;在這一活動中存在一個流程是否啟動的判斷,通過業務表資料中的processinstid是否為null或empty來判斷流程是否啟動;
賦值流程例項描述和名稱:將expcode作為字尾,為建立的流程例項描述和名稱賦值;

建立流程例項:BPS API構件庫中的元件,是用來建立流程例項,需要傳入三個引數,分別是:流程例項名稱,流程例項描述,流程例項路徑(即要提交的流程全名),返回一個流程例項id;
賦值流程例項id:將建立好的流程例項id賦值給業務表中的processinstid,便於後期查詢業務表資料資訊;

空操作:一個過渡圖元,用來連線流程啟動後的下一活動。流程啟動後,通過流程例項id判斷業務表中是否存在該條資料記錄,存在,則走update的邏輯流,不存在,則走add的邏輯流;

構造相關資料:通過業務表單的資訊,賦值給流程活動中需要的相關資料(即條件資料);
設定相關資料:呼叫BPS API的相關構件setRelativeDataBatch(批量設定相關資料),引數是通過processinstid,設定relativeData;

啟動流程例項並完成第一個工作項:相關資料設定完成後,通過判斷workItemID是否為null或empty,判斷若流程未啟動,則呼叫startProcessInstAndFinishFirstWorkItem構件,入參為processinstid,事務操作設定為false,沒有其他的引數null;
流程已啟動直接完成工作項:相關資料設定完成後,若流程已啟動,則呼叫finishWorkItem構件,入參為workItemID,事務操作仍設定為false。

5、審批頁面

<div class="nui-toolbar" style="padding:0px;" borderStyle="border:0;">
        <table width="100%">
          <tr>
            <td style="text-align:center;" colspan="4">
              <a class="nui-button" iconCls="icon-save" onclick="onAgree()">
                同意
              </a>
              <span style="display:inline-block;width:25px;">
              </span>
              <a class="nui-button" iconCls="icon-save" onclick="unAgree()">
                不同意
              </a>
              <span style="display:inline-block;width:25px;">
              </span>
              <a class="nui-button" iconCls="icon-cancel" onclick="onCancel()">
                取消
              </a>
            </td>
          </tr>
        </table>
        
      </div>

	<script type="text/javascript">
    	nui.parse();
    	
    	var form = new nui.Form("#dataform1");
     	form.setChanged(false);

	    loadData();
	    function onAgree(){
	    	approvalData("1");
	    }
	    function unAgree(){
	    	approvalData("0");
	    }
	    
        function setData(data){
          data = nui.clone(data);
          var json = nui.encode({trainexpenseinfo:data});
          $.ajax({
            url:"com.primeton.train.bps.expenseService.getExpense.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              obj = nui.decode(text);
              form.setData(obj);
              form.setChanged(false);
            }
            });
          }
        function loadData(){
          var form = new nui.Form("#dataform1");
          
          var json = nui.encode({workItemID:<%=workItemID %>});
          $.ajax({
            url:"com.primeton.train.bps.expenseService.getExpenseByWID.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              obj = nui.decode(text);
              form.setData(obj);
             
	  		nui.get("workItemID").setValue(<%=workItemID %>);
	  		
	  		var empid = nui.get("empid").getValue();
	  		if(empid == null || empid == undefined || empid == ""){
	  			nui.get("empid").setValue(<%=userObject.getUserId() %>);
	  			nui.get("expname").setValue("<%=userObject.getUserRealName() %>");
	  		} 
	  		
            }
            });
          }
		
        function approvalData(dealResult){
	        var form = new nui.Form("#dataform1");
			form.setChanged(false);
			form.validate();
			if(form.isValid()==false) return;
			
			var data = form.getData();
			data.dealResult = dealResult;
			
			var json = nui.encode(data);
			
			$.ajax({
				url:"com.primeton.train.bps.expenseService.approvalExpense.biz.ext",
				type:'POST',
				data:json,
				cache:false,
				contentType:"text/json",
				success:function(text){
					var returnJson = nui.decode(text);
					if(returnJson.exception==null){
						CloseWindow("ok");
					}else{
						nui.alert("提交失敗","系統提示",function(action){
							if(action == "ok" || action == "close"){
								//CloseWindow("saveFailed");
							} 
						});
					}
				}
			});
        }
            
        function saveData(){
          form.validate();
          if(form.isValid()==false) return;
          
          var data = form.getData(false,true);
          var json = nui.encode(data);

          $.ajax({
            url:"com.primeton.train.bps.expenseService.updateExpense.biz.ext",
            type:'POST',
            data:json,
            cache:false,
            contentType:'text/json',
            success:function(text){
              var returnJson = nui.decode(text);
              if(returnJson.exception == null){
                CloseWindow("saveSuccess");
              }else{
                nui.alert("儲存失敗", "系統提示", function(action){
                  if(action == "ok" || action == "close"){
                    //CloseWindow("saveFailed");
                  }
                  });
                }
              }
              });
            }
            
            function onReset(){
              form.reset();
              form.setChanged(false);
            }

            function onCancel(){
              CloseWindow("cancel");
            }

            function CloseWindow(action){

              if(action=="close"){

                }else if(window.CloseOwnerWindow)
                return window.CloseOwnerWindow(action);
                else
                return window.close();
              }
    </script>
</body>
</html>

6、經理審批邏輯流

經理審批流程:
首先,需要將表單資訊查詢出來並展示,將業務表資訊賦值給頁面上對應的欄位,點選同意或不同意之後,重新獲取表單資訊,將頁面上需要傳遞的資訊賦值給業務表;
然後,呼叫更新邏輯流,僅更新被修改的內容;
設定相關資料:將所需要的條件資料進行設定完成後,呼叫finishWorkItem構件完成工作項。

7、財務審批邏輯流

財務審批流程:
首先,需要將表單資訊查詢出來並展示,將業務表資訊賦值給頁面上對應的欄位,點選記賬之後,重新獲取表單資訊,將頁面上需要傳遞的資訊賦值給業務表;
然後,呼叫更新邏輯流,僅更新被修改的內容;
完成工作項:由於財務審批流程是最後一項活動,沒有分支且只需要一個自動活動完成記賬狀態的修改即可,所以無需設定相關資料,直接呼叫finishWorkItem構件完成工作項。

對於最後一項活動設定為自動活動,即修改一個欄位的值,可以通過自動活動的“應用配置”tab頁進行設定。

相關推薦

EOS學習系統---BPS工作流程

1、首先建立一個“報銷單審批的”流程,然後定義不同的url頁面和對應的邏輯流; 2、具體案例實現如下: 3、表單錄入頁面: <%@ page language="java" contentType="text/html; charset=UTF-8" pag

七月演算法機器學習筆記6 -- 工作流程與模型優化

這套筆記是跟著七月演算法四月機器學習班的學習而記錄的,主要記一下我再學習機器學習的時候一些概念比較模糊的地方,具體課程參考七月演算法官網:http://www.julyedu.com/ 特徵工程總

一個簡單的時間片輪轉多道程序內核操作系統工作流程

gson star 高級 time author family num 個數 count 一.操作系統工作概述 存儲程序計算機工作模型,計算機系統最最基礎性的邏輯結構; 函數調用堆棧,高級語言得以執行的基礎; 中斷。多道程序操作系統的基點。 二.代

機器學習工作流程第一步:如何用Python做數據準備?

pandas 整數 情況 意思 編程練習 人工智能 簡單的 準備工作 標題 這篇的內容是一系列針對在Python中從零開始運用機器學習能力工作流的輔導第一部分,覆蓋了從小組開始的算法編程和其他相關工具。最終會成為一套手工制成的機器語言工作包。這次的內容會首先從數據準備開始。

RDIFramework.NET ━ .NET快速信息化系統開發框架 ━ 工作流程組件介紹

質量 可定制 soa 發包 三方 種類 control eight 統計 RDIFramework.NET ━ .NET快速信息化系統開發框架 工作流程組件介紹 RDIFramework.net,基於.NET的快速信息化系統開發、整合框架,給用戶和開發者最佳的.Net框架

簡述計算機從加電到啟動系統時主板的工作流程

主板工作流程加電自檢-->BIOS信息-->顯卡的參數-->CPU的參數-->內存的參數-->硬盤的參數-->光驅的參數-->顯示PCI等主板的其他的I/O等參數-->RAID卡信息(如果有)-->BIOS將更新ESCD最後給出(Verifying DMI

機器學習(二)工作流程與模型調優

發生 較高的 mode lan 包含 因此 增加 絕對值 輸入 上一講中主要描述了機器學習特征工程的基本流程,其內容在這裏:機器學習(一)特征工程的基本流程 本次主要說明如下:   1)數據處理:此部分已經在上一節中詳細討論   2)特征工程:此部分已經在上一節中詳細討論

區塊鏈系統的一般工作流程

通過 增加 商務 一份 資產 一個 能力 獨立 網絡 區塊鏈系統有很多種,第一個應用區塊鏈技術的軟件就是比特幣,事實上區塊鏈的概念就是比特幣帶出來的。到現在為止,已經出現了相當多的基於區塊鏈技術的衍生系統,比如閃電網絡、公證通、以太坊、超級賬本項目等。每一類系統都有自己的特

操作系統工作流程

圖片 time_c 堆棧 store memcpy 封裝 intern 時間片輪轉 基礎上 計算機有三個關鍵性機制:存儲程序計算機,堆棧機制和中斷機制 第一章中已經重點學習了存儲程序的計算機,接下來我們重點學習堆棧機制和中斷機制。 堆棧機制 堆棧機制是高級語言可以實現的基礎

三大框架(ssh)學習——Struts2工作流程分析

Struts2工作流程分析   STRUTS2框架內部流程 1. 客戶端傳送請求的tomcat伺服器。伺服器接受,將HttpServletRequest傳進來。 2. 請求經過一系列過濾器(如:ActionContextCleanUp、SimeMesh等) 3. Fil

View工作流程-相關學習

學習筆記 一、Android的UI層級繪製體系 Android中的Activity是作為應用程式的載體存在的,它代表一個完整的使用者介面並提供了視窗進行檢視繪製。 在這裡,我們這裡所說的檢視繪製,實質上就是在對View及其子類進行操作。而View作為檢視控制元件的頂層父類,在本文中會對其進行詳細分

EOS學習之路004--EOS的賬戶系統

比特幣和以太坊只有私鑰和地址的概念,而EOS賬戶可以是使用者自定義的字串[12個],但是EOS的賬戶需要付費才能建立,不像比特幣、ETH, EOS賬戶的功能: 1.每個賬戶可以傳送結構化的訊息給任意其他賬戶 2.每個賬戶可以定義處理訊息的指令碼 3.訊息處理指令碼也可以給其

SpringMVC的學習(八)——SpringMVC的工作流程及相關配置

一、SpringMVC詳細介紹 Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動型別的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發,Spring Web MVC

暢捷通T3、T6伺服器系統環境重灌工作流程

暢捷通T3、T6伺服器系統環境重灌工作流程1.檢視伺服器具體配置和型號,以便於配備系統安裝盤和驅動程式。2.確認SQL資料庫版本和補丁資訊;檢查用友原有自動備份的檔案是否存在;3.進入系統,用電腦管家查殺一下病毒,如果有病毒 拍圖留存上傳工作日報,同時發給客戶,提示做好二次資料的二次備份。 完畢後記錄

暢捷通T3、T6服務器系統環境重裝工作流程

附加 復制 star 查詢 管家 特殊 服務器 p地址 次數 暢捷通T3、T6服務器系統環境重裝工作流程1.查看服務器具體配置和型號,以便於配備系統安裝盤和驅動程序。2.確認SQL數據庫版本和補丁信息;檢查用友原有自動備份的文件是否存在;3.進入系統,用電腦管家查殺一下病毒

RDIFramework.NET ━ .NET快速資訊化系統開發框架 ━ 工作流程元件介紹

RDIFramework.NET ━ .NET快速資訊化系統開發框架 工作流程元件介紹 RDIFramework.NET,基於.NET的快速資訊化系統開發、整合框架,給使用者和開發者最佳的.Net框架部署方案。 1、RDIFramework.NET框架介紹   RDIFramework.NET,基於.

RDIFramework.NET ━ .NET快速資訊化系統開發框架 ━ 工作流程元件Web業務平臺

RDIFramework.NET ━ .NET快速資訊化系統開發框架  工作流程元件Web業務平臺 接前兩篇: 1、RDIFramework.NET 工作流程元件介紹   RDIFramework.NET框架V2.8以下版本不包含工作流程元件,在實際使用過程中,很多客戶提出了讓我們在框架

RDIFramework.NET ━ .NET快速資訊化系統開發框架 ━ 工作流程元件WinForm業務平臺

RDIFramework.NET ━ .NET快速資訊化系統開發框架 工作流程元件WinForm業務平臺    接上篇: 1、RDIFramework.NET 工作流程元件介紹   RDIFramework.NET框架V2.8以下版本不包含工作流程元件,在實際使用過程中,很多客戶提出了讓我

Struts2學習之1(Struts2的工作流程,動作類的編寫,struts.xml配置檔案的編寫)

Struts2的開始 Struts2的作用 現在專案一般都是按照三層架構來開發的,表現層,業務邏輯層,資料訪問層,Struts2就是用來代替servlet處理表現層的一種框架,用來處理頁面的請求跳轉與資料顯示等,Struts2裡面還是用servlet來實

Scrapy框架的學習(1.scrapy的概念以及scrapy的工作流程)

 scrapy的概念 1.為什麼要學習Scrapy?      因為會讓我們的爬蟲更快、更強 2.什麼是scrapy?      (1) Scrapy是一個為了爬取網站資料,提