Program.cs 13.4 KB
using System;
using System.Collections;
using System.IO;
using DevExpress.DataAccess.Native.Json;
using DevExpress.DataProcessing;
using DevExpress.XtraPrinting;
using DevExpress.XtraPrinting.Drawing;
using DevExpress.XtraReports.Security;
using DevExpress.XtraReports.UI;
using Microsoft.Extensions.Configuration;
using PDFExportOpri_CLI.Modules.PdfExport;
using SqlSugar;

namespace PDFExportOpri_CLI
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {


                if (args.Length < 2)
                {
                    Console.WriteLine("Invalid Arguments...");
                    Environment.Exit(1);
                }

                ScriptPermissionManager.GlobalInstance = new ScriptPermissionManager(ExecutionMode.Unrestricted);
                var configuration = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
                    .AddJsonFile(AppDomain.CurrentDomain.BaseDirectory + "./cli-appsettings.json", false)
                    .Build();


                var outputPath = args[0];
                var reportId = args[1];
                if (Directory.Exists(outputPath))
                {
                    if (File.Exists(outputPath + "export_" + reportId + ".pdf"))
                        File.Delete(outputPath + "export_" + reportId + ".pdf");
                }
                else
                {
                    Directory.CreateDirectory(outputPath);
                }

                
                using (ReportPrinter rpt = new ReportPrinter())
                {

                    rpt.LoadModel(AppDomain.CurrentDomain.BaseDirectory + "./ModelTemp/IVEH_APP.xml");
                    
                    SqlSugarClient dbClient = new SqlSugarClient(new ConnectionConfig()
                    {
                        DbType = DbType.MySql,
                        ConnectionString = "SERVER=" + configuration["Database:Host"] + ";"
                                           + "DATABASE=" + configuration["Database:Name"] + ";"
                                           + "UID=" + configuration["Database:Username"] + ";"
                                           + "PASSWORD=" + configuration["Database:Password"] + ";"
                                           + "PORT="+configuration["Database:Port"]+";"
                    });

                    rpt.LoadData(dbClient, reportId);

                    //偏载测试图片
                    
                    int partialloadid = Convert.ToInt32(rpt.ds.Tables["dt1"].Rows[0]["partialloadid"]);
                    if (partialloadid != -1)
                    {
                        string weightNumber = rpt.ds.Tables["dt3"].Rows[0]["weightnumber"].ToString();
                        XRPictureBox p1 = (XRPictureBox)rpt.FindControl("pb_1", true);
                        if (p1 != null)
                        {
                            p1.ImageUrl = $"./bmp/fm{weightNumber}.jpg";
                        }
                        SetPartialItem(rpt);
                    }
                    SetImage(rpt);
                    SetRemark(rpt);
                    PdfExportOptions opt = rpt.ExportOptions.Pdf;
                    opt.ConvertImagesToJpeg = false;
                    opt.Compressed = true;
                    opt.ImageQuality = PdfJpegImageQuality.High;
                    rpt.ExportToPdf(outputPath + "export_" + reportId + ".pdf", opt);
                }
            }
            catch (Exception ex)
            {
                while (ex.InnerException != null)
                    ex = ex.InnerException;
                Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
                Environment.Exit(-1);
            }
            Environment.Exit(0);
        }

        private static void SetPartialItem(ReportPrinter rpt)
        {
            int loadNumber = Convert.ToInt32(rpt.ds.Tables["dt3"].Rows[0]["loadnumber"]);
            int weightNumber = Convert.ToInt32(rpt.ds.Tables["dt3"].Rows[0]["weightnumber"]);
            SetPartialRowUnvisiable(rpt, loadNumber);
            SetPartialCellUnvisiable(rpt,loadNumber,weightNumber);
            SetPartialValue(rpt,loadNumber,weightNumber);
        }

        private static void SetPartialRowUnvisiable(ReportPrinter rpt, int number)
        {
            for (int i = 5; i > number; i--)
            {
                rpt.FindControl($"tr{i}", true).Visible = false;
                rpt.FindControl($"tr{i}_0_1", true).Visible = false;
                rpt.FindControl($"tr{i}_0_2", true).Visible = false;
                rpt.FindControl($"tr{i}_1", true).Visible = false;
                rpt.FindControl($"tr{i}_2", true).Visible = false;
                rpt.FindControl($"tr{i}_3", true).Visible = false;
                rpt.FindControl($"tr{i}_4", true).Visible = false;
                rpt.FindControl($"tr{i}_5", true).Visible = false;
                rpt.FindControl($"tr{i}_6", true).Visible = false;
            }
        }

        private static void SetPartialCellUnvisiable(ReportPrinter rpt,int loadNumber, int weightNumber)
        {
            int remainRow = Convert.ToInt32(Math.Ceiling((decimal)weightNumber / 3));
            int maxCellNumber = remainRow * 3;
            if (maxCellNumber > 16) maxCellNumber = 16;

            for (int i = 1; i <= loadNumber; i++)
            {
                for (int j = 6; j > remainRow; j--)
                {
                    rpt.FindControl($"tr{i}_{j}", true).Visible = false;
                }

                for (int j = maxCellNumber; j > weightNumber; j--)
                {
                    rpt.FindControl($"tc{i}_{j}", true).Text = "";
                    rpt.FindControl($"caption_tc{i}_{j}", true).Text = "";
                }
            }
        }

        private static void SetPartialValue(ReportPrinter rpt, int loadNumber, int weightNumber)
        {
            for (int i = 1; i <= loadNumber; i++)
            {
                Newtonsoft.Json.Linq.JToken item = rpt.jPartial[i - 1];
                string testweight = item["testweight"]?.ToString();
                string loaderror = item["loaderror"]?.ToString();
                string maxerror = item["maxerror"]?.ToString();
                if (testweight != "") testweight += " kg";
                if (loaderror != "") loaderror += " kg";
                if (maxerror != "") maxerror += " kg";

                rpt.FindControl($"tc{i}_zh",true).Text = testweight;
                rpt.FindControl($"tc{i}_wc", true).Text = loaderror;
                rpt.FindControl($"tc{i}_yc", true).Text = maxerror;
                rpt.FindControl($"tc{i}_fh", true).Text = item["conformname"]?.ToString();
                rpt.FindControl($"tc{i}_mx", true).Text = item["fillname"]?.ToString();

                if (item["fillcode"]?.ToString() != "01")
                {
                    for (int j = 1; j <= 6; j++)
                    {
                        rpt.FindControl($"tr{i}_{j}", true).Visible = false;
                    }
                }
                else
                {
                    Newtonsoft.Json.Linq.JArray deviation = item["deviation"] as Newtonsoft.Json.Linq.JArray;
                    Newtonsoft.Json.Linq.JToken dItem = null;
                    for (int j = 1; j <= weightNumber; j++)
                    {
                        try
                        {
                            dItem = deviation[j - 1];
                        }
                        catch
                        {
                            dItem = null;
                        }

                        if (dItem != null)
                        {
                            string devString = dItem["deviation"]?.ToString();
                            if (devString != "") devString += " kg";
                            rpt.FindControl($"tc{i}_{j}", true).Text = devString;
                        }
                            
                    }
                }
            }
        }

        private static void SetImage(ReportPrinter rpt)
        {
            ArrayList list = new ArrayList();

            for (int i = 1; i < 7; i++)
            {
                string i1 = rpt.ds.Tables["dt1"].Rows[0]["i"+i].ToString().Replace("\"", "").Replace("[", "").Replace("]", "").Trim();
                if (i1 != "")
                {
                    string[] items = i1.Split(",");
                    foreach (string item in items)
                    {
                        ImageItemClass imageItem = new ImageItemClass();
                        switch (i)
                        {
                            case 1:
                                imageItem.groupName = "企业大门";
                                break;
                            case 2:
                                imageItem.groupName = "汽车衡全景";
                                break;
                            case 3:
                                imageItem.groupName = "基础引坡";
                                break;
                            case 4:
                                imageItem.groupName = "仪表近景";
                                break;
                            case 5:
                                imageItem.groupName = "传感器状况";
                                break;
                            case 6:
                                imageItem.groupName = "其他";
                                break;
                        }
                        
                        imageItem.url = "http://image.mtmaster.release.360cbs.com/" + item;
                        list.Add(imageItem);
                    }
                }
                else
                {
                    ImageItemClass imageItem = new ImageItemClass();
                    switch (i)
                    {
                        case 1:
                            imageItem.groupName = "企业大门";
                            break;
                        case 2:
                            imageItem.groupName = "汽车衡全景";
                            break;
                        case 3:
                            imageItem.groupName = "基础引坡";
                            break;
                        case 4:
                            imageItem.groupName = "仪表近景";
                            break;
                        case 5:
                            imageItem.groupName = "传感器状况";
                            break;
                        case 6:
                            imageItem.groupName = "其他";
                            break;
                    }

                    imageItem.url = $"./bmp/noimage.png";
                    imageItem.hasImage = false;
                    list.Add(imageItem);
                    
                }
            }

            int remainGroup = Convert.ToInt32(Math.Ceiling((decimal)list.Count / 6));
            int maxRow = remainGroup * 3;
            int remainRow = Convert.ToInt32(Math.Ceiling((decimal)list.Count / 2));
            for (int i = 3; i > remainGroup; i--)
            {
                rpt.FindControl($"drp_{i}", true).Visible = false;
            }

            for (int i = maxRow; i > remainRow; i--)
            {
                rpt.FindControl($"p_{i}", true).Visible = false;
            }

            ImageItemClass myItem;
            for (int i=1; i <= list.Count; i++)
            {
                XRPictureBox image = rpt.FindControl($"image_{i}", true) as XRPictureBox;
                myItem = (ImageItemClass) list[i - 1];
                image.ImageUrl = myItem.url;
                if (!myItem.hasImage)
                {
                    PaddingInfo padding = new PaddingInfo(96);
                    padding.All = 70;
                    
                    image.Padding = padding;
                }
                rpt.FindControl($"imagecaption_{i}", true).Text = myItem.groupName;
            }

        }

        private static void SetRemark(ReportPrinter rpt)
        {
            int completeid = Convert.ToInt32(rpt.ds.Tables["dt1"].Rows[0]["completeid"]);
            int partialloadid = Convert.ToInt32(rpt.ds.Tables["dt1"].Rows[0]["partialloadid"]);
            int linearid = Convert.ToInt32(rpt.ds.Tables["dt1"].Rows[0]["linearid"]);
            int repeatid = Convert.ToInt32(rpt.ds.Tables["dt1"].Rows[0]["repeatid"]);

            string remark_idx = "1";

            if (completeid == -1)
            {
                rpt.FindControl("dr_complete", true).Visible = false;
            }
            else
            {
                remark_idx = "2";
            }

            if (partialloadid == -1)
            {
                rpt.FindControl("dr_partial", true).Visible = false;
            }
            else
            {
                remark_idx = "3";
            }
            
            if (linearid == -1)
            {
                rpt.FindControl("dr_linear", true).Visible = false;
            }
            else
            {
                remark_idx = "4";
            }
            
            if (repeatid == -1)
            {
                rpt.FindControl("dr_repeat", true).Visible = false;
            }
            else
            {
                remark_idx = "5";
            }
            
            rpt.FindControl("remark_"+remark_idx, true).Visible = true;

        }
    }

    public class ImageItemClass
    {
        public string groupName;
        public string url;
        public bool hasImage = true;
    }
}