基于氚云平台的应用开发学习(二)

在氚云中要想实现表单某个功能,第一个方法可以通过平台自己本身就有的“控件属性”与“表单属性”,这个方法非常方便简单高效,但也有它的局限性,较复杂的功能无法实现,适用于对代码不了解或不熟悉人员。第二个方法可以通过代码实现,较于前者可以实现复杂的逻辑或功能。第一个方法,可以实现的功能包括有筛选值范围限定、自动填充其它控件(本身是关联表单才可填充)、计算公式、表单提交检验、业务规则(对其它表单增删改查等,有些需设置条件)等等。第二个方法,可以实现的功能有打开其它表单并传入数据、后台定时服务、操作流程运转、绑定控件变化事件、设置提交表单后事件(当一个表单提交后首先会触发业务规则,比如新增其它表单,再执行提交后事件,比如修改其他表单数据或状态)等等。

下面围绕第二个方法记录说明一下自己遇到的问题以及解决方法。

一、控件取值、赋值、变更绑定等

二、表单提交检验,弹出提示信息

三、打开其它表单并传数据

四、前端操作子表

五、前端调用后台业务逻辑

 

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 }

上述代码是后端代码,根据前端请求的名称与参数,自定义返回的值。

 

 

 

至此是对氚云部分功能的一个简单介绍,后续会继续说明其它部分功能所遇到的问题以及解决方法。

如有疏漏错误之处,还请不吝赐教!

 

 
 
 
 

 
 
 

 

posted @ 2018-09-03 15:06  JalonY  阅读(9918)  评论(0编辑  收藏  举报