顯示具有 AgentFlow 標籤的文章。 顯示所有文章
顯示具有 AgentFlow 標籤的文章。 顯示所有文章

2021-01-26

[AF] 查詢流程分類SQL

SELECT AMC.SiblingOrder,M.SiblingOrder,
       AMC.Name 流程分類名稱,
       CASE 
         WHEN SUBSTRING(ISNULL(Pro.ProID,AP.FreID),1,3) = 'PRO' THEN '流程'
         WHEN SUBSTRING(ISNULL(Pro.ProID,AP.FreID),1,3) = 'FAP' THEN '應用'
       END 類別,
       ISNULL(Pro.ProID,AP.FreID) 流程或表單編號, 
       ISNULL(Pro.Name,AP.Name) 流程或表單名稱
FROM AF_ProcessMap M
LEFT JOIN Pro_GenInf Pro ON M.ID = Pro.ProID
LEFT JOIN Freqap AP ON M.Id = AP.FreID
LEFT JOIN AF_ProcessMapCategory AMC ON M.ParentId = AMC.Id
where 1=1
–AND AMC.Name = 'XIN'
ORDER BY CAST(AMC.SiblingOrder AS INT) ASC,CAST(M.SiblingOrder AS INT) ASC

2021-01-21

[AgentFlow]目前流程內容與狀態SQL

建議開發表單時先將RootID先帶入表單,不然要抓資料就很麻煩
WITH A AS (
    SELECT DISTINCT TK.RootID,
           A.ITEM15  ,
           A.ITEM16 ,
           A.ITEM4 ,
           A.ITEM6 ,
           A.ITEM8 ,
           A.ITEM10 
      FROM TASK TK
      LEFT JOIN ART05801584407735351_Log B ON TK.TskID = B.TskID
      LEFT JOIN ART05801584407735351_Ins A ON B.InsID = A.InsID
     WHERE 1=1 AND A.ITEM15 <>'')
SELECT  A.ITEM15 聯單編號 ,
        A.ITEM16 申請日期,
        A.ITEM4 機關名稱,
        A.ITEM6 申請人,
        A.ITEM8 申請人EMAIL,
        A.ITEM10 申請人連絡電話,
        TK.State,
        CASE TK.State
          WHEN 'complete' THEN '結案'
          WHEN 'running' THEN '執行中'
        END 案件狀態
FROM A
LEFT JOIN Task TK ON A.ROOTID = TK.RootID
WHERE TK.TYPE = 'root'

2020-09-08

[AgentFlow]常見的效能調教

 版本 : AF3.7

設定檔 : PASE / applicationctx-cache.xml

為改善在不同的transaction工作中,因為存取到同一個cache 物件而造成cache lock互等的情況,AF3.7設計了一個存放cache queue pool的方式,將判斷到符合設定檔中定義的相關cache 物件,在update cache後就先放到pool中等transaction執行完成後再以另外的thread 慢慢消化更新pool 中存放的cache,好讓transaction可以繼續往下執行而不用等同一個cache lock release 後才能執行後續動作。但如果在流程Action 的Script 中有利用API 大量存取設定檔中定義的相關cache 物件,例如定時組織同步的流程,可能因為同時存取的cache 數量超過預設的queue pool size 而造成transaction停住而發生transaction time out 的情況,可以依需求自行調整PASE / applicationctx-cache.xml 設定檔中 queue pool size的大小,如下紅字:

< constructor-arg >
< value >1000 < /value >
< /constructor-arg >

備註 :
預設為1000,假設組織同步可能會更新組織相關物件,例如部門、職務、人員等,加總數量約10000,建議可調整為 12000 ~ 15000,約1.2 ~ 1.5 倍,但調大會佔用更多記憶體,所以要確保PASE設定的記憶體MAX數值是足夠的。


==============================================================================================================================

問題:為何我們上線AF效能出現異常問題 是遇到多位user再做查詢報表,
效能loading變慢,是不是有什麼要調整或者注意什麼事情?
回覆:

根據您提供 PASE Server log 附件檔案內容顯示,我們發現其主要原因說明如下:
1. 附件log內容顯示 出現了一大堆 [TDS Driver]Read timed out 訊息,
PASE Server 系統預設 sql server response time is 30s。
2. 請客戶檢查一下資料庫或網路是否正常,且資料庫儘可能的只服務PASE server。
3.請貴公司 MS-SQL Server 2000 系統 DBA針對執行較慢的sql 指令當中加入index,可加速PASE效能。 建議 index table 整理說明如下:
請在AF 資料庫資料庫加入index
CREATE INDEX IX_Tsk_E_S ON Task(ExeID,State)
CREATE INDEX IX_TskExeID ON Task(ExeID)
CREATE INDEX IX_TskParentID ON Task(ParentID)
CREATE INDEX IX_TskRootID ON Task(RootID)
CREATE INDEX IX_TskMemID ON Task(MemID)
CREATE INDEX IX_TskState ON Task(State)
CREATE INDEX IX_TskType ON Task(Type)
CREATE INDEX IX_TskKeyWord ON Task(KeyWord)
CREATE INDEX IX_Tsk_E_S_T ON Task(ExeID,State,Type)
CREATE INDEX IX_Tsk_R_S_M_E_T ON Task(RootID,State,MemID,ExeID,Type)

Other CREATE INDEX Field column by (INSID) for every Artifate Form(under project) such as :

ARTXXX_INS / ARTXXX_LOG ….etc .

For example :

1.CREATE INDEX IX_Tsk_E_S ON ARTXXX_INS (INSID);
2.CREATE INDEX IX_Tsk_E_S ON ARTXXX_LOG (INSID);

Some detail description by the following items :

ART123456789012_Form 表單元件屬性
ART123456789012_Ins 表單目前所存資料
ART123456789012_Log 表單各關當時資料
ART123456789012Item52 表單內table元件目前所存資料
ART123456789012Item52Log 表單內table件各關卡當時資料
所以我們設計之專案範例本身e-Form 就有Table 元件。


==============================================================================================================================

您好,
於 AF37 若 PASE log 中出現以下訊息, 表示 PASE 與資料庫的存取連線執行時間過久.
transaction timeout rollback :
Transaction has been marked as rollback-only: com.atomikos.spring.jdbc.tm0036200124
at com.flowring.cache.interceptor.caching.AbstractUpdatingInterceptor.invoke(AbstractUpdatingInterceptor.java:46)

這方面可以去調整
PASE\applicationctx-transaction.xml
bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService">
property name="transactionTimeout" value="預設180秒,這邊可加大"/

與調整
PASE\jta.properties
# Set the max timeout (in milliseconds) for local transactions
com.atomikos.icatch.max_timeout=預設300秒,這邊可加大

來延長連線時間, 不至於出現此訊息.
需注意的是, 存取連線的時間不可無限制延長,
需考慮資料庫本身的負荷等狀況來調整.

==============================================================================================================================
如果不是 Script 問題,那請問這段 Log 上面是否還有其他訊息?
如果沒有,也請您將 PASE\log4j.properties 的 log4j.category.pase.server 改為 DEBUG,例如:
log4j.category.pase.server=DEBUG
之後再重新手動啟動這筆流程,並將 Log 提供給客服,我們會盡快替您查看問題。

==============================================================================================================================

1. 當 PASE\build.xml 設定 maxmemory="128m"
以下 SQL 執行約 4.6 秒
2. 當 PASE\build.xml 設定 maxmemory="512m"
以下 SQL 執行約 1 秒
==============================================================================================================================
1.在 PASE 的設定內,將取消記憶體暫存功能打勾即可。
2.建議在正式機上不要將記憶體暫存取消。
3.WebAgenda 的 偵錯模式 請設定為 Developer,這樣才不會Web 端 Cache 住表單。

==============================================================================================================================
請編輯PDE\Cliient.bat與PDE\Server.bat 檔案最大記憶體。

%JAVAEXE% -Xms256m -Xmx512m -Dpde.debug=false pde.PDE %1
%JAVAEXE% -Dserver.debug=true -Xms1024m -Xmx2048m login.PDEServer

==============================================================================================================================
您好,
於 AF37 若 PASE log 中出現以下訊息, 表示 PASE 與資料庫的存取連線執行時間過久.
transaction timeout rollback :
Transaction has been marked as rollback-only: com.atomikos.spring.jdbc.tm0036200124
at com.flowring.cache.interceptor.caching.AbstractUpdatingInterceptor.invoke(AbstractUpdatingInterceptor.java:46)

這方面可以去調整
PASE\applicationctx-transaction.xml
bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService">
property name="transactionTimeout" value="預設180秒,這邊可加大"/

與調整
PASE\jta.properties
# Set the max timeout (in milliseconds) for local transactions
com.atomikos.icatch.max_timeout=預設300秒,這邊可加大

來延長連線時間, 不至於出現此訊息.
需注意的是, 存取連線的時間不可無限制延長,
需考慮資料庫本身的負荷等狀況來調整.

2020-08-05

[AgentFlow]資料夾建立方式

 通常會建立捷徑,但是因應LoadBalence需要另外一種建立方式

先MEMO紀錄一下

 

mklink /d D:\Agentflow\apache-tomcat-8.0.52\webapps\WebAgenda\SIBH \\172.25.190.129\Flow\flowFileServer\SIBH

2020-07-28

[AgentFlow]設定Table元件欄位隱藏

 //隱藏欄位 

var csTab = Form.getComponent("Table2"); 

var vecCS = csTab.getColumnNodeVector(); 

var hidNodeCS = [vecCS.get( 6 )]; 

csTab.setColHiding(hidNodeCS); 

//取消隱藏 

var hidNodeCS = []; csTab.setColHiding(hidNodeCS);

[AgentFlow]呼叫WebService卻無值

 需要在第一關的前置動作放入以下程式

當呼叫WebService後,二維陣列args是放到global

var ati = MyTask.getArtInstance();
var rootID = MyTask.getRootID();
var ght = Server.getGlobals(rootID);
try{
if (ght.size()>0){

   var vc1 = ght.get("txtMapName");
   var vc2 = ght.get("txtMapID");
   var vc3 = ght.get("txtNote");
  
   ati.setAppValue("txtMapName",ght.get("txtMapName"));  
   ati.setAppValue("txtMapID",ght.get("txtMapIDson"));
   ati.setAppValue("txtNote",ght.get("txtNote"));
  
   Server.addInfoLog(" 開啟參數 =" + vc1);
   Server.addInfoLog(" 開啟參數 =" + vc2);
   Server.addInfoLog(" 開啟參數 =" + vc3);
  
}
}catch (err){
    Server.addInfoLog("開啟參數 Err log=" + err);
}  
Server.deleteGlobals(rootID);

2020-06-30

[AgentFlow]母子表單傳值無動作

 var parentForm = Form.getParentForm(); //抓取母表單物件

if(parentForm != null){
var sSerialNo = parentForm.getValue("txtSerialNo");
var t1 = parentForm.getComponent("Table1");  
t1.clear();
var subFormID = "ART00281300671728569";    
var sqlLoad = Client.SQLloadValue("SELECT * FROM " + subFormID + "_INS WHERE ITEM14 = '" +sSerialNo+"' ORDER BY ITEM26" );
for (var j=0; jvar dataList = sqlLoad.get(j);
t1.setValueAt(dataList.get("ITEM14"), j, 0);   
t1.setValueAt(dataList.get("ITEM9"), j, 1);
t1.setValueAt(dataList.get("ITEM26"), j, 2);   
t1.setValueAt(dataList.get("ITEM5"), j, 3);   
t1.setValueAt(dataList.get("ITEM8"), j, 4);
}
t1.setModifyingRowIndex(-1);  
Client.addExeLog("Refresh parentForm ..........>>>" );  
}else{
Client.addExeLog("單號:" + txtSerialNo +"------->NoDataFound!!");      
};

 

 

 

重點要加上  Form.setRefreshParentForm(true); 

母表單才會有動作

2020-06-23

[AgentFlow]工作已損毀導致代辦工作有誤

–先備份一下

SELECT * INTO TASK_20200623 FROM TASK

 

–查詢屬於已被刪除流程工作的 Task

SELECT TskID, ProID FROM Task WHERE

( (ProID NOT IN (SELECT ProID FROM Pro_GenInf ) AND ProID LIKE 'PRO%') OR

(ProID NOT IN (SELECT ProID FROM Iap_GenInf ) AND ProID LIKE 'IAP%')OR

(ProID NOT IN (SELECT SignID FROM Sign_GenInf ) AND ProID LIKE 'SGN%') )

AND State<>'complete'

AND State<>'dead'

 

–將這些工作狀態都改成 dead 待辦就不會出現警告(修改前請先備份)

UPDATE Task SET STATE = 'dead' WHERE

( (ProID NOT IN (SELECT ProID FROM Pro_GenInf ) AND ProID LIKE 'PRO%') OR

(ProID NOT IN (SELECT ProID FROM Iap_GenInf ) AND ProID LIKE 'IAP%')OR

(ProID NOT IN (SELECT SignID FROM Sign_GenInf ) AND ProID LIKE 'SGN%') )

AND State<>'complete'

AND State<>'dead'

2020-05-23

[AgentFlow]部門組織查詢(遞迴查詢),由上而下或由下而上

--某部門從某部門往上找所有部門
DECLARE @DEPIDUP VARCHAR(20)
DECLARE @NUM INT
SET @DEPIDUP = 'DEP00061590139401173'
SET @NUM = 0
;
WITH DEPUP AS(
    SELECT DEPID , PARENTID , 0 LEVEL FROM Dep_GenInf WHERE 1=1  AND DepID = @DEPIDUP
    UNION ALL
    SELECT B.DEPID , B.PARENTID , @NUM +1 LEVEL  FROM  DEPUP A , Dep_GenInf B WHERE A.PARENTID = B.DepID
)
SELECT DUP.DepID , RG.RolID , RG.Name , MG.MemID , MG.UserName
  FROM DEPUP DUP
  LEFT JOIN Rol_GenInf RG ON DUP.DepID = RG.DepID
  LEFT JOIN Mem_GenInf MG ON RG.RolID = MG.MainRoleID


--某部門從某部門往下找所有部門
DECLARE @DEPIDDOWN VARCHAR(20)
SET @DEPIDDOWN = 'DEP00041590139241137'
;
WITH DEPDOWN AS(
    SELECT DEPID , PARENTID   FROM Dep_GenInf WHERE 1=1 AND DepID = @DEPIDDOWN --AND ParentID = 'company'
    UNION ALL
    SELECT B.DEPID , B.PARENTID FROM DEPDOWN A , Dep_GenInf B WHERE A.DepID = B.PARENTID
)
SELECT DUD.DepID , RG.RolID , RG.Name , MG.MemID , MG.UserName
  FROM DEPDOWN DUD
  LEFT JOIN Rol_GenInf RG ON DUD.DepID = RG.DepID
  LEFT JOIN Mem_GenInf MG ON RG.RolID = MG.MainRoleID

2020-05-13

[AgentFlow]套用Bootstrap框架

AF套用Bootstrap,找時間研究一下
Bootstrap 檔案位置 /WebAgenda/ext/css/bootstrap.min.css
——-放HTML共用函式————-
function switchPanel(targetId, idArray) {
 var targetEl = jQuery('#' + targetId);
 var objHeight = targetEl.height();
 var moveToTop = 300;
 var currentHeight = objHeight + moveToTop + 400;
 
 targetEl.show();
 
 jQuery.each( idArray, function( index, value ) {
  if ( value != targetId ) jQuery('#' + value ).hide();
 
 })
 targetEl.css('top', moveToTop);
 targetEl.css('visibility', 'visible');
 jQuery('#ITEM1').animate({'height':currentHeight}, 'fast');
 jQuery(parent.document.getElementById('artifact')).animate({'height':currentHeight}, 'fast');

 //reFixTableHeader
 jQuery('iframe[src*=”table”]').each(function() {
      this.contentWindow.reFixTableHeader()
    }
  )
}

//btnPanel 換顏色
function swicthPanelBtnColor(btnID, btnArray){
    document.getElementById(btnID).classList.add("btnPanel", "btnPanel_navyBlue");
    
    for(var i = 0; i< btnArray.length; i++){
      document.getElementById(btnArray[i]).classList.remove("btnPanel_navyBlue");
    }
}
——-放HTML共用函式————-

——-放表單HTML事件onLoad————
var link = document.createElement('link');
link.type = 'text/css';
link.rel = 'stylesheet';
link.href = '/WebAgenda/ext/css/bootstrap.min.css';
document.getElementsByTagName("head")[0].appendChild(link);
document.getElementsByTagName("body")[0].appendChild(link);

var link2 = document.createElement('link');
link2.type = 'text/css';
link2.rel = 'stylesheet';
link2.href = '/WebAgenda/ext/css/reset.css';
document.getElementsByTagName("head")[0].appendChild(link2);
document.getElementsByTagName("body")[0].appendChild(link2);

var link3 = document.createElement('link');
link3.type = 'text/css';
link3.rel = 'stylesheet';
link3.href = '/WebAgenda/ext/css/form-page.css';
document.getElementsByTagName("head")[0].appendChild(link3);
document.getElementsByTagName("body")[0].appendChild(link3);

//設定button_green
var btn_greenArr = [‘ITEM8’];
var classArray = [“btn”, “btn-info”];
addClass(btn_greenArr, classArray);

//設定button_org
var btn_orange = [‘ITEM17’];
var classArray = [“btn”, “btn-org”];
addClass(btn_orange, classArray);

//設定button_gray
var btn_gray = [‘ITEM18’];
var classArray = [“btn”, “btn-gray”];
addClass(btn_gray, classArray);

 

//設定textField
var txt_Arr = [‘ITEM19′,’ITEM3′,’ITEM6’,];
var classArray = [“form-control”];
addClass(txt_Arr, classArray);

//設定comboBox
var cboArray = [‘ITEM21’, ‘ITEM54’, ‘ITEM55’];
var classArray = [“form-control”, “form-control-w”];
addClass(cboArray, classArray);

//設定panel
//var panelArray = [‘ITEM82’, ‘ITEM83’, ‘ITEM84’, ‘ITEM398’, ‘ITEM431’, ‘ITEM442’];
//var classArray = [“btnPanel”, “btnPanel_blue”];
//addClass(panelArray, classArray);

////設定comboBox
//var cboArray = [‘ITEM21’, ‘ITEM44’, ‘ITEM125’, ‘ITEM110’, ‘ITEM111’, ‘ITEM113’, ‘ITEM114’, ‘ITEM117’, ‘ITEM118’, ‘ITEM124’];
//var classArray = [“form-control”, “form-control-w”];
//addClass(cboArray, classArray);
//
////設定button_green
//var btn_greenArr = [‘ITEM8’, ‘ITEM131’, ‘ITEM132’];
//var classArray = [“btn”, “btn-green”];
//addClass(btn_greenArr, classArray);
//
////設定button_org
//var btn_orange = [‘ITEM127’];
//var classArray = [“btn”, “btn-org”];
//addClass(btn_orange, classArray);
//
////設定button_gray
//var btn_gray = [‘ITEM129’, ‘ITEM130’, ‘ITEM134’];
//var classArray = [“btn”, “btn-gray”];
//addClass(btn_gray, classArray);
//
////設定textField
//var txt_Arr = [‘ITEM3’];
//var classArray = [“form-control”];
//addClass(txt_Arr, classArray);
//
////設定textArea
//var txtArea_Arr = [‘ITEM71’];
//var classArray = [“form-control-Area”];
//addClass(txtArea_Arr, classArray);


function addClass(objArray, clsArray){
    for(var i = 0; i

[AgentFlow]呼叫WebService

// targetAddr 放 AgentflowWebServices 或者其他 WebServices 的 service URL
var targetAddr = "http://127.0.0.1:8080/WebAgenda/webservice/AgentflowWeb.jws";

// 傳回 mems 是 JavaScript Array, 不是 Vector
var mems = WS_getAllMember();
for(var i=0; i&lt;=10; i++){
var msgList = Form.getDataInvalidMsgList();
msgList.add("User " +  i + ": " + mems[i][2] );
Form.setDataInvalidMsgList(msgList);
}

// 傳回 memRet 是 JavaScript Array, 不是 Vector
var memRet = WS_getMember("MEM20021561425789980");
for(var i=0; i&lt;=10; i++){
var msgList = Form.getDataInvalidMsgList();
msgList.add("UserField " +  i + " = " + memRet[i] );
Form.setDataInvalidMsgList(msgList);
}

// 這是重點,直接用 WebServices 基本 library,來呼叫 WebServices
function WSCall(url, mname, args)
{
var ep = new Packages.java.net.URL(url);
var svc =  new Packages.org.apache.axis.client.Service();
var call = svc.createCall();
var ns = "http://schemas.xmlsoap.org/soap/encoding/";
var qname =  new Packages.javax.xml.namespace.QName(ns, mname);
call.setTargetEndpointAddress(ep);
call.setOperationName(qname)
return call.invoke(args);
}

//呼叫看看,這是不傳入參數的例子
function WS_getAllMember()
{
var args = new Array();
var ret = WSCall(targetAddr, "getAllMember", args );
return ret;
}

function WS_getMember(uid)
{
var args = new Array();
args[0] = uid;
var ret = WSCall( targetAddr, "getMember", args );
return ret;
}

2020-04-30

[AgentFlow]常見問題整理

AF多列編輯框固定大小 在 onload 新增以下 script jQuery(document.DynamicForm).find('textarea').css('resize', 'none'); 或 $("textarea").css("resize","none");

2020-04-27

[Java]加解密

應用於AgentFlow

package ext;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES {
    private static SecretKeySpec secretKey;
    private static byte[] key;

    public static void setKey(String myKey) {
        MessageDigest sha = null;
        try {
            key = myKey.getBytes("UTF-8");
            sha = MessageDigest.getInstance("SHA-1");
            key = sha.digest(key);
            key = Arrays.copyOf(key, 16);
            secretKey = new SecretKeySpec(key, "AES");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static String encrypt(String strToEncrypt, String secret) {
        try {
            setKey(secret);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
        } catch (Exception e) {
            System.out.println("Error while encrypting: " + e.toString());
        }
        return null;
    }

    public static String decrypt(String strToDecrypt, String secret) {
        try {
            setKey(secret);
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
        } catch (Exception e) {
            System.out.println("Error while decrypting: " + e.toString());
        }
        return null;
    }
    /*
    public static void main(String[] args) {
        final String secretKey = "Taipei";

        String originalString = "test@sdfasdf";
        String encryptedString = AES.encrypt(originalString, secretKey);
        String decryptedString = AES.decrypt(encryptedString, secretKey);

        System.out.println(originalString);
        System.out.println(encryptedString);
        System.out.println(decryptedString);
    }
    */
}

2020-04-22

[AgentFlow]HttpURLConnection GET and POST

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Customize {
public String sendGET(String url) throws Exception {
URL obj = new URL(url);

HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("GET");

int responseCode = con.getResponseCode();

if (responseCode &lt;= 209) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream(), "UTF-8"));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in .readLine()) != null)
response.append(inputLine);

in .close();

//return response.toString();
String token = "";
String arr[] = response.toString().split(",");
for (int i = 0; i &lt; arr.length; i++) {
if (arr[i].indexOf("\"Token\"") &gt; -1) {
String kvArr[] = arr[i].split(":"); // "Token":"0x4fb0..."
token = kvArr[1]; // "0x4fb0..."
token = token.substring(1, token.length() - 1); // 去雙引號
break;
}
}
return token;
} else {
return "error" + responseCode;
}
}

public String sendPOSTAll(String url, String jsonStr) throws Exception {
URL obj = new URL(url);
//System.out.println(jsonStr);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json");

DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.write(jsonStr.toString().getBytes("UTF-8"));
wr.flush();
wr.close();

int responseCode = con.getResponseCode();

if (responseCode &lt;= 209) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream(), "UTF-8"));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in .readLine()) != null)
response.append(inputLine);

in .close();

return response.toString();
} else {
return "sendPOSTAllerror:" + responseCode + con.getResponseMessage();
}
}
}



import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.Files;
import java.util.concurrent.TimeUnit;
import java.awt.Desktop;
import java.net.URI;
public class Customize{
public String sendPost(String userName,String personalID,String phone) throws Exception {
String url = "http://127.0.0.1:3390/mine";
URL obj = new URL(url);

HttpURLConnection con = (HttpURLConnection) obj.openConnection();

//add reuqest header
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json");
//con.setRequestProperty("Authorization", "Basic VENHRGlnaXRhbEZvcm06VGFpcGVpMTIzNA==");

String query = "{" +
"\"Username\": \""+ userName +"\"," +
"\"Dept\": \""+ personalID +"\"," +
"\"Email\": \""+ phone +"\"" +
"}";

DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.write(query.toString().getBytes("UTF-8"));
wr.flush();
wr.close();

int responseCode = con.getResponseCode();
//return Integer.toString(responseCode) +&nbsp; url + "-v4-" + query ;
if(responseCode &lt;= 209){
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream(),"UTF-8"));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null)
response.append(inputLine);

in.close();

return response.toString();
}
else{
return "error";
}
}
}

[AgentFlow]客製位置

 


AF Java檔案位置
=============================================================
//檔案名稱:HelloWorld.java
package ext;
public class HelloWorld{
    public String getMessage(String userName){
        return "Hello World!!" + userName;
    }
}

=============================================================
//表單客製
檔案位置:apache-tomcat-8.0.35\webapps\WebAgenda\WEB-INF\classes\ext
{ALL:
    var helloOb = new Packages.ext.HelloWorld();
    var helloMessage = helloOb.getMessage("Chen");
}

=============================================================
//流程客製
檔案位置:PASE\ext
var helloOb = new Packages.ext.HelloWorld();
var helloMessage = helloOb.getMessage("Chen");

2020-04-21

[AgentFlow]Clear Cache

有天Pase Server忽然變成背景模式,清除方式如下

開啟Command並切換到Pase目錄

D:\Agentflow\PASE> ServerCTL.bat localhost 1099

輸入帳號、密碼

Server:>
command:
restart   restart server //重新啟動FlowServer
shutdown shutdown server //關閉FlowServer
status show server current status //察看FlowServer目前狀態
clearcache clear server cache //執行FlowServer清除暫存Cache機制
clearartcache clear server artiface cache
clearprocesscache clear server process cache
clearorgcache clear server entire orginization cache or assigned orginization ID
(ex. 'clearorgcache COM600021334789' or clearorgcache ROL200342798 only')
cleartaskcache clear server task cache
releasetaskcompletelock release an assigned task lock in taskCompletingMap
(ex. releasetaskcompletelock Tsk00000666)
reschedule      reflush the Task Schedule
checkService check the service status
exit exit remote control program //離開remote control program
help         print this help message //輔助說明

舉例
[Java]Server:> clearcache

更快的方法
ServerCTL.bat localhost 1099 -user administrator -password XXXXX -c clearartcache
ServerCTL.bat localhost 1099 -user administrator -password XXXXX -c clearprocesscache

2015-05-02

[AgentFlow]SQL_組織

/*
 * 查詢多重職務
 */
SELECT a.id, a.memid, a.username, a.loginid, b.name, b.id, c.name
  FROM mem_geninf a, dep_geninf b, rol_geninf c
 WHERE a.mainroleid = c.rolid
   AND c.depid = b.depid
   AND a.memid in
       (select memid from rol_mem group by memid having count(*) > 1)
   AND a.resign <> 'true' --指定非離職人員
   AND b.id like '08%' --指定公司組織 
 order by username

/*
 * 部門以下所有部門
 */
SELECT *
  FROM dep_Geninf
 start with depid = 'DEP61131148392187557'
connect by prior depid = parentid;

/*
 * 部門以上所有部門
 */
SELECT *
  FROM dep_Geninf
 start with depid = 'DEP61131148392187557'
connect by prior parentid = depid;

/*
 * 查詢目前MEMID專案職務
 */
SELECT a.rolid,
       a.memid,
       b.parentid,
       b.prjid,
       b.name,
       b.synopsis,
       c.authorid,
       c.name prj_name
  FROM prjrol_mem a, prjrol_geninf b, project c
 WHERE a.memid = 'MEM47111273625147618'
   AND a.rolid = b.rolid
   AND b.prjid = c.prjid;

/*
 * 更新所有專案職務給代理人
 */   
update prjrol_geninf
   set memid = '代理人memid'
 where memid = 'MEM47471276599403061';


/*
 * 關閉代理人資料
 */
update deputy_geninf set state = 'false' WHERE memid ='MEM47111273625147618'

SELECT a.*,rowid FROM deputyrule a
WHERE memid = 'MEM41471180408852437'

/*
 * 查詢人員清單(員工編號、員工姓名、部門代號、部門名稱、職稱) 01 = chen ,02 = chensource ,08 = 勤昆 ,09 = 東莞
 */
SELECT c.id          emp_id,
       c.username,
       d.id          dep_id,
       d.name        dep_name,
       a.name        Title,
       a.synopsis    real_title,
       c.resign,
       c.ONBOARDDATE,
       c.email
  FROM rol_geninf a, rol_mem b, mem_geninf c, dep_geninf d
 WHERE a.rolid = b.rolid
   AND b.memid = c.memid
   AND a.depid = d.depid
   AND d.id like '01%'
   AND c.resign = 'false'
 order by c.id
 
/*
 * 查詢人員資料
 */
SELECT * FROM mem_geninf
WHERE memid='MEM48001281579688046'

/*
 * 查詢部門資料
 */
SELECT * FROM dep_geninf
WHERE depid= 'DEP05211388484796125'

/*
 * 查詢eflow帳號
 */
SELECT * FROM eflow.mem_geninf WHERE username = '陳莉'

/*
 * 更新資料庫人員
 */
UPDATE mem_geninf SET email = 'yolinche@XXXX.com' WHERE loginid = 'a0682'

 

2015-04-18

[AgentFlow]SQL_流程

/*
 * 查詢目前流程數量
 */
SELECT p.name,
       m.username,
       t.keyword,
       t.state,
       (to_date('1970/01/01', 'yyyy/mm/dd') + (t.starttime / 1000 / 86400)) as starttime,
       (to_date('1970/01/01', 'yyyy/mm/dd') + (t.endtime / 1000 / 86400)) as endtime
  FROM task t, pro_geninf p, mem_geninf m
 WHERE m.memid in
       (select c.memid
          from rol_geninf a, rol_mem b, mem_geninf c, dep_geninf d
         where a.rolid = b.rolid
           and b.memid = c.memid
           and a.depid = d.depid
           and d.id like '01%'
           and c.resign = 'false')
   AND t.proid = p.proid
   AND t.state in ('running')
   AND t.rootid = t.tskid
   AND t.memid = m.memid
 order by p.name, t.state, starttime desc

/*
 * 查詢某task開始與結束時間並轉換
 */
SELECT to_char((to_date('01-01-1970', 'DD-MM-YYYY') +
               (starttime + (8 * 60 * 60 * 1000)) / 86400000),
               'yyyy/mm/dd hh24:mi:ss') as starttime,
       to_char((to_date('01-01-1970', 'DD-MM-YYYY') +
               (endtime + (8 * 60 * 60 * 1000)) / 86400000),
               'yyyy/mm/dd hh24:mi:ss') as endtime
  FROM task
 WHERE tskid = 'Tsk000002966923'
 
/*
 * 將long時間格式轉為正常格式
 */
SELECT to_char((to_date('01-01-1970', 'DD-MM-YYYY') +
               (1427852861000 + (8 * 60 * 60 * 1000)) / 86400000),
               'yyyy/mm/dd hh24:mi:ss') as 時間
  FROM dual;

/*
 * 將現在時間格式轉為Long
 */  
SELECT sysdate 當前時間,
       (sysdate - to_date('01-01-1970', 'DD-MM-YYYY')) * 86400000 - (8 * 60 * 60 * 1000) Long_Time
  FROM dual;

/*
 * 查詢目前身上代辦事項
 */
SELECT ART_GENINF.NAME, ART_STATE.NAME, MEM_GENINF.USERNAME, TASK.STARTTIME
  FROM ARTINSTANCE
  JOIN ART_GENINF
    ON ART_GENINF.ARTID = ARTINSTANCE.ARTID
  JOIN TASK_ARTINS
    ON TASK_ARTINS.astid = ARTINSTANCE.ASTID
   AND TASK_ARTINS.INSID = ARTINSTANCE.INSID
  JOIN ART_STATE
    ON ART_STATE.ASTID = ARTINSTANCE.ASTID
  JOIN TASK
    ON TASK.TSKID = TASK_ARTINS.TSKID
  JOIN MEM_GENINF
    ON MEM_GENINF.MEMID = TASK.MEMID
 WHERE LOGINID = 'a0682'

 

2014-08-12

[AgentFlow]表單日曆圖案看不到

將正式機路徑的Images資料夾複製到本機相同路徑 ..\tomcat6\webapps\WebAgenda\artform\images

2013-11-07

[AgentFlow]常用程式碼

將Oracle時間字串轉換為時間
系統單月抓出來有空格,雙月無空格

	var str = new java.lang.String("05-8月-13");
	str = str.replaceAll(" ","");
	var inFormatter = new java.text.SimpleDateFormat("dd-MM月-yy");
	var inDate = inFormatter.parse(str);
	var flowDate = new Packages.pase.agenda.MyDate(inDate);
	flowDate.addDay(flowDate.toString(),21);
	var outDate = new java.util.Date(flowDate);
	var outFormatter = new java.text.SimpleDateFormat("yyyy/MM/dd");
	Form.setValue("script",outFormatter.format(outDate));

DepID取得部門主管欄位,再透過部門主管欄位取得主管職務MemID

	var rol = Client.getDepartment("DEP02671199157696281").getManagerID();
	var DivisionMemid = Client.getRole(rol).getMemberList().get(0);
	Form.setValue("script",DivisionMemid );

專案職務取MemId與姓名

	var prjRoleID = "ROL03451172741554296";
	var prjmemid = Client.getRole(prjRoleID).getMemberList().get(0);
	var MemberBymID = Client.getMember(prjmemid).getName();
	Form.setValue("script",MemberBymID );

Name_To_MemId

	var mem=Client.getMemberByCName("王小明");
	var mail=mem.getID();
	Form.setValue("script",mail);

MemID_To_RoleID

	var MemberRecord = Client.getMember("MEM47111273625147618");
	var RoleID = MemberRecord.getMainRoleID();
	Form.setValue("script",RoleID );