schangxiang@126.com
2025-08-05 04d10bce51a6272d02a4a0f1b05a4f64bf73f273
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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 creatExcelPrintForDO
    {
        /// <summary>
        /// //线程锁防止并发
        /// </summary>
        private static Mutex single = new Mutex();
        /// <summary>
        /// 生成打印数据源
        /// </summary>
        /// <param name="img">条形码</param>
        ///   <param name="label">标签参数</param>
        /// <returns>成功返回true</returns>
        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_DO单发货标签))
                    {
                        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_DO单发货标签);
                    copyFile.CopyTo(SystemConst.TEMPORARY_FILEPATH_DO单发货标签, true);
                    FileInfo existingFile = new FileInfo(SystemConst.TEMPORARY_FILEPATH_DO单发货标签);
                    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 ?? "");//供应商
                        //DO号改为 NO,是为了兼容 其他非do单的,如 STO出库单、退货单等 【Editby shaocx,2023-10-10】
                        //worksheet.Cells[4, 1].Value = "DO:" + label.DeliveryNo;
                        worksheet.Cells[4, 1].Value = "NO:" + label.DeliveryNo;
                        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 PrintForDO订单标签(MyDbContext mod, ware_material_print_history item)
        {
            #region 单个处理标签打印
            Thread.Sleep(1000);
 
            var errMsg = "";
            //二维码格式 
            //PARTS NUMBER:18VS130A406-01,SAP: ,LOT NO: ,ORDER NO: 122100059369_1,QUANTITY: 1
            string barCode = $"PARTS NUMBER:{item.Code},SAP:{item.Sap_Location ?? ""} ,LOT NO: {item.BatchNo},ORDER NO: {item.DeliveryNo},QUANTITY: {item.Quantity}";//标签条码
            System.Drawing.Image img = QrCodeAndBarCode.printQr(barCode);
            bool saveSucceed = creatExcelPrintForDO.creatEXcel(img, item, ref errMsg);
 
            if (saveSucceed)
            {
                if (File.Exists(SystemConst.TEMPORARY_FILEPATH_DO单发货标签))
                {
                    bool printSucceed = true;
 
                    item.PrintSheetNum = item.PrintSheetNum ?? 1;//打印张数
                    for (int i = 0; i < item.PrintSheetNum; i++)
                    {
                        printSucceed = print.printExcel(SystemConst.TEMPORARY_FILEPATH_DO单发货标签, SystemConst.Default_LeftMargin, SystemConst.Default_TopMargin);
                    }
 
                    if (printSucceed)
                    {
                        //打印成功 删除临时文件,并改状态
                        FileInfo myfile = new FileInfo(SystemConst.TEMPORARY_FILEPATH_DO单发货标签);//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
        }
    }
}