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


    这篇将继续围绕上篇所说的第二种方法,记录说明一下自己遇到的问题以及解决方法。

    一、创建或更新包含子表的表单

    二、流程事件变化后执行某些逻辑

    三、发送消息提醒

    一、创建或更新包含子表的表单

    1、首先介绍关于在后端创建包含子表的表单:

     1 //根据ID查询当前表单数据
     2 string sql1 = "select Warehouse1 as Warehouse1,MyProject as MyProject,Class1 as Class1,People as People,Dept as Dept," +
     3     "Principal as Principal from I_D000399SgProductionAcquisition where Objectid = '" + ObjectId + "'";
     4 System.Data.DataTable table1 = this.Engine.Query.QueryTable(sql1, null);
     5 int rowCount1 = table1.Rows.Count;
     6 
     7 //根据ID查询当前表单子表数据
     8 string sql2 = "select ControlCatalogue as ControlCatalogue,No as No,MaterialName as MaterialName,Type as Type,Unit1 as Unit1 " +
     9     "from I_D000399SgBugApplyDetails where parentobjectid = '" + ObjectId + "'";
    10 System.Data.DataTable table2 = this.Engine.Query.QueryTable(sql2, null);
    11 int rowCount2 = table2.Rows.Count;
    12 
    13 List < H3.DataModel.BizObject > _list = new List<H3.DataModel.BizObject>();
    14 for(int i = 0;i < rowCount2; i++) {
    15     //创建子表对象
    16     H3.DataModel.BizObject childBo = new H3.DataModel.BizObject(this.Request.Engine, this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SqOutbound01"), this.Request.UserContext.UserId);
    17     childBo["ControlCatalogue"] = table2.Rows[i]["ControlCatalogue"].ToString();
    18     childBo["No"] = table2.Rows[i]["No"].ToString();
    19     childBo["MaterialName"] = table2.Rows[i]["MaterialName"].ToString();
    20     childBo["Type"] = table2.Rows[i]["Type"].ToString();
    21     childBo["Unit1"] = table2.Rows[i]["Unit1"].ToString();
    22     childBo.Create();
    23     _list.Add(childBo);
    24 }
    25 
    26 //创建主表对象
    27 H3.DataModel.BizObject bo = new H3.DataModel.BizObject(this.Engine, this.Engine.BizObjectManager.GetPublishedSchema("D000399SqOutbound"), this.Request.UserContext.UserId);
    28 bo["WDate"] = DateTime.Today.ToString("yyyy-MM-dd");
    29 bo["YearMonth"] = DateTime.Today.ToString("yyyyMM");
    30 bo["Title"] = "审核批量,生产领用出库";
    31 bo["Acquisition"] = ObjectId;
    32 bo["No"] = No;
    33 bo["Money"] = AllMoney;
    34 for(int i = 0;i < rowCount1; i++) {
    35     bo["Warehouse1"] = table1.Rows[i]["Warehouse1"].ToString();
    36     bo["MyProject"] = table1.Rows[i]["MyProject"].ToString();
    37     bo["Class"] = table1.Rows[i]["Class1"].ToString();
    38     bo["People"] = table1.Rows[i]["People"].ToString();
    39     bo["Dept"] = table1.Rows[i]["Dept"].ToString();
    40     bo["Principal"] = table1.Rows[i]["Principal"].ToString();
    41 }
    42 bo["D000399SqOutbound01"] = _list.ToArray();
    43 bo.Status = H3.DataModel.BizObjectStatus.Effective;
    44 bo.Create();

    上述代码是根据ID,查询某表单以及其子表数据,再将数据对应赋值给创建的表单以及创建表单的子表,这里表单或者其子表的ID都是系统自己随机生成,同时可以设置创建表单的状态,需要注意的是这里创建后的表单继续会触发它对应的业务规则。

    2、再介绍关于在后端更新包含子表的表单:

     1 //查询当前表单子表中需要冲减的数量
     2 string sql1 = "select ControlCatalogue as ControlCatalogue,Num3 as Num3 from I_D000399SgBuyDetails" +
     3     " where parentobjectId = '" + BuyApply + "' and Num3 != 0";
     4 System.Data.DataTable table1 = this.Engine.Query.QueryTable(sql2, null);
     5 int rowCount1 = table1.Rows.Count; 
     6 
     7 H3.Data.Filter.Filter filter = new H3.Data.Filter.Filter();
     8 H3.Data.Filter.And andMatcher = new H3.Data.Filter.And();
     9 
    10 andMatcher.Add(new H3.Data.Filter.ItemMatcher("ObjectId", H3.Data.ComparisonOperatorType.Equal, UseAllPlan));
    11 filter.Matcher = andMatcher;
    12 H3.DataModel.BizObjectSchema accountSchema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SgUseAllPlan");
    13 H3.DataModel.BizObject[] customers = H3.DataModel.BizObject.GetList(this.Request.Engine, this.Request.UserContext.UserId,
    14     accountSchema, H3.DataModel.GetListScopeType.GlobalAll, filter);
    15 if(customers != null && customers.Length > 0)
    16 {
    17     H3.DataModel.BizObject[]  details = (H3.DataModel.BizObject[]) customers[0]["D000399SgUseAllDetails"];
    18     List < H3.DataModel.BizObject > boList = new List<H3.DataModel.BizObject>();
    19     //保存原子表记录,先获取子表内容,循环将其原有数据添加到boList
    20     if(details != null)
    21     {
    22         foreach(H3.DataModel.BizObject dt in details)
    23         {
    24             for(int i = 0;i < rowCount1; i++) {
    25                 string ControlCatalogue = table1.Rows[i]["ControlCatalogue"].ToString();
    26                 string Num3 = table1.Rows[i]["Num3"].ToString();
    27 
    28                 if(string.Equals(dt["ControlCatalogue"], ControlCatalogue))
    29                 {
    30                     int temp1 = Convert.ToInt32(dt["Num4"]) - Convert.ToInt32(Num3);
    31                     dt["Num4"] = Convert.ToString(temp1);
    32                     int temp2 = Convert.ToInt32(dt["Num5"]) + Convert.ToInt32(Num3);
    33                     dt["Num5"] = Convert.ToString(temp2);
    34                 }
    35             }
    36             boList.Add(dt);
    37         }
    38     }
    39     H3.DataModel.BizObjectSchema schema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D000399SgUseAllPlan");
    40     H3.DataModel.BizObject schemaObject = new H3.DataModel.BizObject(this.Request.Engine, schema, this.Request.UserContext.UserId);
    41     schemaObject.ObjectId = UseAllPlan;  //更新的表单ID为UseAllPlan
    42     schemaObject.Load();
    43     schemaObject["D000399SgUseAllDetails"] = boList.ToArray();
    44     schemaObject.Update();
    45 } 

    上述代码是根据ID,更新目标表单的子表数据,需要注意的是这里更新后的表单同样会触发它对应的业务规则,如果不想触发业务规则,也可采用sql语句更新的方式,如下所示。

    1 //将'项目信息'中项目成员赋值给‘我的项目’的项目成员
    2 string sql1 = "update I_D000399SgProjectMy set I_D000399SgProjectMy.Members = (select Members from I_D000399SgProject "+
    3                 "where I_D000399SgProjectMy.Project = I_D000399SgProject.Objectid)";
    4 this.Engine.Query.QueryTable(sql1, null);

    二、流程事件变化后执行某些逻辑

    当一个表单生效或作废后,若有业务规则首先会执行业务规则,通常有更新或新增等操作。然后再执行流程变化后事件。前提是当前表单已经开启了表单流程。代码如下:

     1 protected override void OnWorkflowInstanceStateChanged(H3.Workflow.Instance.WorkflowInstanceState oldState, H3.Workflow.Instance.WorkflowInstanceState newState)
     2     {
     3         //流程审批结束,业务规则执行。还有个审批流程结束(finished状态下直接删除),就直接删除也会触发业务规则执行。在submit里面处理
     4         if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Running && newState == H3.Workflow.Instance.WorkflowInstanceState.Finished)
     5         {
     6             DoAfterPass1(this.Request.BizObject.ObjectId);
     7         }
     8         //流程审批结束后,重新激活,业务规则会执行。还有个审批流程结束(finished状态下直接删除),就直接删除也会触发业务规则执行。在submit里面处理
     9         if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Finished && newState == H3.Workflow.Instance.WorkflowInstanceState.Running)
    10         {
    11             DoAfterPass2(this.Request.BizObject.ObjectId);
    12         }
    13         base.OnWorkflowInstanceStateChanged(oldState, newState);
    14     }

     this.Request.BizObject.ObjectId; //当前表单的ID


    三、发送消息提醒
     1 H3.Task.UserTask task = new H3.Task.UserTask();
     2 task.ObjectId = Guid.NewGuid().ToString();
     3 task.Sender = this.Request.UserContext.UserId; //任务的发送人ID
     4 task.UserId = this.Request.UserContext.UserId; //任务的接收人ID
     5 task.AppCode = ""; //应用的Code
     6 task.TaskType = H3.Task.TaskType.Reminder; //任务类型为提醒
     7 task.SchemaCode = ""; //表单的Code
     8 task.TargetType = LinkTargetType.BizObject; //链接类型
     9 task.TargetId = ""; //链接表单对象的ID
    10 task.TargetName = ""; //链接表单对象的名称
    11 task.Name = "这是测试提醒标题!"; //提醒标题
    12 task.Summary = "这是测试提醒内容!"; //提醒的内容
    13 task.AlertTime = DateTime.Now;  // 提醒时间
    14 task.ReminderType = H3.Task.ReminderType.Once; //提醒的类型
    15 task.StartTime = DateTime.Now;    //开始时间
    16 task.TaskState = H3.Task.TaskState.Unfinished;  //任务的状态
    17 task.AlertState = H3.Task.AlertState.Waiting;  //提醒的状态
    18 this.Request.Engine.TaskManager.AddTask(task);//添加任务


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

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

     
  • 相关阅读:
    mysql 查看表注解
    oracle 相关
    sql version control
    ccna
    msql 清库
    mybatisplus,application.properties 配置数据库密码加密
    驱动开发print无法输出问题
    bochs帮助
    以虚御虚用虚拟机调试vt程式
    ssm整合
  • 原文地址:https://www.cnblogs.com/yijialong/p/9579331.html
Copyright © 2020-2023  润新知