コード例 #1
0
ファイル: SettlementController.cs プロジェクト: zjchenxk/SYLS
        public ActionResult ExportCustomerStatement()
        {
            #region 生成数据源

            string strErrText;

            var request = HttpContext.Request;

            string strStartTime = request.QueryString["startTime"] ?? string.Empty;
            string strEndTime = request.QueryString["endTime"] ?? string.Empty;
            string strPayerName = request.QueryString["payerName"] ?? string.Empty;
            string strReceiverName = request.QueryString["receiverName"] ?? string.Empty;
            string strStartCountry = request.QueryString["startCountry"] ?? string.Empty;
            string strStartProvince = request.QueryString["startProvince"] ?? string.Empty;
            string strStartCity = request.QueryString["startCity"] ?? string.Empty;
            string strDestCountry = request.QueryString["destCountry"] ?? string.Empty;
            string strDestProvince = request.QueryString["destProvince"] ?? string.Empty;
            string strDestCity = request.QueryString["destCity"] ?? string.Empty;
            string strCarrierName = request.QueryString["carrierName"] ?? string.Empty;
            string strCarNo = request.QueryString["carNo"] ?? string.Empty;
            string strGoodsName = request.QueryString["goodsName"] ?? string.Empty;
            string strAllowStatementWhenConsignedDeliverPlanNotCompleted = request.QueryString["allowStatementWhenConsignedDeliverPlanNotCompleted"] ?? "false";

            //读取数据
            SettlementSystem settlement = new SettlementSystem();
            List<CustomerStatement> listStatement = settlement.LoadCustomerStatementByConditions(strStartTime, strEndTime, strPayerName, strReceiverName, strStartCountry, strStartProvince, strStartCity, strDestCountry, strDestProvince, strDestCity, strCarrierName, strCarNo, strGoodsName, strAllowStatementWhenConsignedDeliverPlanNotCompleted, LoginAccountId, LoginStaffName, out strErrText);
            if (listStatement == null)
            {
                throw new Exception(strErrText);
            }

            //根据结算公式计算运费
            foreach (CustomerStatement statement in listStatement)
            {
                if (statement.TransportCharges == 0 && statement.SettlementExpression != null && statement.SettlementExpression != string.Empty)
                {
                    try
                    {
                        EvaluatorHelper evaluator = new EvaluatorHelper();

                        evaluator.SetExpression(statement.SettlementExpression);

                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.KM, statement.KM == null || statement.KM == string.Empty ? "0" : statement.KM);
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.Tunnages, statement.TotalTunnages.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.Piles, statement.TotalPiles.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.TransportPrice, statement.TransportPrice.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.TransportCharges, "0");

                        string strTransportCharges = evaluator.EvaluateExpression();
                        statement.TransportCharges = decimal.Parse(strTransportCharges);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }

            //计算拼车费
            var grpShipmentNos = listStatement.GroupBy(s => s.ShipmentNo).OrderBy(s => s.Key);
            foreach (var grpShipmentNo in grpShipmentNos)
            {
                if (grpShipmentNo.Key != null && grpShipmentNo.Key != string.Empty)
                {
                    List<CustomerStatement> listShipmentNoDetail = grpShipmentNo.ToList<CustomerStatement>();

                    int i = 0;
                    while (i < listShipmentNoDetail.Count)
                    {
                        if (i > 0)
                        {
                            int j = 0;
                            while (j < i)
                            {
                                if (listShipmentNoDetail[i].ReceiverAddress == listShipmentNoDetail[j].ReceiverAddress)
                                {
                                    break;
                                }
                                j++;
                            }
                            if (j >= i)
                            {
                                listShipmentNoDetail[i].CarpoolFee = 100;
                            }
                        }
                        i++;
                    }
                }
            }

            //生成结果数据
            List<CustomerStatement> listRet = new List<CustomerStatement>();
            {
                //按客户分组
                var grpCustomerNames = listStatement.GroupBy(f => f.CustomerName).OrderBy(f => f.Key);
                foreach (var grpCustomerName in grpCustomerNames)
                {
                    List<CustomerStatement> data = grpCustomerName.ToList<CustomerStatement>();
                    listRet.AddRange(data);

                    //生成小计行
                    CustomerStatement subtotal = new CustomerStatement();
                    subtotal.CustomerName = grpCustomerName.Key;
                    subtotal.CreateTime = InnoSoft.LS.Resources.Labels.Subtotal;
                    subtotal.TotalPackages = data.Sum(s => s.TotalPackages);
                    subtotal.TotalTunnages = data.Sum(s => s.TotalTunnages);
                    subtotal.TotalPiles = data.Sum(s => s.TotalPiles);
                    subtotal.TotalTenThousands = data.Sum(s => s.TotalTenThousands);
                    subtotal.TransportCharges = data.Sum(s => s.TransportCharges);
                    subtotal.CarpoolFee = data.Sum(s => s.CarpoolFee);
                    subtotal.RiverCrossingCharges = data.Sum(s => s.RiverCrossingCharges);
                    listRet.Add(subtotal);
                }

                //生成合计行
                CustomerStatement total = new CustomerStatement();
                total.CustomerName = InnoSoft.LS.Resources.Labels.Total;
                total.TotalPackages = listStatement.Sum(s => s.TotalPackages);
                total.TotalTunnages = listStatement.Sum(s => s.TotalTunnages);
                total.TotalPiles = listStatement.Sum(s => s.TotalPiles);
                total.TotalTenThousands = listStatement.Sum(s => s.TotalTenThousands);
                total.TransportCharges = listStatement.Sum(s => s.TransportCharges);
                total.CarpoolFee = listStatement.Sum(s => s.CarpoolFee);
                total.RiverCrossingCharges = listStatement.Sum(s => s.RiverCrossingCharges);
                listRet.Add(total);
            }

            #endregion

            #region 导出Excel

            #region 创建Excel工作簿

            var workbook = new HSSFWorkbook();
            var sheet = workbook.CreateSheet();

            #endregion

            #region 设置列宽度

            int iCol = 0;
            sheet.SetColumnWidth(iCol++, 15 * 256);//客户名称
            sheet.SetColumnWidth(iCol++, 10 * 256);//发货日期
            sheet.SetColumnWidth(iCol++, 13 * 256);//计划单号
            sheet.SetColumnWidth(iCol++, 11 * 256);//交货单号
            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.ShipmentNo != null && cs.ShipmentNo != string.Empty; }).Count() > 0)
            {
                sheet.SetColumnWidth(iCol++, 11 * 256);//装运单号
            }
            sheet.SetColumnWidth(iCol++, 15 * 256);//收货单位名称
            sheet.SetColumnWidth(iCol++, 20 * 256);//收货单位地址
            sheet.SetColumnWidth(iCol++, 6 * 256);//起点
            sheet.SetColumnWidth(iCol++, 6 * 256);//讫点
            sheet.SetColumnWidth(iCol++, 10 * 256);//车号
            sheet.SetColumnWidth(iCol++, 10 * 256);//货物名称
            if (listRet.Sum(cs => cs.TotalPackages) != 0)
            {
                sheet.SetColumnWidth(iCol++, 4 * 256);//件数
            }
            if (listRet.Sum(cs => cs.TotalTunnages) != 0)
            {
                sheet.SetColumnWidth(iCol++, 9 * 256);//吨数
            }
            if (listRet.Sum(cs => cs.TotalPiles) > 0)
            {
                sheet.SetColumnWidth(iCol++, 8 * 256);//垛数
            }
            if (listRet.Sum(cs => cs.TotalTenThousands) > 0)
            {
                sheet.SetColumnWidth(iCol++, 8 * 256);//万只
            }
            sheet.SetColumnWidth(iCol++, 6 * 256);//运费单价
            sheet.SetColumnWidth(iCol++, 10 * 256);//运费金额
            if (listRet.Sum(cs => cs.CarpoolFee) > 0)
            {
                sheet.SetColumnWidth(iCol++, 8 * 256);//拼车费
            }
            if (listRet.Sum(cs => cs.RiverCrossingCharges) > 0)
            {
                sheet.SetColumnWidth(iCol++, 8 * 256);//过江费
            }
            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark != null && cs.Remark != string.Empty; }).Count() > 0)
            {
                sheet.SetColumnWidth(iCol++, 15 * 256);//备注
            }
            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark2 != null && cs.Remark2 != string.Empty; }).Count() > 0)
            {
                sheet.SetColumnWidth(iCol++, 15 * 256);//备注2
            }
            sheet.SetColumnWidth(iCol++, 6 * 256);//回单标志

            #endregion

            #region 创建表头

            //标题
            var rowTitle = sheet.CreateRow(0);
            rowTitle.HeightInPoints = 30;
            rowTitle.CreateCell(0).SetCellValue(strPayerName + InnoSoft.LS.Resources.Titles.CustomerTransportChargesStatement);

            ICellStyle styleTitle = workbook.CreateCellStyle();
            styleTitle.Alignment = HorizontalAlignment.CENTER;
            IFont fontTitle = workbook.CreateFont();
            fontTitle.FontHeightInPoints = 20;
            styleTitle.SetFont(fontTitle);
            rowTitle.GetCell(0).CellStyle = styleTitle;

            var rowTitle2 = sheet.CreateRow(1);
            rowTitle2.HeightInPoints = 22;
            rowTitle2.CreateCell(0).SetCellValue(strStartTime + InnoSoft.LS.Resources.Labels.Separator1 + strEndTime);

            ICellStyle styleTitle2 = workbook.CreateCellStyle();
            styleTitle2.Alignment = HorizontalAlignment.CENTER;
            IFont fontTitle2 = workbook.CreateFont();
            fontTitle2.FontHeightInPoints = 12;
            styleTitle2.SetFont(fontTitle2);
            rowTitle2.GetCell(0).CellStyle = styleTitle2;

            //表头
            ICellStyle styleLeft = workbook.CreateCellStyle();
            styleLeft.Alignment = HorizontalAlignment.LEFT;
            styleLeft.BorderBottom = CellBorderType.THIN;
            styleLeft.BorderLeft = CellBorderType.THIN;
            styleLeft.BorderRight = CellBorderType.THIN;
            styleLeft.BorderTop = CellBorderType.THIN;

            ICellStyle styleCenter = workbook.CreateCellStyle();
            styleCenter.Alignment = HorizontalAlignment.CENTER;
            styleCenter.BorderBottom = CellBorderType.THIN;
            styleCenter.BorderLeft = CellBorderType.THIN;
            styleCenter.BorderRight = CellBorderType.THIN;
            styleCenter.BorderTop = CellBorderType.THIN;

            ICellStyle styleRight = workbook.CreateCellStyle();
            styleRight.Alignment = HorizontalAlignment.RIGHT;
            styleRight.BorderBottom = CellBorderType.THIN;
            styleRight.BorderLeft = CellBorderType.THIN;
            styleRight.BorderRight = CellBorderType.THIN;
            styleRight.BorderTop = CellBorderType.THIN;

            var rowHeader = sheet.CreateRow(2);

            iCol = 0;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.CustomerName);//客户名称
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.DeliverDate);//发货日期
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.PlanNo);//计划单号
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.DeliveryNo);//交货单号
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.ShipmentNo != null && cs.ShipmentNo != string.Empty; }).Count() > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.ShipmentNo);//装运单号
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.ReceiverName);//收货单位名称
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.ReceiverAddress);//收货单位地址
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.StartPlace);//起点
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.DestPlace);//讫点
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.CarNo);//车号
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.GoodsName);//货物名称
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            if (listRet.Sum(cs => cs.TotalPackages) != 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.Pieces);//件数
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.Sum(cs => cs.TotalTunnages) != 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.Tunnages);//吨数
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.Sum(cs => cs.TotalPiles) > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.Piles);//垛数
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.Sum(cs => cs.TotalTenThousands) > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.TenThousands);//万只
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.TransportPrice);//运费单价
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.TransportCharges);//运费金额
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            if (listRet.Sum(cs => cs.CarpoolFee) > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.CarpoolFee);//拼车费
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.Sum(cs => cs.RiverCrossingCharges) > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.RiverCrossingCharges);//过江费
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark != null && cs.Remark != string.Empty; }).Count() > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.Remark);//备注
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark2 != null && cs.Remark2 != string.Empty; }).Count() > 0)
            {
                rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.Remark + "2");//备注
                rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;
            }

            rowHeader.CreateCell(iCol++).SetCellValue(InnoSoft.LS.Resources.Labels.ReceiptReceived);//回单标志
            rowHeader.GetCell(iCol - 1).CellStyle = styleCenter;

            sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, iCol - 1));
            sheet.AddMergedRegion(new CellRangeAddress(1, 1, 0, iCol - 1));

            #endregion

            #region 创建表体

            int iRow = 3;
            foreach (var ret in listRet)
            {
                var rowBody = sheet.CreateRow(iRow++);

                iCol = 0;

                rowBody.CreateCell(iCol++).SetCellValue(ret.CustomerName);//客户名称
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.CreateTime);//发货日期
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.PlanNo);//计划单号
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.DeliveryNo);//交货单号
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.ShipmentNo != null && cs.ShipmentNo != string.Empty; }).Count() > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.ShipmentNo);//装运单号
                    rowBody.GetCell(iCol - 1).CellStyle = styleLeft;
                }

                rowBody.CreateCell(iCol++).SetCellValue(ret.ReceiverName);//收货单位名称
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.ReceiverAddress);//收货单位地址
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.StartCity);//起点
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.ReceiverCity);//讫点
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.CarNo);//车号
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                rowBody.CreateCell(iCol++).SetCellValue(ret.GoodsName);//货物名称
                rowBody.GetCell(iCol - 1).CellStyle = styleLeft;

                if (listRet.Sum(cs => cs.TotalPackages) != 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.TotalPackages != 0 ? ret.TotalPackages.ToString() : string.Empty);//件数
                    rowBody.GetCell(iCol - 1).CellStyle = styleCenter;
                }

                if (listRet.Sum(cs => cs.TotalTunnages) != 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.TotalTunnages != 0 ? ret.TotalTunnages.ToString("#0.######") : string.Empty);//吨数
                    rowBody.GetCell(iCol - 1).CellStyle = styleCenter;
                }

                if (listRet.Sum(cs => cs.TotalPiles) > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.TotalPiles > 0 ? ret.TotalPiles.ToString("#0.######") : string.Empty);//垛数
                    rowBody.GetCell(iCol - 1).CellStyle = styleCenter;
                }

                if (listRet.Sum(cs => cs.TotalTenThousands) > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.TotalTenThousands > 0 ? ret.TotalTenThousands.ToString("#0.######") : string.Empty);//万只
                    rowBody.GetCell(iCol - 1).CellStyle = styleCenter;
                }

                rowBody.CreateCell(iCol++).SetCellValue(ret.TransportPrice > 0 ? ret.TransportPrice.ToString("#0.00####") : string.Empty);//运费单价
                rowBody.GetCell(iCol - 1).CellStyle = styleRight;

                rowBody.CreateCell(iCol++).SetCellValue(ret.TransportCharges != 0 ? ret.TransportCharges.ToString("N2") : string.Empty);//运费金额
                rowBody.GetCell(iCol - 1).CellStyle = styleRight;

                if (listRet.Sum(cs => cs.CarpoolFee) > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.CarpoolFee > 0 ? ret.CarpoolFee.ToString("N2") : string.Empty);//拼车费
                    rowBody.GetCell(iCol - 1).CellStyle = styleRight;
                }

                if (listRet.Sum(cs => cs.RiverCrossingCharges) > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.RiverCrossingCharges > 0 ? ret.RiverCrossingCharges.ToString("N2") : string.Empty);//过江费
                    rowBody.GetCell(iCol - 1).CellStyle = styleRight;
                }

                if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark != null && cs.Remark != string.Empty; }).Count() > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.Remark);//备注
                    rowBody.GetCell(iCol - 1).CellStyle = styleLeft;
                }

                if (listRet.FindAll(delegate(CustomerStatement cs) { return cs.Remark2 != null && cs.Remark2 != string.Empty; }).Count() > 0)
                {
                    rowBody.CreateCell(iCol++).SetCellValue(ret.Remark2);//备注
                    rowBody.GetCell(iCol - 1).CellStyle = styleLeft;
                }

                rowBody.CreateCell(iCol++).SetCellValue(ret.DeliverBillReceiptReceived ? InnoSoft.LS.Resources.Options.Yes : InnoSoft.LS.Resources.Options.No);//回单标志
                rowBody.GetCell(iCol - 1).CellStyle = styleCenter;
            }
            #endregion

            #region 输出Excel文件

            MemoryStream output = new MemoryStream();
            workbook.Write(output);

            return File(output.ToArray(), "application/vnd.ms-excel", "CustomerStatement.xls");

            #endregion

            #endregion
        }
コード例 #2
0
ファイル: SettlementController.cs プロジェクト: zjchenxk/SYLS
        public JsonResult LoadStatCustomerStatementGrid(string sidx, string sord, int page, int rows, string startTime, string endTime, string payerName, string receiverName, string startCountry, string startProvince, string startCity, string destCountry, string destProvince, string destCity, string carrierName, string carNo, string goodsName, string allowStatementWhenConsignedDeliverPlanNotCompleted)
        {
            //读取数据
            string strErrText;
            SettlementSystem settlement = new SettlementSystem();
            List<CustomerStatement> listStatement = settlement.LoadCustomerStatementByConditions(startTime, endTime, payerName, receiverName, startCountry, startProvince, startCity, destCountry, destProvince, destCity, carrierName, carNo, goodsName, allowStatementWhenConsignedDeliverPlanNotCompleted, LoginAccountId, LoginStaffName, out strErrText);
            if (listStatement == null)
            {
                throw new Exception(strErrText);
            }

            //根据结算公式计算运费
            foreach (CustomerStatement statement in listStatement)
            {
                if (statement.TransportCharges == 0 && statement.SettlementExpression != null && statement.SettlementExpression != string.Empty)
                {
                    try
                    {
                        EvaluatorHelper evaluator = new EvaluatorHelper();

                        evaluator.SetExpression(statement.SettlementExpression);

                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.KM, statement.KM == null || statement.KM == string.Empty ? "0" : statement.KM);
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.Tunnages, statement.TotalTunnages.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.Piles, statement.TotalPiles.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.TransportPrice, statement.TransportPrice.ToString());
                        evaluator.AddVariable(InnoSoft.LS.Resources.Labels.TransportCharges, "0");

                        string strTransportCharges = evaluator.EvaluateExpression();
                        statement.TransportCharges = decimal.Parse(strTransportCharges);
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }

            //计算拼车费
            var grpShipmentNos = listStatement.GroupBy(s => s.ShipmentNo).OrderBy(s => s.Key);
            foreach (var grpShipmentNo in grpShipmentNos)
            {
                if (grpShipmentNo.Key != null && grpShipmentNo.Key != string.Empty)
                {
                    List<CustomerStatement> listShipmentNoDetail = grpShipmentNo.ToList<CustomerStatement>();

                    int i = 0;
                    while (i < listShipmentNoDetail.Count)
                    {
                        if (i > 0)
                        {
                            int j = 0;
                            while (j < i)
                            {
                                if (listShipmentNoDetail[i].ReceiverAddress == listShipmentNoDetail[j].ReceiverAddress)
                                {
                                    break;
                                }
                                j++;
                            }
                            if (j >= i)
                            {
                                listShipmentNoDetail[i].CarpoolFee = 100;
                            }
                        }
                        i++;
                    }
                }
            }

            //提取当前页面数据
            int nTotalRows = listStatement.Count;
            int nPageIndex = page;
            int nPageSize = rows;
            int nTotalPages = nTotalRows / nPageSize;
            if (nTotalRows % nPageSize > 0)
                nTotalPages++;

            string sortExpression = (sidx ?? "CreateTime") + " " + (sord ?? "ASC");
            var data = listStatement.OrderBy(sortExpression).Skip((nPageIndex - 1) * nPageSize).Take(nPageSize).ToList();

            //生成表格数据
            var ret = new
            {
                total = nTotalPages,
                page = nPageIndex,
                records = nTotalRows,
                rows = (
                      from s in data
                      select new
                      {
                          id = s.Id,
                          cell = new string[] {
                              s.Id.ToString(),
                              s.CustomerName,
                              s.CreateTime,
                              s.PlanNo,
                              s.DeliverBillNo,
                              s.ShipmentNo,
                              s.DeliveryNo,
                              s.ReceiverName,
                              s.ReceiverAddress,
                              s.StartCity,
                              s.ReceiverCity,
                              s.KM,
                              s.CarNo,
                              s.GoodsName,
                              s.TotalPackages.ToString(),
                              s.TotalTunnages.ToString("#0.######"),
                              s.TotalPiles.ToString("#0.######"),
                              s.TotalTenThousands.ToString("#0.######"),
                              s.TransportPrice.ToString("#0.######"),
                              s.SettlementExpression,
                              s.TransportCharges.ToString(),
                              s.CarpoolFee.ToString(),
                              s.RiverCrossingCharges.ToString(),
                              s.Remark,
                              s.Remark2,
                              s.DeliverBillReceiptReceived.ToString(),
                              s.InvoiceNo
                          }
                      }).ToArray(),
                userdata = new
                {
                    CustomerName = InnoSoft.LS.Resources.Labels.Total,
                    Packages = data.Sum(s => s.TotalPackages),
                    Tunnages = data.Sum(s => s.TotalTunnages),
                    Piles = data.Sum(s => s.TotalPiles),
                    TenThousands = data.Sum(s => s.TotalTenThousands),
                    TransportCharges = data.Sum(s => s.TransportCharges),
                    CarpoolFee = data.Sum(s => s.CarpoolFee),
                    RiverCrossingCharges = data.Sum(s => s.RiverCrossingCharges)
                }
            };
            return Json(ret, JsonRequestBehavior.AllowGet);
        }