基於氚雲平台的應用開發學習(二)


在氚雲中要想實現表單某個功能,第一個方法可以通過平台自己本身就有的“控件屬性”與“表單屬性”,這個方法非常方便簡單高效,但也有它的局限性,較復雜的功能無法實現,適用於對代碼不了解或不熟悉人員。第二個方法可以通過代碼實現,較於前者可以實現復雜的邏輯或功能。第一個方法,可以實現的功能包括有篩選值范圍限定、自動填充其它控件(本身是關聯表單才可填充)、計算公式、表單提交檢驗、業務規則(對其它表單增刪改查等,有些需設置條件)等等。第二個方法,可以實現的功能有打開其它表單並傳入數據、后台定時服務、操作流程運轉、綁定控件變化事件、設置提交表單后事件(當一個表單提交后首先會觸發業務規則,比如新增其它表單,再執行提交后事件,比如修改其他表單數據或狀態)等等。

下面圍繞第二個方法記錄說明一下自己遇到的問題以及解決方法。

一、控件取值、賦值、變更綁定等

二、表單提交檢驗,彈出提示信息

三、打開其它表單並傳數據

四、前端操作子表

五、前端調用后台業務邏輯

 

var enviroment = $.SmartForm.ResponseContext; //獲取當前對象環境變量

enviroment.FormMode;  //表單模式,值為1表示生效狀態,值為0表示編輯狀態

enviroment.ActivityCode;  //流程環節,值是流程設計中流程對應的節點編碼

enviroment.BizObjectId;  //當前表單ID,可用於在后端sql中查詢數據

詳細了解可訪問:氚雲社區

 

一、控件取值、賦值、變更綁定等

this.BuyApply.GetValue(); 

//取值,這里BuyApply是圖形設計中對應控件的編碼(下同)

this.BuyApply.SetValue();   

//賦值

this.BuyApply.BindChange( "Test", function( data ) {   

  //執行xxx事件

});

//變更綁定

this.BuyApply.SetVisible( false );

//隱藏,顯示反之參數為true

this.BuyApply.SetReadonly( true );

//只讀

var detailsList = this.D000399RhyjRuleDetails01.GetValue();
for( var i = 0;i < detailsList.length;i++ ) {
    var cell1 = this.D000399RhyjRuleDetails01.GetCellManager( detailsList[ i ].ObjectId, "D000399RhyjRuleDetails01.FormName" );
    cell1.SetReadonly( true );
}

//子表控件設置只讀

 

二、表單提交檢驗,彈出提示信息

 1 // 提交校驗
 2 OnValidate: function( actionControl ) {
 3   var _this = this;
 4   var flag = true;
 5 
 6   //校驗訂單編號
 7   var value = _this.No.GetValue();
 8   if( value.length > 12 ) {
 9     $.IShowWarn( "提示:訂單編號長度不得多於12位" );
10     flag = false;
11   } else if( value.length < 6 ) {
12     $.IShowWarn( "提示:訂單編號長度不得低於6位!" );
13     flag = false;
14   } else {
15     var lastSix = value.substr( value.length - 6 );
16     if( isNaN( lastSix ) ) {
17       $.IShowWarn( "提示:訂單編號后6位不是數字!" );
18       flag = false;
19     }
20   }
21   return flag;
22 },

 

彈出信息成功、提示、錯誤、警告方法分別對應:$.IShowSuccess();  $.IShowTip();  $.IShowError();  $.IShowWarn();

 

三、打開其它表單並傳數據

 

1 var params = { BuyApply: $.SmartForm.ResponseContext.BizObjectId, ApplyDetail: outData.ReturnData };
2 $.IShowForm( "D000399SgPurchaseOrder", null, params );

這里params是傳遞的參數,里面是鍵值對,$.SmartForm.ResponseContext.BizObjectId是當前表單的ID,outData.ReturnData是通過ajax請求后端並查詢數據庫得到的返回值,可以根據自己需求定義傳遞的參數。D000399SgPurchaseOrder是打開表單的編碼,下面是這個表單怎么接收參數並填入對應控件中。

 

 1 //接受采購申請數據
 2 if( $.IGetParams( "BuyApply" ) != null ) {
 3     _this.BuyApply.SetValue( $.IGetParams( "BuyApply" ) );
 4     _this.BuyApply.SetReadonly( true );
 5     _this.State.SetReadonly( true );
 6     var controlManager = _this.D000399SgOrderDetails;
 7     //接受采購申請子表列表傳遞的參數
 8     if( $.IGetParams( "ApplyDetail" ).length != 0 ) {
 9         console.log( $.IGetParams( "ApplyDetail" ) );
10         var length1 = Object.keys( $.IGetParams( "ApplyDetail" ).dicts1 ).length;
11         var i = 0;
12         if( length1 > 0 ) {
13             controlManager.ClearRows();  
14         }
15         for( var key in $.IGetParams( "ApplyDetail" ).dicts1 ) {
16             if( ++i > length1 ) {
17                 break;
18             }
19             var subObjectId = $.IGuid();
20             var subObject = $.IGetParams( "ApplyDetail" ).dicts1[ key ];
21             controlManager.AddRow( subObjectId, {
22                 "D000399SgOrderDetails.ControlCatalogue": subObject.ControlCatalogue,
23                 "D000399SgOrderDetails.No": subObject.No,
24                 "D000399SgOrderDetails.MaterialName": subObject.MaterialName,
25                 "D000399SgOrderDetails.Type": subObject.Type,
26                 "D000399SgOrderDetails.Unit1": subObject.Unit1,
27                 "D000399SgOrderDetails.Num1": subObject.Num3,
28                 "D000399SgOrderDetails.Node": subObject.Node1
29             });
30         }
31     }
32 }
var controlManager = _this.D000399SgOrderDetails;  //獲取當前表單中子表對象
controlManager.ClearRows();  //清空子表行
var subObjectId = $.IGuid();  //子表每一行數據都有一個唯一的ID,這里是隨機生成一個ID
var subObject = $.IGetParams( "ApplyDetail" ).dicts1[ key ];  //獲取參數ApplyDetail中的所有鍵
controlManager.AddRow( subObjectId, {   //根據上方生成的ID,添加子表行
});
"D000399SgOrderDetails.ControlCatalogue": subObject.ControlCatalogue; //根據鍵取值,並賦值給子表對應控件

上述是在表單中打開另一個表單,下面是在列表中打開另一個表單,代碼是在列表設計中。

 1 var objects = $.ListView.GetSelected();
 2 if( objects == null || objects == undefined || objects == "" ) {
 3     $.IShowWarn( "提示:請選擇!" );
 4     return;
 5 }
 6 if( objects.length > 1 ) {
 7     $.IShowWarn( "提示:只能選擇一條記錄!" );
 8     return;
 9 }
10 if( objects[ 0 ].Status != 1 ) {
11     $.IShowWarn( "提示:當前開票通知流程未結束!" );
12     return;
13 }
14 
15 
16 if( actionCode == "ToD000399SgContractInvoice" ) {
17     var params = { ObjectId: objects[ 0 ].ObjectId };
18     $.IShowForm( "D000399SgContractInvoice", null, params );
19 }
var objects = $.ListView.GetSelected();  //獲取選中行
actionCode == "ToD000399SgContractInvoice"  //列表中自定義的按鈕
objects[ 0 ].ObjectId; //選中第一條行的ID


四、前端操作子表

常見的有子表綁定添加行、綁定某一列變化事件、數據寫入子表、更新子表、清空子表等。
 1 var _this = this;
 2 //采購訂單明細子表綁定添加行事件
 3 this.D000399SgOrderDetails.BindChange( "JudgeLine", function( changeRow ) {
 4     if( changeRow[ 1 ] == "add" ) {
 5         //若對應采購申請不為空,則檢查子表行數
 6         if( _this.BuyApply.GetValue() != "" ) {
 7             var LineNum;
 8             var dataParas = { BuyApply: _this.BuyApply.GetValue() };
 9             $.SmartForm.PostForm(
10                 "GetLine",
11                 dataParas,
12                 function( outData ) {
13                     LineNum = parseInt( outData.Message );
14                 },
15                 function( outData ) {
16                     $.IShowWarn( outData );
17                 }, false )
18 
19             var detailsList = _this.D000399SgOrderDetails.GetValue();
20             if( detailsList.length > LineNum ) {
21                 $.IShowWarn( "提示:當前明細數量不得多於采購申請明細數量!" );
22             }
23         }
24     }
25 });

上述代碼是綁定添加行,當點擊添加子表按鈕時,會根據主表控件中對應的采購申請,去后端查詢它明細的條數,當采購訂單明細條數多於采購申請的明細條數,彈窗警告。

 1 var _this = this;
 2 //判斷倉庫物料目錄是否存在
 3 this.D000399SgOrderDetails.BindChange( "SonTable1", function( data ) {
 4     var responseData = data[ 0 ];
 5     var currentRowId = data[ 0 ].ObjectId; //獲取行ID
 6     if( responseData != null && responseData.DataField == "D000399SgOrderDetails.ControlCatalogue" )   //觸發變更的列
 7     {
 8         if( responseData.GetValue() != "" && _this.BuyApply.GetValue() != "" ) {
 9             var dataParas = { ControlCatalogue: responseData.GetValue(), BuyApply: _this.BuyApply.GetValue() }; //傳遞的參數
10             $.SmartForm.PostForm(
11                 "JudgeExit",
12                 dataParas,
13                 function( outData ) {
14                     if( outData.Message != "" ) {
15                         $.IShowWarn( "提示:對應采購申請不存在該倉庫物料目錄!" );
16                         _this.D000399SgOrderDetails.UpdateRow( currentRowId, {
17                             "D000399SgOrderDetails.ControlCatalogue": ""
18                         });
19                     }
20                 },
21                 function( outData ) {
22                     $.IShowWarn( outData );
23                 }, false )
24         }
25     }
26 });

上述代碼是綁定某一列變化事件,當寫入倉庫物料目錄后,會根據主表控件中對應的采購申請,去后端查詢它明細中是否存在該倉庫物料目錄,若沒有則清空已填入的數據,並彈窗警告。其中responseData.GetValue();就是當前寫入的倉庫物料目錄值,這里也涉及到了更新子表操作。

數據寫入子表、更新子表、清空子表等功能,均在上面代碼中能找到,總之先需要生成或獲得每一條行數據的ID,然后再根據ID去填寫數據或更新數據,這里不贅述。

 

五、前端調用后台業務邏輯

調用后端代碼,還是通過常見的ajax請求的方式,后續這種方法可能會移除。這里通過一個簡單的功能說明一下。

 1 var _this = this;
 2 var dataParas = {};
 3 $.SmartForm.PostForm(
 4     "ReadMax",
 5     dataParas,
 6     function( outData ) {
 7         _this.No.SetValue( outData.Message );
 8     },
 9     function( outData ) {
10         $.IShowWarn( outData );
11     }, false )

上述代碼,前端首先定義請求的名稱,以及傳入的參數,並將返回的數據填入對應控件。

 1 public class D000399SgArMarginContract: H3.SmartForm.SmartFormController
 2 {
 3     public D000399SgArMarginContract(H3.SmartForm.SmartFormRequest request): base(request)
 4     {
 5 
 6     }
 7 
 8     protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
 9     {
10         base.OnLoad(response);
11     }
12 
13     
14     protected string ReadMax() {
15         return "000001";    //這里也可以查詢數據庫,根據上一條記錄編號,來自定義返回的編號
16     }
17 
18     protected override void OnSubmit(string actionName, H3.SmartForm.SmartFormPostValue postValue, H3.SmartForm.SubmitSmartFormResponse response)
19     {
20         if(actionName == "ReadMax")
21         {
22             string newString = ReadMax();
23             response.Message = newString;
24         }
25         base.OnSubmit(actionName, postValue, response);
26     }
27 }

上述代碼是后端代碼,根據前端請求的名稱與參數,自定義返回的值。

 

 

 

至此是對氚雲部分功能的一個簡單介紹,后續會繼續說明其它部分功能所遇到的問題以及解決方法。

如有疏漏錯誤之處,還請不吝賜教!

 

 
 
 
 
 
        
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM