跳转至

复制一条列表数据

功能描述

点击列表的自定义按钮 复制数据 将选中的数据复制出来,包含以下内容

  • 主表内容
  • 子表内容
  • 附件

若当前表单为流程表单,将自动创建流程实例。

编写代码前,需在列表设计页面添加 自定义按钮 并将 自定义按钮 编码设置为 DataCopy

列表前端代码

  1. 判断点击的按钮是否为 复制数据 时执行逻辑。
  2. 判断是否选中数据,且一次仅允许复制一条数据。
  3. 调用后端接口执行复制操作,并展示复制结果。
/*
* $.ListView.GetSelected()获取选中的记录
* $.ListView.RefreshView()刷新列表
* $.ListView.Post()请求后台
* $.ListView.InitQueryItems()修改过滤条件
* $.ListView.RefreshView()刷新页面
* $.ListView.ActionPreDo() 按钮执行之前的事件
*/

$.ListView.ActionPreDo = function(actionCode){
    if(actionCode=="DataCopy"){
        //点击复制按钮时检查是否选中数据
        var objects=$.ListView.GetSelected();
        if(objects==null||objects==undefined||objects==""){
            $.IShowWarn("您还未勾选数据,请勾选!");
            return;
        }
        //判断选中数据是否大于1条
        else if(objects.length>1){
                $.IShowWarn("仅允许勾选一条数据");
                return;
        }
        else {
            //调用后台逻辑执行复制
            $.ListView.Post("DataCopy",{objectId:objects[0].ObjectId},
            function(data){
                if(data.ReturnData==null||!data.ReturnData.Message){
                    //刷新列表
                    $.ListView.RefreshView();
                    $.IShowSuccess("复制完成!");
                }
                else if(data.ReturnData!=null&&data.ReturnData.Message){
                    $.IShowError(data.ReturnData.Message);
                }
                else{
                    $.IShowError("复制失败!");
                }
                },
                function(data){
                    $.IShowError(data.Errors[0]);
                },
                false);
        }
    }
};

列表后端自定义代码

  1. 判断是 复制按钮 的请求时执行逻辑。
  2. 接收选中的数据,若无选中的数据则提示,若有选中的数据则读取数据内容。
  3. 构造新数据,复制附件及子表数据。
  4. 判断是否为流程表单,若是流程表单则发起流程实例。

```javascript using System; using System.Collections.Generic; using System.Text; using H3;

public class D00018smd5b25f5649c74c5d8cd971864ee82c2b_ListViewController : H3.SmartForm.ListViewController { public D00018smd5b25f5649c74c5d8cd971864ee82c2b_ListViewController(H3.SmartForm.ListViewRequest request) : base(request) { }

protected override void OnLoad(H3.SmartForm.LoadListViewResponse response)
{
    base.OnLoad(response);
}

protected override void OnSubmit(string actionName, H3.SmartForm.ListViewPostValue postValue, H3.SmartForm.SubmitListViewResponse response)
{
    if(actionName == "DataCopy")
    {
        response.ReturnData = new Dictionary<string, object>();
        string objectId = this.Request["objectId"];
        string schemaCode = "D00018smd5b25f5649c74c5d8cd971864ee82c2b";
        if(!string.IsNullOrEmpty(objectId))
        {
            H3.DataModel.BizObject accountBo = H3.DataModel.BizObject.Load(this.Request.UserContext.UserId, this.Engine, "D00018smd5b25f5649c74c5d8cd971864ee82c2b", objectId, false);
            if(accountBo != null)
            {
                H3.DataModel.BizObjectSchema schema = this.Request.Engine.BizObjectManager.GetPublishedSchema("D00018smd5b25f5649c74c5d8cd971864ee82c2b");
                H3.DataModel.BizObject obj = new H3.DataModel.BizObject(this.Request.Engine, schema, this.Request.UserContext.UserId); //主表对象
                obj["F0000001"] = accountBo["F0000001"];
                obj["F0000004"] = DateTime.Now;
                //附件
                this.Request.Engine.BizObjectManager.CopyFiles(
                    schemaCode, 
                    "", 
                    "F0000008", 
                    accountBo.ObjectId, 
                    schemaCode, 
                    "", 
                    "F0000008", 
                    obj.ObjectId, 
                    true, 
                    true);
                string childSchemaCode = "D00018462171ae21c34058a6d166a5bc04572d";
                //子表数据不为空
                if(accountBo[childSchemaCode] != null)
                {
                    //得到子表数据
                    H3.DataModel.BizObject[] zibiao = (H3.DataModel.BizObject[]) accountBo[childSchemaCode];
                    //创建存新子表数据集合
                    List < H3.DataModel.BizObject > zibiaoList = new List<H3.DataModel.BizObject>();
                    //循环复制数据
                    foreach(H3.DataModel.BizObject zb in zibiao)
                    {
                        H3.DataModel.BizObjectSchema  newSch = this.Request.Engine.BizObjectManager.GetPublishedSchema(childSchemaCode);
                        H3.DataModel.BizObject  newzb = new H3.DataModel.BizObject(this.Request.Engine, newSch, this.Request.UserContext.UserId);
                        newzb["F0000005"] = zb["F0000005"];
                        zibiaoList.Add(newzb);
                    }
                    obj[childSchemaCode] = zibiaoList.ToArray();
                }
                obj.Status = accountBo.Status;
                if(string.IsNullOrEmpty(obj.WorkflowInstanceId))
                {
                        obj.WorkflowInstanceId = System.Guid.NewGuid().ToString();
                }

                //创建对象
                H3.ErrorCode createResult = obj.Create();
                //判断是否成功创建数据对象
                if(createResult != H3.ErrorCode.Success)
                {
                    response.ReturnData.Add("Message", createResult.ToString());
                } 
                else
                {
                    if(accountBo.Status == H3.DataModel.BizObjectStatus.Running)
                    {
                        obj.Status = H3.DataModel.BizObjectStatus.Draft;
                        H3.Workflow.Instance.WorkflowInstance wfInstance = this.Request.Engine.WorkflowInstanceManager.GetWorkflowInstance(obj.WorkflowInstanceId);
                        if(wfInstance == null)
                        {
                            //启动流程
                            string workItemID = string.Empty;
                            string errorMsg = string.Empty;
                            H3.Workflow.Template.WorkflowTemplate wfTemp = this.Request.Engine.WorkflowTemplateManager.GetDefaultWorkflow(obj.Schema.SchemaCode);
                            this.Request.Engine.Interactor.OriginateInstance(this.Request.UserContext.UserId, 
                                obj.Schema.SchemaCode, 
                                wfTemp.WorkflowVersion, 
                                obj.ObjectId, 
                                obj.WorkflowInstanceId, 
                                H3.Workflow.WorkItem.AccessMethod.Web, 
                                true, 
                                string.Empty, 
                                true, 
                                out workItemID, 
                                out  errorMsg);
                        }
                    }
                }
            } 
            else
            {
                response.ReturnData.Add("Message", "数据对象未获取到!");
            }
        } 
        else
        {
            response.ReturnData.Add("Message", "无数据对象ID!");
        }
    }
    base.OnSubmit(actionName, postValue, response);
}

}