DaleCloud(原NFine)介绍:使用easyui实现主从表提交(单据业务)

目录

1、Form页面的Html代码

2、前端JS实现将DataGrid中的明细数据打包提交

3、后台接收提交数据的代码

4、Application业务中的保存方法


前言

很多使用DaleCloud(原NFine)框架的同学一直在问,如何实现一对多的主从表业务数据提交。起始这是大部分做业务系统人的常见问题。比如我们的采购订单,入库单,出库单,等常见业务单据都存在主表+明细表的业务逻辑。

那么如何实现一个页面完成主表和明细表的增删改查呢?

给大家举个例子:

前端样式

DaleCloud(原NFine)介绍:使用easyui实现主从表提交(单据业务)_第1张图片

DaleCloud(原NFine)介绍:使用easyui实现主从表提交(单据业务)_第2张图片

使用这套框架的都知道Form页面的表单如何提交,其实就是在Form页增加一个easyUI的datagrid组件,然后通过datagrid的editor功能实现明细数据的增删改功能。然后再提交的时候把datagrid里的数据打包和Form表单一起提交到后台,后台取出数据转换成明细表的实体数组即可。

 

1、Form页面的Html代码

form页面使用easyUI的easyui-layout 将页面分为上下两部分。上部分north为主表Form表单。下部分center为明细表的Datagrid;

关于Datagrid的创建以及实现列可编辑的方法见http://www.jeasyui.net/plugins/183.html

项目名称
项目编号 单据类别
项目审批人 采购确认人
备注说明
物料名称 规格型号 技术参数 厂家 数量 价格 库存 交货日期 存货编号 备注

2、前端JS实现将DataGrid中的明细数据打包提交

这里面有三个注意的:一个是对Datagrid编辑的操作和验证。一个是获取所有行的数据。另一个数form表单提交的时候附加明细;

 var keyValue = $.request("keyValue");
    $(function () {
        initControl();
        if (!!keyValue) {
            $.ajax({
                url: "/ProjectManage/InterPurchase/GetFormJson",
                data: { keyValue: keyValue },
                dataType: "json",
                async: false,
                success: function (data) {
                    $('#form1').form('load', data.main);
                }
            });
            var queryJson = {
                keyValue: keyValue
            }
            $('#dg_detail').datagrid('load', queryJson);
        }
    });
    //初始化
    function initControl() {
        $.ajax({
            url: "/BizData/GetSysUserJson",
            type: "get",
            dataType: "json",
            async: false,
            success: function (data) {
                $("#T_ApproverId").combogrid({
                    data: data,
                    multiple: true,
                    panelWidth: 220,
                    idField: 'F_Id',
                    textField: 'F_RealName',
                    columns: [[
                        { field: 'F_RealName', title: '名字', width: 100 },
                        { field: 'F_DepartmentId', title: '部门', width: 100 }
                    ]],
                    filter: function (q, row) {
                        var opts = $(this).combogrid('options');
                        return row[opts.textField].indexOf(q) >= 0;
                    }
                });

                $("#T_ReceiverId").combogrid({
                    data: data,
                    multiple: true,
                    panelWidth: 220,
                    idField: 'F_Id',
                    textField: 'F_RealName',
                    value: '172461185220895901',
                    columns: [[
                        { field: 'F_RealName', title: '名字', width: 100 },
                        { field: 'F_DepartmentId', title: '部门', width: 100 }
                    ]],
                    filter: function (q, row) {
                        var opts = $(this).combogrid('options');
                        return row[opts.textField].indexOf(q) >= 0;
                    }
                });

            }
        });
        $('#dg_detail').datagrid({
            url: "/ProjectManage/InterPurchase/GetDetailGridJson",
            toolbar: '#toolbar',
            hideColumn: "T_Id",
            method: 'get',
            autoRowHeight: false,
            nowrap: true,
            singleSelect: true,
            queryParams: {
                keyword: "",
                keyValue: keyValue
            },
            onClickRow: onClickRow

        });
    }
    //审核表单
    function submitConfirm() {
        $.modalConfirm("注:是否确认同意审核采购申请?", function (r) {
            if (r) {
                if (endEditing()) {
                    $('#dg_detail').datagrid('acceptChanges');
                } else {
                    $.modalMsg("请检查订单明细", "warning");
                    return;
                }
                $.submitEasyUIForm({
                    form: "form1",
                    url: "/ProjectManage/InterPurchase/SubmitForm?isConfirm=true&keyValue=" + keyValue,
                    param: { details: getrows() },
                    success: function () {
                        $.currentWindow().$('#dg_detail').datagrid('load');
                    }
                })
            }
        });
    }

    //提交Form表单
    function submitForm() {
        // 先验证明细是否完成编辑
        if (endEditing()) {
            $('#dg_detail').datagrid('acceptChanges');
        } else {
            $.modalMsg("请检查订单明细", "warning");
            return;
        }
        $.submitEasyUIForm({
            form: "form1",
            url: "/ProjectManage/InterPurchase/SubmitForm?isConfirm=false&keyValue=" + keyValue,
            param: { details: getrows() },//将fdatagrid数据打包提交
            success: function () {
                $.currentWindow().$('#dg_detail').datagrid('load');
            }
        })
    }
    //定义当前可编辑行的index
    var editIndex = undefined;
    // 结束当前编辑行的编辑操作
    function endEditing() {
        if (editIndex == undefined) { return true }
        if ($('#dg_detail').datagrid('validateRow', editIndex)) {
            $('#dg_detail').datagrid('endEdit', editIndex);
            editIndex = undefined;
            return true;
        } else {
            return false;
        }
    }
    // 单击行实现其他行取消编辑,当前行开始编辑
    function onClickRow(index) {
        if (editIndex != index) {
            if (endEditing()) {
                $('#dg_detail').datagrid('selectRow', index)
                        .datagrid('beginEdit', index);
                editIndex = index;
            } else {
                $('#dg_detail').datagrid('selectRow', editIndex);
            }
        }
    }
    // 添加新的一行,并且设置库存数据初始值为1
    function append() {
        if (endEditing()) {
            $('#dg_detail').datagrid('appendRow', { T_Quantity: 1 });
            editIndex = $('#dg_detail').datagrid('getRows').length - 1;
            $('#dg_detail').datagrid('selectRow', editIndex).datagrid('beginEdit', editIndex);
        }
    }
    // 移除行(移除前先取消编辑)
    function removeit() {
        if (editIndex == undefined) { return }
        $('#dg_detail').datagrid('cancelEdit', editIndex)
                .datagrid('deleteRow', editIndex);
        editIndex = undefined;
    }
    // 结束编辑并将datagrid设置为接收数据变化,这样才能正确获取到行的数据
    function accept() {
        if (endEditing()) {
            $('#dg_detail').datagrid('acceptChanges');
        }
    }
    //获取datagrid的所有行数据,并转为json字符串格式
    function getrows() {
        var rows = $('#dg_detail').datagrid('getRows');
        var entities = '';
        for(i = 0;i < rows.length;i++)
        {
            entities = entities  + JSON.stringify(rows[i]);
        }
        return JSON.stringify(rows);
    }

3、后台接收提交数据的代码

我们常规的Form表单提交方法SubmitForm方法的参数主要是主键和Mode实体。如果有明细数据,那么需要添加一个参数,我命名为string类型的details。然后新建一个明细表实体的数组。通过.ToList()方法即可将json字符串转为实体数组。然后提交

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult SubmitForm(PurchaseMainEntity uEntity,string details, string keyValue,bool isConfirm)
        {
            try
            {
                List detail=new List();
                detail = details.ToList();
                app.SubmitForm(uEntity, detail, keyValue, isConfirm);
                return Success("操作成功。");
            }
            catch(Exception ex)
            {
                return Error(ex.Message);
            }
          
        }

4、Application业务中的保存方法

先保存主表,然后循环保存明细表;我这里没有做保存失败的回滚。建议大家做好这个验证;

/// 
        /// 保存
        /// 
        /// 
        /// 
        /// 
        /// 是否确认
        public void SubmitForm(PurchaseMainEntity mEntity, List details, string keyValue, bool isConfirm)
        {
           
            if(details==null || details.Count == 0)
            {
                throw new Exception("请添加明细");
            }
            mEntity.T_Approver = CommonApp.GetUserName(mEntity.T_ApproverId);
            mEntity.T_Receiver = CommonApp.GetUserName(mEntity.T_ReceiverId);
            if (!string.IsNullOrEmpty(keyValue))
            {
                mEntity.Modify(keyValue);
                mEntity.T_Originator = CommonApp.GetUserName(mEntity.T_CreatorUserId);
                service.Update(mEntity);
            }
            else
            {
                mEntity.Create();
                mEntity.T_OriginatorId = mEntity.T_CreatorUserId;
                mEntity.T_Originator = CommonApp.GetUserName(mEntity.T_CreatorUserId);
                mEntity.T_OrderNo = Utils.GetOrderNumber();
                service.Insert(mEntity);
            }
            if (!string.IsNullOrEmpty(mEntity.T_Id))
            {
                detailservice.Delete(t => t.T_PurchaseId == mEntity.T_Id);
            }
           
            // 明细处理
            foreach (PurchaseDetailsEntity detail in details)
            {
               
                detail.T_Id = CommonUtils.GuId();
                detail.T_PurchaseId = mEntity.T_Id;
                detail.T_OrderNo = mEntity.T_OrderNo;
                detailservice.Insert(detail);
            }
            if (isConfirm)
            {
                InterPurchaseWorkMsg.OrderNoticeiMsgtoApprover(mEntity);
            }
        }

 

你可能感兴趣的:(DaleCloud框架,Web前端开发)