using iWareCommon.Utils;
using iWareSql.MyDbContext;
using OfficeOpenXml;
using OfficeOpenXml.Drawing;
using System;
using System.IO;
using System.Threading;
using WindowsFormsApplication1.Common;
namespace autuPrint.printService
{
    public class creatExcelPrint
    {
        /// 
        /// //线程锁防止并发
        /// 
        private static Mutex single = new Mutex();
        /// 
        /// 生成打印数据源
        /// 
        /// 条形码
        ///   标签参数
        /// 成功返回true
        public static bool creatEXcel(System.Drawing.Image img, ware_material_print_history label, ref string errMsg)
        {
            if (single.WaitOne())//增加线程锁防止双击并发
            {
                try
                {
                    #region 验证模板文件是否存在
                    if (!File.Exists(SystemConst.TEMPLATE_FILEPATH))
                    {
                        Log4NetHelper.WriteErrorLog(LogType.Print, "类名: creatExcelPrint 方法名: creatEXcel 模板缺失", null);
                        errMsg = "类名: creatExcelPrint 方法名: creatEXcel 模板缺失";
                        return false;
                    }
                    //if (img == null)
                    //{
                    //    logtxt.txtWrite("类名: creatExcelPrint 方法名: creatEXcel 标签条形码为空", 2);
                    //    errMsg = "类名: creatExcelPrint 方法名: creatEXcel 标签条形码为空";
                    //    return false;
                    //}
                    if (label == null)
                    {
                        Log4NetHelper.WriteErrorLog(LogType.Print, "类名: creatExcelPrint 方法名: creatEXcel 标签参数为空", null);
                        errMsg = "类名: creatExcelPrint 方法名: creatEXcel 标签参数为空";
                        return false;
                    }
                    #endregion
                    //获取模板文件
                    FileInfo copyFile = new FileInfo(SystemConst.TEMPLATE_FILEPATH);
                    copyFile.CopyTo(SystemConst.TEMPORARY_FILEPATH, true);
                    FileInfo existingFile = new FileInfo(SystemConst.TEMPORARY_FILEPATH);
                    using (ExcelPackage package = new ExcelPackage(existingFile))
                    {
                        //获取模板内容
                        ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];
                        //行,列
                        //注意:行和列都是从1开始,而不是从0开始!!!
                        worksheet.Cells[1, 2].Value = label.Code;//物料单号
                        worksheet.Cells[2, 1].Value = "Descript:" + label.Name;//物料单号
                        worksheet.Cells[3, 1].Value = "Vendor:" + (label.SupplierNo ?? "") + " " + (label.SupplierName ?? "");//供应商
                        worksheet.Cells[4, 1].Value = "PO:" + label.PurchaseNo + "/" + label.PurchaseEbelp;
                        worksheet.Cells[5, 1].Value = "Qty:" + label.Quantity;
                        worksheet.Cells[6, 1].Value = "Batch:" + label.BatchNo;
                        worksheet.Cells[7, 1].Value = "Time:" + DateTime.Now.ToString("dd.MM.yyyy") + " " + DateTime.Now.ToString("HH:mm:ss");
                        if (img != null)
                        {
                            ExcelPicture pic = worksheet.Drawings.AddPicture("barCode", img);//插入图片
                            pic.SetSize(103, 78);//设置图片尺寸
                            pic.SetPosition(3, 3, 2, 3);//设置图片位置,以单元格为单位(参数1,3行和列,2,4是偏移量)
                        }
                        package.Save();//保存
                    }
                }
                catch (Exception ex)
                {
                    Log4NetHelper.WriteErrorLog(LogType.Print, "类名: creatExcelPrint 方法名: creatEXcel 生成打印文件出错 \r\n  " + ex.ToString(), ex);
                    //logtxt.txtWrite("类名: creatExcelPrint 方法名: creatEXcel 生成打印文件出错 \r\n  " + ex.ToString(), 2);
                    errMsg = ex.Message;
                    return false;
                }
                finally { single.ReleaseMutex(); }//一轮结束
            }
            return true;
        }
        public static string PrintFor物料标签(MyDbContext mod, ware_material_print_history item)
        {
            #region 单个处理标签打印
            Thread.Sleep(1000);
            var errMsg = "";
            //二维码格式 
            //PARTS NUMBER:L11B190,SAP: ,LOT NO: WH1683820800000,QUANTITY: 100
            string barCode = $"PARTS NUMBER:{item.Code},SAP:{item.Sap_Location ?? ""} ,LOT NO: {item.BatchNo},QUANTITY: {item.Quantity}";//标签条码
            //string barCode = $"21VS-ASTG-PSET=5";//标签条码
            System.Drawing.Image img = QrCodeAndBarCode.printQr(barCode);
            bool saveSucceed = creatExcelPrint.creatEXcel(img, item, ref errMsg);
            if (saveSucceed)
            {
                if (File.Exists(SystemConst.TEMPORARY_FILEPATH))
                {
                    bool printSucceed = true;
                    item.PrintSheetNum = item.PrintSheetNum ?? 1;//打印张数
                    for (int i = 0; i < item.PrintSheetNum; i++)
                    {
                        printSucceed = print.printExcel(SystemConst.TEMPORARY_FILEPATH, SystemConst.Default_LeftMargin, SystemConst.Default_TopMargin);
                    }
                    if (printSucceed)
                    {
                        //打印成功 删除临时文件,并改状态
                        FileInfo myfile = new FileInfo(SystemConst.TEMPORARY_FILEPATH);//PartStatus
                        myfile.Delete();
                        item.PrintStatu = 1;//打印状态(0:未打印 1:已打印)
                        item.PrintNum = (item.PrintNum ?? 0) + 1;
                        int isSave = mod.SaveChanges();
                        if (isSave < 1)
                        {
                            Log4NetHelper.WriteErrorLog(LogType.Print, "类名: Form1 方法名: do_autoPrint 修改库存自动打印状态失败  ", null);
                        }
                    }
                    //*/
                }
            }
            else
            {
                //this.tb_Msg.Text = "失败,失败内容:" + errMsg;
            }
            return errMsg;
            #endregion
        }
    }
}