easyUI dialog弹出框动态计算数量和价格总结

本文档详细记录了使用easyUI实现弹出框动态添加服务项目并计算价格的过程,包括添加、数量增减、总价计算等功能。在用户选择服务项目后,弹窗展示服务详情,允许用户修改数量,实时更新原价和总价。通过遍历已选服务项目和数据库数据,实现了数量的正确累加和减少。同时,文中还分享了在处理过程中遇到的问题和解决方案,如点击数量框加减功能的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做一个项目时用到了easyUI 弹出款动态添加服务项目和计算价格,因为刚接触easyUI所以好多都是现查的文档,还有一些是问的老员工,很感谢老员工提供的解决思路,终于一路磕磕绊绊实现了功能,现在把功能实现记录下来以便回顾

完成图效果是这样的

这里面可以分为几个部分 ,点击添加打开弹窗展示服务项目,点击添加把数据添加到已选服务项目中,再次点击的时候如果服务项目存在就会增加数量,计算原价和总价,点击加减号也可以对数量进行加减

首先点击添加加载datagrid数据比较简单

/**
    * Name 打开添加窗口
    */
    function openBhConsumeDetail(){
        var items = $('#bhConsumeDetail-datagrid').datagrid('getSelections');
        var item = $('#bhConsumeDetail-datagrid').datagrid('getSelected');
        var flag=0;
        $(items).each(function(){
            flag++;    
        });
        if(flag==0){
            $.messager.alert('信息提示',"请先选择数据行!",'info');
            return;
        }
        else if(flag>1){
            $.messager.alert('信息提示',"只能选择单条数据!",'info');
            return;
        }
        $('#bhConsumeDetail-dialog').dialog({
            closed: false,
            modal:true,
            title: "添加服务项目", 
            buttons: [{
                text: '确定',
                iconCls: 'icon-ok',
                id:"addButton",
                handler: AddConsumeDetail 
            }, {
                text: '取消',
                iconCls: 'icon-cancel',
                handler: function () {
                    $('#bhConsumeDetail-dialog').dialog('close');
                   
                }
            }],
            onClose: function () {
                $('#bhConsumeDetail-dialog').dialog('close');
            }
            
        });

/**
        * Name 载入数据
        */
        $('#serviceCharge-datagrid').datagrid({
            url:'<%=path%>/scServiceCharge/listScServiceCharge',
            method:'GET',
            striped:true,
            checkOnSelect:false,
            rownumbers:true,
            singleSelect:false,
            pageSize:20,
            pageList:[10,20],
            pagination:true,
            multiSort:true,
            fitColumns:true,
            fit:true,
            columns:[[
                { field:'id',title:'id',width:100,sortable:true,checkbox:true},
                { field:'serviceName',title:'服务项目',width:100},
                { field:'servicePrice',title:'收费价格',width:100},
                { field:'servicePriceUnit',title:'价格单位',width:100},
                { field:'consumeNumber',title:'数量',width:100 ,formatter:
                    function(value,row,index){
                        return '<input id="'+row.id+'" type="number" name="points" value="1" min="0" style="width:50px; " />';
                    }
                }
            ]],
             onClickRow: function(rowIndex, rowData){
                    $(this).datagrid('selectRow', rowIndex);
                    $(this).datagrid('checkRow', rowIndex);
                   
                },
        
        });
        
        /* 数据库已选服务项目载入  */
        var item = $('#bhConsumeDetail-datagrid').datagrid('getSelected');
        $('#edit-consumeDetail-datagrid').datagrid({
            url:'<%=path%>/bhConsumeDetail/selectBhConsume',
            queryParams: { serviceApplyId: item.id },
            method:'GET',
            checkOnSelect:false,
            striped:true,     //设置为 true,则把行条纹化
            rownumbers:true, //设置为 true,则显示带有行号的列。
            singleSelect:false, //设置为 true,则只允许选中一行
            pageSize:20,
            pageList:[10,20],
            pagination:true,
            multiSort:true,//定义是否启用多列排序
            fitColumns:true, //设置为 true,则会自动扩大或缩小列的尺寸以适应网格的宽度并且防止水平滚动。
            fit:true,
            columns:[[
                { field:'chargeId',title:'id',width:100,sortable:true,checkbox:true},
                { field:'serviceName',title:'服务项目',width:100},
                { field:'consumePrice',title:'收费价格',width:100},
                { field:'consumeNumber',title:'数量',formatter:
                    function(value,row,index){
                    
                    return     '<div ><input type="button" class="reduce" style="width:20px; margin-right:1px; " name="minus" value="-" onclick="jian(\'select'+row.chargeId+'\')">'+
                            '<input type="text" class="textNum" style="width:15px; height:14px;" name="amount" value="'+value+'" id="select'+row.chargeId+'">'+
                            '<input type="button" class="add" style="width:20px; margin-left:1px;" name="plus" value="+" onclick="jia(\'select'+row.chargeId+'\')"></div>';
            }
                    
                },
                { field:'originalPrice',title:'原价',width:100},
                { field:'isBuild',title:'是否生成订单',width:100,formatter:
                     function(value,row,index){
                        if(value==true){
                            return "<font color='green'>是</font>";
                        }else if(value==false){
                            return "<font color='red'>否</font>";
                        }
                }}
            ]],
            onLoadSuccess: function(data){//加载完毕后获取所有的checkbox遍历
                if (data.rows.length > 0) {
                    //循环判断操作为新增的不能选择
                    for (var i = 0; i < data.rows.length; i++) {
                        //根据isBuild让某些行不可选
                        if (data.rows[i].isBuild ==true) {
                            $("input[name='chargeId']")[i].disabled = true;
                            $("input[name='minus']")[i].disabled=true;
                            $("input[name='amount']")[i].disabled=true;
                            $("input[name='plus']")[i].disabled=true;
                        }
                    }
                }
                $(".datagrid-header-check").html("<input type='checkbox' id='selectAll'/>");
                $('#selectAll').change(function(){
                    var status=$(this).is(':checked');
                    $('input:checkbox[name="chargeId"]').each(function(rowIndex,el){
                        if(!$(this).is(":disabled")){
                            $("#edit-consumeDetail-datagrid").datagrid("selectRow",rowIndex);
                        }else{
                            $("#edit-consumeDetail-datagrid").datagrid("unselectRow",rowIndex);
                        }
                    })
                })
                total();
               
            },
            onClickRow: function(rowIndex, rowData){
                $(this).datagrid('selectRow', rowIndex);
                //加载完毕后获取所有的checkbox遍历
                $("input[name='chargeId']").each(function(index, el){
                    //如果当前的复选框不可选,则不让其选中
                    if (el.disabled == true) {
                        $('#edit-consumeDetail-datagrid').datagrid('unselectRow', index);
                    }
                })
                
            },
            
          
        });
    }

 

/**
    * Name  添加服务项 目
    */
    function AddConsumeDetail(){

        var scrows = $('#edit-consumeDetail-datagrid').datagrid('getSelections');
         var item = $('#bhConsumeDetail-datagrid').datagrid('getSelected');
         var details=new Array();
         //console.log(scrows);
        for(i = 0;i < scrows.length;i++){
            var serviceApplyId= item.id;
            var arrs={};
            arrs.id=scrows[i].chargeId;
            arrs.serviceName=scrows[i].serviceName;
            arrs.servicePrice=scrows[i].consumePrice;
            arrs.consumeNumber=$("#select"+scrows[i].chargeId).val();
            console.log("number==="+arrs.consumeNumber);
            arrs.saServiceApplyId=serviceApplyId;
            details[i]=arrs;

        }
         //console.log(details); 
         //return;
         $.messager.confirm('信息提示','是否确认提交?', function(result){
            if(result){
                $.ajax({
                    url:'<%=path%>/bhConsumeDetail/addBhConsumeDetail',
                    type:'POST',
                    dataType: "json",
                    contentType: "application/json",
                    data:JSON.stringify(details),
                    success:function(data){
                        if(data.success){
                            $.messager.show({
                                title: '信息提示',
                                msg: "服务添加成功",
                                timeout: 2000,
                                showtype: 'slide',
                            })
                            
                            $('#bhConsumeDetail-dialog').dialog('close');
                            reload();
                        }
                        else
                        {
                            $.messager.show({
                                title: '信息提示',
                                msg: data.errorDescription,
                                timeout: 2000,
                                showtype: 'slide',
                            });    
                        }
                    }    
                });
            }
        });

树的数据是直接载入进来的,和服务项目放在一起就行,然后做增加和删除操作 

/**
    *页面增加 
    */
    function addService(){
        var nameRows = $('#serviceCharge-datagrid').datagrid('getSelections'); //选择添加的服务项目 
        var lists = $('#edit-consumeDetail-datagrid').datagrid('getRows');//数据库已添加的服务项目 
        var flag = true;
        for(var i=0;i<nameRows.length;i++){
            var num=$("#"+nameRows[i].id+"").val();
            for( var j=0;j<lists.length;j++){
                if(nameRows[i].serviceName==lists[j].serviceName && lists[j].isBuild==false){
                    flag=false;
                    var consumeNum=parseInt(lists[j].consumeNumber);
                    consumeNum +=parseInt(num);  
                    $('#edit-consumeDetail-datagrid').datagrid('updateRow',{
                        index:j,
                        row: {
                            consumeNumber: consumeNum,
                            originalPrice:parseFloat(consumeNum*nameRows[i].servicePrice).toFixed(2)
                        }
                    });
                    
                    break;
                }else{
                    flag=true;
                }
            }
            if(flag==true){
                 $('#edit-consumeDetail-datagrid').datagrid('appendRow',{
                 id:nameRows[i].id,
                chargeId:nameRows[i].id,
                serviceName: nameRows[i].serviceName,
                consumePrice: nameRows[i].servicePrice,
                consumeNumber:num,
                originalPrice:num*nameRows[i].servicePrice,
                isBuild:false
            });    
            $('#edit-consumeDetail-datagrid').datagrid('checkRow',lists.length-1);
            }

        }
        total();
        
    }

做删除操作的时候我也想到了用flag来判断是否存在相同的服务项目但是效果总不是自己想要的,后来在一篇博客上看到让我恍然大悟。在把flag设为 false跳出的时候,没有进行else{   flag=true;} 判断导致最后添加多条数据的时候只能增加第一个,后面的增加不了。接下来是删除了,这里我做的复杂了点,其实只要取到所有选择的 id 根据ID删就行了,由于水平不高所以写复杂了但是功能也实现了

/**
    *页面删除 
    */
    function deleteService(){
         var selections  =$('#edit-consumeDetail-datagrid').datagrid('getSelections');
        var selectRows = [];
        var services=new Array();
        for ( var i= 0; i< selections.length; i++) {
            selectRows.push(selections[i]);
            for(var j =0;j<selectRows.length;j++){
                var index = $('#edit-consumeDetail-datagrid').datagrid('getRowIndex',selectRows[j]);
            }
            $('#edit-consumeDetail-datagrid').datagrid('deleteRow',index);
            
            var service ={};
            service.serviceName=selections[i].serviceName;
            service.id=selections[i].id;
            services[i]=service;
        }
        $(function(result){
            if(result){
                $.ajax({
                    url:'<%=path%>/bhConsumeDetail/deleteBhConsumeDetail',
                        type:'POST',
                        dataType: "json",
                        contentType: "application/json",
                        data:JSON.stringify(services),
                    });    

                }
        });
                total();
    }

接来下就我比较头疼的点击数量框加减了,由于前端不太熟悉,所以这个地方做的头都大了,一开始被我去掉这个功能,后来项目经理说这个功能还是需要的,又让我加上去,我也没什么思路,项目经理详细的指点了我怎么怎么解决,但是自己还是有些懵,然后就边做边整理思路,一开始我做的是改变input框的value的形式改变数量的,这样虽然实现了数量变化但是在点击添加的时候就会出现数量错误,因为添加改变的是 datagrid的列属性,两者不一致。于是又一番修改之后有了接下来的代码

function jian(inputId){
        
        var num =parseInt($("#"+inputId).val());
        //$(inputId).val(parseInt(num)-1);
        var lists = $('#edit-consumeDetail-datagrid').datagrid('getRows');//数据库已添加的服务项目
        for( var i=0;i<lists.length;i++){
            if(("select"+lists[i].chargeId)==inputId){
                if(num>1){
                    num--;
                    $('#edit-consumeDetail-datagrid').datagrid('updateRow',{
                        index:i,
                        row: {
                            consumeNumber: num,
                            originalPrice:parseFloat(num*lists[i].consumePrice).toFixed(2)
                        }
                    });
                }else{
                    $('#edit-consumeDetail-datagrid').datagrid('updateRow',{
                        index:i,
                        row: {
                            consumeNumber: 1,
                            originalPrice:parseFloat(1*lists[i].consumePrice).toFixed(2)
                        }
                    });
                }
            }
        }
        total();
        
    }

通过返回的ID 遍历已选择的服务项目,如果存在ID相同的那就直接通过updateRow的方式改变数量,添加也是同样的方式所以就不会出现 数量错误了,当时由于前端很渣 没想到怎么获取datagrid单独的一列的方式思路就没通,还是感谢项目经理提供的思路。在获取onclick事件传的参的时候也出现了一些问题,之前是这样写的 onclick="jian(select'+row.chargeId+')" 虽然参可以传过来但是前端会报错 ,后来才发现需要转义才行于是就改成这样 onclick="jian(\'select'+row.chargeId+'\')" 可以获取值了

这样这个功能基本上就完成了,但是在添加的时候如果数据库里存在相同的服务项目的时候 就会出现相同的 row.chargeId 添加的时候获取的数量就是数据库里的那个数量,而不是我想要的那个数量,有没有大佬能在当前的状态下 提供一下解决思路呀 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值