介绍
相比于RunBase,SysOperation更加全面(可以设计dialogUI,不再需要序列化存储参数),但是开发时长会大大延长,一般来说,使用RunBase只需要建一个Class,而SysOperation最少需要新建三个Class:
Controller,Contract,Service,若需要设计批处理dialog的UI页面,还需要另加一个UIBuilder。可以发现,SysOperation 开发思路与开发SSRS Report流程一致
现在简单的写一下代码案例。
1.TestSysOperationServiceController
class TestSysOperationServiceController extends SysOperationServiceController
{
protected void new()
{
super(classStr(TestSysOperationServiceBase), methodStr(TestSysOperationServiceBase, runSubTask), SysOperationExecutionMode::Synchronous);
}
/// <summary>
///
/// </summary>
/// <returns></returns>
protected ClassDescription defaultCaption()
{
ClassDescription ret;
ret = super();
return 'Process Job';
}
public static TestSysOperationServiceController construct(SysOperationExecutionMode _excutionMode = SysOperationExecutionMode::Synchronous)
{
TestSysOperationServiceController controller;
;
controller = new TestSysOperationServiceController();
controller.parmExecutionMode(_excutionMode);
return controller;
}
public static void main(Args _args)
{
TestSysOperationServiceController controller;
;
controller = TestSysOperationServiceController::construct();
controller.parmArgs(_args);
controller.startOperation();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public Batch doBatch()
{
batchHeader batchHeader;
;
//执行完自动提醒用户
// Setup alerts so that they alert on success or error via a popup toast
// If the job is setup for scheduled batch
batchHeader = this.batchInfo().parmBatchHeader();
batchHeader.clearAllAlerts();
batchHeader.addUserAlerts(curUserId(), // alert user who created the job
NoYes::Yes, // completed
NoYes::Yes, // error
NoYes::No, // canceled
NoYes::Yes, // popup or toast in desktop client
NoYes::No);
// email
return super();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public boolean mustGoBatch()
{
boolean ret;
ret = super();
ret = true;
return ret;
}
}
2.TestSysOperationContract
[DataContractAttribute,
SysOperationContractProcessingAttribute(classstr(TestSysOperationAutomaticUIBuilder))]
class TestSysOperationContract
{
str DepartCode;
NoYesId allowDepartCode;
[DataMemberAttribute,
SysOperationLabelAttribute("部门编号"),
SysOperationControlVisibilityAttribute(true)]
public str parmDepartCode(str _DepartCode = departCode)
{
departCode = _DepartCode;
return departCode;
}
[DataMemberAttribute,
SysOperationLabelAttribute("激活部门控件")]
public NoYesId parmAllowDepartCode(NoYesId _allowDepartCode = allowDepartCode)
{
allowDepartCode = _allowDepartCode;
return allowDepartCode;
}
}
3.TestSysOperationTaskServiceBase
class TestSysOperationTaskServiceBase extends SysOperationServiceBase
{
public void process(TestSysOperationContract _contract)
{
Info(_contract.parmDepartCode());
}
}
4.TestSysOperationAutomaticUIBuilder
class TestSysOperationAutomaticUIBuilder extends SysOperationAutomaticUIBuilder
{
TestSysOperationContract TestSysOperationContract;
DialogField dialogFieldDepartCode,
dialogFieldAllowDepartCode;
public boolean allowDepartCodeModified(FormCheckBoxControl _checkBoxControl)
{
// set enabled or disabled based on checkbox
dialogFieldDepartCode.enabled(any2enum(dialogFieldAllowDepartCode.value()));
return true;
}
public void postBuild()
{
super();
// get datacontract
TestSysOperationContract = this.dataContractObject();
// get dialog fields
dialogFieldDepartCode = this.bindInfo().getDialogField(TestSysOperationContract, methodstr(TestSysOperationContract, parmDepartCode));
dialogFieldAllowDepartCode = this.bindInfo().getDialogField(TestSysOperationContract, methodstr(TestSysOperationContract, parmAllowDepartCode));
// register override methods
dialogFieldAllowDepartCode.registerOverrideMethod(methodstr(FormCheckBoxControl, modified), methodstr(TestSysOperationAutomaticUIBuilder, allowDepartCodeModified), this);
// enable/disable transdate based on checkbox
dialogFieldDepartCode.enabled(any2enum(dialogFieldAllowDepartCode.value()));
}
}