using System;
using System.IO;
using CAXA.MPM.Modle;
using System.Collections.Generic;
using System.Text;
using Excel=Microsoft.Office.Interop.Excel;
using System.Diagnostics;

namespace CAXA.MPM.UI.Purchase
{
  public   class PurchaseOrderMainContextPrint
   {
      object missing = System.Reflection.Missing.Value;
      private string TemplatePath = System.IO.Path.Combine(CAXA.MPM.Kernel.FileService.RootPath, @"Reports\PurchaseOrderContractPrint") + "\\";
      private string OutPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop).ToString() + "\\";
      private PurchaseOrderInfo PrInfo = new PurchaseOrderInfo();
      private List<PurchaseOrderLineInfo> ListContextLine = new List<PurchaseOrderLineInfo>();
      private List<PurchaseOrderLineInfo> ListPrinfoLine = new List<PurchaseOrderLineInfo>();
      private int Flag=0;
      public PurchaseOrderMainContextPrint(PurchaseOrderInfo prInfo,List<PurchaseOrderLineInfo> listContextLine, List<PurchaseOrderLineInfo> listprinfoLine,int intFlag)
      {
          this.PrInfo = prInfo;
          this.ListContextLine = listContextLine;
          this.ListPrinfoLine = listprinfoLine;
          this.Flag=intFlag;
      }
      public bool  Print()
      {
          bool bolReturn = false;
          DateTime beforeTime;
          DateTime afterTime;
          beforeTime = DateTime.Now;
          Excel.Application app = new Excel.ApplicationClass();
         
          app.Visible = false;
          app.DisplayAlerts = false;
          afterTime = DateTime.Now;

          string strTemplateFile = TemplatePath + "PurchaseOrderContract" + Flag.ToString()+".xls";
          string strOutFile = OutPath + PrInfo.BillCode + "--" + Flag.ToString()+ ".xls";
          // 打开模板文件,得到WorkBook对象 
          Excel.Workbook workBook = app.Workbooks.Open(strTemplateFile, missing, missing, missing, missing, missing,
          missing, missing, missing, missing, missing, missing, missing, missing, missing);

        

          #region  给合同文本赋值

          Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(1);
          workSheet.Cells[3, 1] = "供方:" + PrInfo.PurchaseOrderContract.GongFang;
          workSheet.Cells[4, 1] = "需方:" + PrInfo.PurchaseOrderContract.XuFang;
          if (Flag == 3)
          {
              workSheet.Cells[2, 8] = "合同编号:" + PrInfo.PurchaseOrderContract.ContractNo;
              workSheet.Cells[3, 8] = "签定地点:" + PrInfo.PurchaseOrderContract.ContractAdress;
              workSheet.Cells[4, 8] = "签定时间:" + PrInfo.PurchaseOrderContract.ContractDate.Date.ToShortDateString();
          }
          else if (Flag == 2)
          {
              workSheet.Cells[2, 10] = "合同编号:" + PrInfo.PurchaseOrderContract.ContractNo;
              workSheet.Cells[3, 10] = "签定地点:" + PrInfo.PurchaseOrderContract.ContractAdress;
              workSheet.Cells[4, 10] = "签定时间:" + PrInfo.PurchaseOrderContract.ContractDate.Date.ToShortDateString();
          }
          else
          {
              workSheet.Cells[2, 9] = "合同编号:" + PrInfo.PurchaseOrderContract.ContractNo;
              workSheet.Cells[3, 9] = "签定地点:" + PrInfo.PurchaseOrderContract.ContractAdress;
              workSheet.Cells[4, 9] = "签定时间:" + PrInfo.PurchaseOrderContract.ContractDate.Date.ToShortDateString();
          }
       
        
          workSheet.Cells[14, 2] = PrInfo.PurchaseOrderContract.ShuoMing;  //说明
          workSheet.Cells[15, 1] = "合计人民币金额(含17%增值税):"+PrInfo.DXTotal;

          if (Flag == 1)
          {
              workSheet.Cells[33, 2] = PrInfo.PurchaseOrderContract.Name;
              workSheet.Cells[33, 7] = PrInfo.PurchaseOrderContract.MyName;
              workSheet.Cells[34, 2] = PrInfo.PurchaseOrderContract.Address;
              workSheet.Cells[34, 7] = PrInfo.PurchaseOrderContract.MyAddress;
              workSheet.Cells[35, 2] = PrInfo.PurchaseOrderContract.Lawyer;
              workSheet.Cells[35, 7] = PrInfo.PurchaseOrderContract.MyLawyer;
              workSheet.Cells[36, 2] = PrInfo.PurchaseOrderContract.Entrust;
              workSheet.Cells[36, 7] = PrInfo.PurchaseOrderContract.MyEntrust;
              workSheet.Cells[37, 2] = PrInfo.PurchaseOrderContract.Phone;
              workSheet.Cells[37, 7] = PrInfo.PurchaseOrderContract.MyPhone;
              workSheet.Cells[38, 2] = PrInfo.PurchaseOrderContract.Bank;
              workSheet.Cells[38, 7] = PrInfo.PurchaseOrderContract.MyBank;
              workSheet.Cells[39, 2] = PrInfo.PurchaseOrderContract.Account;
              workSheet.Cells[39, 7] = PrInfo.PurchaseOrderContract.MyAccount;
              workSheet.Cells[40, 2] = PrInfo.PurchaseOrderContract.Taxes;
              workSheet.Cells[40, 7] = PrInfo.PurchaseOrderContract.MyTaxes;
              workSheet.Cells[41, 2] = PrInfo.PurchaseOrderContract.PostCode;
              workSheet.Cells[41, 7] = PrInfo.PurchaseOrderContract.MyPostCode;
              workSheet.Cells[42, 2] = PrInfo.PurchaseOrderContract.LinkAddress;
              workSheet.Cells[42, 7] = PrInfo.PurchaseOrderContract.MyLinkAddress;
              workSheet.Cells[43, 2] = PrInfo.PurchaseOrderContract.LinkPhone;
              workSheet.Cells[43, 7] = PrInfo.PurchaseOrderContract.MyLinkPhone;
              workSheet.Cells[44, 2] = PrInfo.PurchaseOrderContract.Fax;
              workSheet.Cells[44, 7] = PrInfo.PurchaseOrderContract.MyFax;
          }
          else
          {
              workSheet.Cells[32, 2] = PrInfo.PurchaseOrderContract.Name;
              workSheet.Cells[32, 7] = PrInfo.PurchaseOrderContract.MyName;
              workSheet.Cells[33, 2] = PrInfo.PurchaseOrderContract.Address;
              workSheet.Cells[33, 7] = PrInfo.PurchaseOrderContract.MyAddress;
              workSheet.Cells[34, 2] = PrInfo.PurchaseOrderContract.Lawyer;
              workSheet.Cells[34, 7] = PrInfo.PurchaseOrderContract.MyLawyer;
              workSheet.Cells[35, 2] = PrInfo.PurchaseOrderContract.Entrust;
              workSheet.Cells[35, 7] = PrInfo.PurchaseOrderContract.MyEntrust;
              workSheet.Cells[36, 2] = PrInfo.PurchaseOrderContract.Phone;
              workSheet.Cells[36, 7] = PrInfo.PurchaseOrderContract.MyPhone;
              workSheet.Cells[37, 2] = PrInfo.PurchaseOrderContract.Bank;
              workSheet.Cells[37, 7] = PrInfo.PurchaseOrderContract.MyBank;
              workSheet.Cells[38, 2] = PrInfo.PurchaseOrderContract.Account;
              workSheet.Cells[38, 7] = PrInfo.PurchaseOrderContract.MyAccount;
              workSheet.Cells[39, 2] = PrInfo.PurchaseOrderContract.Taxes;
              workSheet.Cells[39, 7] = PrInfo.PurchaseOrderContract.MyTaxes;
              workSheet.Cells[40, 2] = PrInfo.PurchaseOrderContract.PostCode;
              workSheet.Cells[40, 7] = PrInfo.PurchaseOrderContract.MyPostCode;
              workSheet.Cells[41, 2] = PrInfo.PurchaseOrderContract.LinkAddress;
              workSheet.Cells[41, 7] = PrInfo.PurchaseOrderContract.MyLinkAddress;
              workSheet.Cells[42, 2] = PrInfo.PurchaseOrderContract.LinkPhone;
              workSheet.Cells[42, 7] = PrInfo.PurchaseOrderContract.MyLinkPhone;
              workSheet.Cells[43, 2] = PrInfo.PurchaseOrderContract.Fax;
              workSheet.Cells[43, 7] = PrInfo.PurchaseOrderContract.MyFax;
          }
       

          //合同文本产品名称等项目复制
          decimal AllNumberOf = 0;
          decimal AllAmount = 0;
          decimal AllKnead = 0;

          int lineCount = ListContextLine.Count > 5 ? 5 : ListContextLine.Count;

          if (Flag == 1)
          {
              for (int i = 8; i < lineCount+ 8; i++)
              {
                   AllNumberOf += ListContextLine[i - 8].NumberOf;
                   AllAmount += ListContextLine[i - 8].Amount;
                   AllKnead += ListContextLine[i - 8].Knead;

                   workSheet.Cells[i, 1]=ListContextLine[i-8].PartName;
                   workSheet.Cells[i, 2]=ListContextLine[i-8].Material;
                   workSheet.Cells[i, 3]=ListContextLine[i-8].Spec;
                   workSheet.Cells[i, 5]=ListContextLine[i-8].NumberOf;
                   workSheet.Cells[i, 6]=ListContextLine[i-8].Amount;
                   workSheet.Cells[i, 7]=ListContextLine[i-8].Price;
                   workSheet.Cells[i, 8]=ListContextLine[i-8].Knead;
                   workSheet.Cells[i, 9]=ListContextLine[i-8].OriginPlace;
                   workSheet.Cells[i, 10] = "";
              }

              workSheet.Cells[13, 1] = "合 计";
              workSheet.Cells[13, 5] = AllNumberOf;
              workSheet.Cells[13, 6] = AllAmount;
              workSheet.Cells[13, 8] = AllKnead;
          }
          if (Flag == 2)
          {
              for (int i = 8; i < lineCount + 8; i++)
              {
                  AllNumberOf += ListContextLine[i - 8].NumberOf;
                  AllAmount += ListContextLine[i - 8].Amount;
                  AllKnead += ListContextLine[i - 8].Knead;
                  workSheet.Cells[i, 1] = ListContextLine[i - 8].Description;
                  workSheet.Cells[i, 2] = ListContextLine[i - 8].PartName;
                  workSheet.Cells[i, 3] = ListContextLine[i - 8].Spec;
                  workSheet.Cells[i, 5] = ListContextLine[i - 8].Material;
                  workSheet.Cells[i, 7] = ListContextLine[i - 8].PartUOM;
                  workSheet.Cells[i, 8] = ListContextLine[i - 8].NumberOf;
                  workSheet.Cells[i, 9] = ListContextLine[i - 8].Price;
                  workSheet.Cells[i, 10] = ListContextLine[i - 8].Knead;
                  workSheet.Cells[i, 11] = "";
              }
              workSheet.Cells[13, 1] = "合 计";
              workSheet.Cells[13, 8] = AllNumberOf;
              workSheet.Cells[13, 10] = AllKnead;
          }
          if(Flag == 3)
          {
              for (int i = 8; i < lineCount + 8; i++)
              {
                  AllNumberOf += ListContextLine[i - 8].NumberOf;
                  AllAmount += ListContextLine[i - 8].Amount;
                  AllKnead += ListContextLine[i - 8].Knead;
                  workSheet.Cells[i, 1] = ListContextLine[i - 8].PartName;
                  workSheet.Cells[i, 2] = ListContextLine[i - 8].Material;
                  workSheet.Cells[i, 3] = ListContextLine[i - 8].Spec;
                  workSheet.Cells[i, 4] = ListContextLine[i - 8].PartUOM;
                  workSheet.Cells[i, 5] = ListContextLine[i - 8].NumberOf;
                  workSheet.Cells[i, 6] = ListContextLine[i - 8].Price;
                  workSheet.Cells[i, 7] = ListContextLine[i - 8].Knead;
                  workSheet.Cells[i, 8] = ListContextLine[i - 8].OriginPlace;
                  workSheet.Cells[i, 9] = "";
              }
              workSheet.Cells[13, 1] = "合 计";
              workSheet.Cells[13, 5] = AllNumberOf;
              workSheet.Cells[13, 7] = AllKnead;
          }

          //采购技术要求

          for (int i = 17; i < 32; i++)
          {
              workSheet.Cells[i, 1] = "";
          }

          if (PrInfo.PurchaseOrderContract.TechnologyRequire != null)
          {
              if (PrInfo.PurchaseOrderContract.TechnologyRequire.IndexOf("\n") != -1)
              {
                  string[] listTechnology = PrInfo.PurchaseOrderContract.TechnologyRequire.Split('\n');
                  for (int i = 17; i < 31; i++)
                  {
                      if ((i - 17) < listTechnology.Length)
                      {
                          workSheet.Cells[i, 1] = listTechnology[i - 17].ToString();
                      }

                  }
              }
          }
       

          #endregion

          #region  给清单赋值
          if (ListPrinfoLine.Count > 0)
          {
              int ListCount = ListPrinfoLine.Count % 26 == 0 ? ListPrinfoLine.Count / 26 : ListPrinfoLine.Count / 26 + 1;
              // 得到WorkSheet对象,清单对象 
              workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(2);
              for (int i = 2; i <= ListCount + 1; i++)
              {
                  ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing, workBook.Worksheets[i]);
              }
              for (int i = 2; i <= ListCount + 1; i++)
              {

                  workSheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
                  workSheet.Name = "清单" + "-" + Convert.ToString(i - 1);
                  workSheet.PageSetup.CenterFooter = @"&""宋体""&12" + "第 " + Convert.ToString(i - 1) + " 页,共 " + Convert.ToString(ListCount) + " 页";
                  workSheet.PageSetup.LeftHeader = @"&""宋体""&18" +PrInfo.BillCode+ "-" + Convert.ToString(i - 1);
                  workSheet.PageSetup.CenterHeader = @"&""宋体""&18" + PrInfo.BillCode + "采购清单";
                  for (int k = 0; k < 26; k++)
                  {
                      if (26 * (i - 2) + k + 1>ListPrinfoLine.Count)
                      {
                          break;
                      }
                      workSheet.Cells[k + 2, 1] = 26 * (i - 2) + k+1;
                      workSheet.Cells[k + 2, 2] = ListPrinfoLine[26 * (i - 2) + k].AccountCode;
                      workSheet.Cells[k + 2, 3] = ListPrinfoLine[26 * (i - 2) + k].ProductCode;
                      workSheet.Cells[k + 2, 4] = ListPrinfoLine[26 * (i - 2) + k].Material;
                      workSheet.Cells[k + 2, 5] = ListPrinfoLine[26 * (i - 2) + k].Spec;
                      workSheet.Cells[k + 2, 6] = ListPrinfoLine[26 * (i - 2) + k].PartUOM;
                      workSheet.Cells[k + 2, 7] = ListPrinfoLine[26 * (i - 2) + k].NumberOf;
                      workSheet.Cells[k + 2, 8] = ListPrinfoLine[26 * (i - 2) + k].Amount;
                      workSheet.Cells[k + 2, 9] = ListPrinfoLine[26 * (i - 2) + k].Price;
                      workSheet.Cells[k + 2, 10] = ListPrinfoLine[26 * (i - 2) + k].Knead;
                      workSheet.Cells[k + 2, 11] = ListPrinfoLine[26 * (i - 2) + k].OriginPlace;
                      workSheet.Cells[k + 2, 12] = ListPrinfoLine[26 * (i - 2) + k].Status;
                      workSheet.Cells[k + 2, 13] = ListPrinfoLine[26 * (i - 2) + k].Criterion;
                  }
              } 

          }
          //删除最后一页记录
          int SheetCount = app.Worksheets.Count;
          workSheet = new Excel.WorksheetClass();
          workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(SheetCount);
          workSheet.Delete();
          #endregion

          // 输出Excel文件并退出 
          try
          {
              workBook.SaveAs(strOutFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
              workBook.Close(null, null, null);
              app.Workbooks.Close();
              app.Application.Quit();
              app.Quit();

              System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
              System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

              workSheet = null;
              workBook = null;
              app = null;

              GC.Collect();

              bolReturn = true;
          }
          catch (Exception e)
          {
              throw e;
          }
          finally
          {
              Process[] myProcesses;
              DateTime startTime;
              myProcesses = Process.GetProcessesByName("Excel");

              // 得不到Excel进程ID,暂时只能判断进程启动时间 
              foreach (Process myProcess in myProcesses)
              {
                  startTime = myProcess.StartTime;

                  if (startTime > beforeTime && startTime < afterTime)
                  {
                      myProcess.Kill();
                  }
              }
          }

          return bolReturn;

      }
     
   }
}