diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index ae098b9a..85731617 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using System.Runtime.InteropServices; using System.Security.Claims; using System.Security.Cryptography; using System.Text; @@ -41,6 +42,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Interfaces; +using Tnb.WarehouseMgr.Print; namespace Tnb.WarehouseMgr { @@ -79,9 +81,10 @@ namespace Tnb.WarehouseMgr } - protected Task GetUserIdentity() + protected Task GetUserIdentity(string? asscessToken = null) { - var claims = JWTEncryption.ReadJwtToken(UserManager.AsscessToken)?.Claims; + var at = asscessToken ?? UserManager.AsscessToken; + var claims = JWTEncryption.ReadJwtToken(at)?.Claims; ClaimsIdentity toKen = new ClaimsIdentity(); foreach (Claim item in claims) { @@ -150,6 +153,165 @@ namespace Tnb.WarehouseMgr { return Task.CompletedTask; } + /// + /// 条码打印 + /// + /// 条码 + /// + protected Task BarCodePrint(List barCodes) + { + var tcs = new TaskCompletionSource(); + // open port. + try + { + int nLen, ret, sw; + byte[] pbuf = new byte[128]; + string strmsg; + + IntPtr ver; + System.Text.Encoding encAscII = System.Text.Encoding.ASCII; + System.Text.Encoding encUnicode = System.Text.Encoding.Unicode; + + // dll version. + ver = PPLBUtility.B_Get_DLL_Version(0); + // search port. + nLen = PPLBUtility.B_GetUSBBufferLen() + 1; + strmsg = "DLL "; + strmsg += Marshal.PtrToStringAnsi(ver); + strmsg += "\r\n"; + if (nLen > 1) + { + byte[] buf1, buf2; + int len1 = 128, len2 = 128; + buf1 = new byte[len1]; + buf2 = new byte[len2]; + PPLBUtility.B_EnumUSB(pbuf); + PPLBUtility.B_GetUSBDeviceInfo(1, buf1, out len1, buf2, out len2); + sw = 1; + if (1 == sw) + { + ret = PPLBUtility.B_CreatePrn(12, encAscII.GetString(buf2, 0, len2));// open usb. + } + else + { + ret = PPLBUtility.B_CreateUSBPort(1);// must call B_GetUSBBufferLen() function fisrt. + } + if (0 != ret) + { + strmsg += "Open USB fail!"; + } + else + { + strmsg += "Open USB:\r\nDevice name: "; + strmsg += encAscII.GetString(buf1, 0, len1); + strmsg += "\r\nDevice path: "; + strmsg += encAscII.GetString(buf2, 0, len2); + //sw = 2; + if (2 == sw) + { + //Immediate Error Report. + PPLBUtility.B_WriteData(1, encAscII.GetBytes("^ee\r\n"), 5);//^ee + ret = PPLBUtility.B_ReadData(pbuf, 4, 1000); + } + } + } + else + { + System.IO.Directory.CreateDirectory(PPLBUtility.szSavePath); + ret = PPLBUtility.B_CreatePrn(0, PPLBUtility.szSaveFile);// open file. + strmsg += "Open "; + strmsg += PPLBUtility.szSaveFile; + if (0 != ret) + { + strmsg += " file fail!"; + } + else + { + strmsg += " file succeed!"; + } + } + if (0 != ret) + return null; + + // sample setting. + PPLBUtility.B_Set_Originpoint(0, 0); + PPLBUtility.B_Select_Option(2); + PPLBUtility.B_Set_Darkness(8); + PPLBUtility.B_Del_Pcx("*");// delete all picture. + PPLBUtility.B_Set_LabelForSmartPrint(254 * 3, 30);//label information: length= 3 * 25.4 mm, gap= 3 mm. + + + foreach (var code in barCodes) + { + //print text, true type text. + PPLBUtility.B_Prn_Text(200, 50, 0, 2, 2, 2, 'N', code); + //barcode. + PPLBUtility.B_Prn_Barcode(160, 100, 0, "E80", 8, 500, 70, 'N', code);//have a counter + // output. + PPLBUtility.B_Print_Out(1);// copy 2. + } + } + catch (Exception ex) + { + tcs.SetException(ex); + JNPF.Logging.Log.Error("条码打印时出现错误", ex); + } + finally + { + // close port. + //PPLBUtility.B_ClosePrn(); + } + return tcs.Task; + } + + #region 斑马打印 + /// + /// 打印 + /// + /// + /// + //[NonAction] + //protected async Task Print(string zplStr) + //{ + // var zpl_string = @$"^XA + // ^XA^LH0,0^LL100^PW580 + // ^FX 文本 + // ^FO 80,100^BCN,100,10^FDQA,Hello world^FS + // ^FO 150,200^A0N 80,50^FD Hello world^FS + // ^XZ"; + // List printerList = await GetUSBPrinters(); + // if (printerList?.Count > 0) + // { + // // in this case, we arbitrarily are printing to the first found printer + // DiscoveredPrinter discoveredPrinter = printerList[0]; + // Connection connection = discoveredPrinter.GetConnection(); + // connection.Open(); + // connection.Write(Encoding.UTF8.GetBytes(zplStr)); + // } + //} + + //private Task> GetUSBPrinters() + //{ + // var tcs = new TaskCompletionSource>(); + // List printerList = new(); + // try + // { + // foreach (DiscoveredUsbPrinter usbPrinter in UsbDiscoverer.GetZebraUsbPrinters()) + // { + // printerList.Add(usbPrinter); + // Console.WriteLine(usbPrinter); + // } + // } + // catch (ConnectionException e) + // { + // JNPF.Logging.Log.Error("获取本地打印机时出错", e); + // tcs.SetException(e); + // } + // Console.WriteLine("Done discovering local printers."); + // tcs.SetResult(printerList); + // return tcs.Task; + //} + #endregion /// /// Api响应结果 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/PDATransferSignService.cs b/WarehouseMgr/Tnb.WarehouseMgr/PDATransferSignService.cs index 1b2c9902..f7741907 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/PDATransferSignService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/PDATransferSignService.cs @@ -151,8 +151,8 @@ namespace Tnb.WarehouseMgr [HttpPost] public async Task IsMinStorage(CancellationTokenSource? cts = default) { - if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; - var curUser = await GetUserIdentity(); + //if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; + //var curUser = await GetUserIdentity(); var curDb = _db.CopyNew(); try { @@ -193,11 +193,11 @@ namespace Tnb.WarehouseMgr { outstock = { - org_id = curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value, + org_id = _userManager.User.OrganizeId, bill_date = DateTime.Now, bill_type = "28135837838101",//单据类型:自动补货单 warehouse_id = "1", - create_id= curUser.FindFirst(ClaimConst.CLAINMUSERID)!.Value, + create_id= _userManager.UserId, } }; foreach (var d in dics) @@ -221,7 +221,7 @@ namespace Tnb.WarehouseMgr { RequestURL = App.HttpContext?.Request?.Path, RequestMethod = App.HttpContext?.Request?.Method, - userIdentity = curUser, + userIdentity = await GetUserIdentity(_userManager.ToKen), }; var timedTaskEx = ex.ToTimedTaskException(ei); cts?.Cancel(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs new file mode 100644 index 00000000..cc871701 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs @@ -0,0 +1,1093 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyModel; + +namespace Tnb.WarehouseMgr.Print +{ + public class PPLBUtility + { + + + + const uint IMAGE_BITMAP = 0; + const uint LR_LOADFROMFILE = 16; + static readonly string dllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, + int cxDesired, int cyDesired, uint fuLoad); + [DllImport("Gdi32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int DeleteObject(IntPtr ho); + public const string szSavePath = "C:\\Argox"; + public const string szSaveFile = "C:\\Argox\\PPLB_Example.Prn"; + const string sznop1 = "nop_front\r\n"; + const string sznop2 = "nop_middle\r\n"; + /// + /// 印出一个 Maxi Code 2D Barcode + /// + /// X 座标 + /// Y 座标 + /// A 3-位数 Class code + /// A 3-位数 Country code + /// 在美国 Post code 是一個4或5-位数,其他国家是 6 位数 + /// 资料字串,最多84個字元 + /// 0 -> OK + /// ObjectId.B_Bar2d_Maxi(50, 50, 300, 400, 93065, “This MaxiCode”); + /// 這个 B_Bar2d_Maxi 函数可以打印出一个 Maxi Code 2D Barcode + [DllImport("Library\\x64\\Library\\x64\\Winpplb.dll")] + public static extern int B_Bar2d_Maxi(int x, int y, int cl, int cc, int pc, string data); + /// + /// 印出一个 PDF-417 2D Barcode + /// + /// X 座标 + /// Y 座标。(1 dot = 0.125 mm) + /// 最大打印宽度,单位 dots。 + /// v; + ///最大打印高度,单位 dots。 + /// s; + /// 错误校正等級,范围:0~8。 + /// c; + /// 资料压缩等級,范围:0 或 1。 + /// px; + /// 模组宽度,范围:2~9 dots。 + /// py; + /// 模组高度,范围:4~99 dots。 + /// r; + /// 最大 row count。 + /// l; + /// 最大 column count。 + /// t; + /// Truncation flag,‘0’ 是 normal 和 ‘1’ 是 truncated. + /// o; + ///打印方向,'0’是 0°,'1’是90°、'2’是180°,'3’是270° + /// + /// + /// + /// + /// 资料字串。 + /// + [DllImport("Library\\x64\\Library\\x64\\Winpplb.dll")] + public static extern int B_Bar2d_PDF417(int x, int y, int w, int v, int s, int c, int px, + int py, int r, int l, int t, int o, string data); + /// + /// 印出一个 PDF-417 2D Barcode + /// + /// + /// + /// + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Bar2d_PDF417_N(int x, int y, int w, int h, string pParameter, string data); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Bar2d_DataMatrix(int x, int y, int r, int l, int h, int v, string data); + /// + /// 关闭打印端口 + /// + /// + /// B_ClosePrn 函数会关闭开启的打印机端口,必須在所有打印函数之后執行 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern void B_ClosePrn(); + /// + /// 开启 Printer 工作 + /// + /// + /// 选择端口或档案。 + /// 0 -> print to file. + /// 1 -> lpt1, 2 -> lpt2, 3 -> lpt3 + /// 4 -> com1, 5 -> com2, 6 -> com3 + /// 10 -> pipe, 11 -> USBXXX, 12 -> USB + /// 13 -> LAN Client(TCP/IP) + /// + /// + /// 当 selection 是 0 时,资料则输出至档案,filename 为档案名称,可含路径。 + /// 当 selection 是 10 时,filename 为输出路径或装置路径)。 + /// 当 selection 是 11 时,filename 指的是想开启的USB之index, index由1开始; + /// 当 selection 是 12 时,filename 指的是想开启的USB装置路径, + /// 和nPort = 10的使用方法一样 + /// 当 selection 內容是 13 时, filename 指的是想开启的IP Address, 使用TCP/IP去开启; + /// 预设的port值為9100, 若要指定port值, 如80, 則在IPAddress後加上字串":80". + /// + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// 说明: B_CreatePrn() 函数會开启你选择的输出端口或开启你键入的输出档案。 + /// 而这个函数必須在所有函数之前执行。 + /// B_CreatePrn(), B_CreateUSBPort() , B_CreateNetPort() 和 B_CreatePort() 不能同时使用。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_CreatePrn(int selection, string filename); + /// + /// 删除 Form (表格) + /// + /// + /// 表格名称,最多 9 个字。 + /// 当 formname 內容是 '*'时将会清除打印机內所有表格。 + /// + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// 这个 B_Del_Form 函数會刪除打印机內,你输入的 Form (表格)名称。当 + /// 你刪除它后,将不能再还原,但可以重新载入。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Del_Form(string formname); + /// + /// 刪除 Pcx 图档 + /// + /// + /// 图形名称,最多 9 个字。 + /// 当 pcxname 內容是 '*'時将会清除打印机內 RAM 或 flash memory 所有图形。 + /// + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// 这个 B_Del_Pcx 函数會刪除打印机內,你输入的图形名称。当你刪除它后, + /// 將不能再还原,但可以重新載入。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Del_Pcx(string pcxname); + /// + /// 画一个框 + /// + /// 起点 X 坐标。 + /// 起点 Y 坐标。(1 dot = 0.125 mm) + /// 指定框四边边线厚度。 + /// 对角点 X 坐标。 + /// 对焦点 Y 坐标。 + /// 0 -> OK. + /// + /// 这个個B_Draw_Box 函数会画一个属性是 “OR” 的框。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Draw_Box(int x, int y, int thickness, int hor_dots, + int ver_dots); + /// + /// 画一条线 + /// + /// + /// 选择线条种类 + /// | mode | 線條種類. | + /// | E | Exclusive OR | + /// | O | OR | + /// | W | 白線,它會蓋掉先前影像 | + /// + /// 起点 X 坐标。 + /// 起點 Y 坐标。(1 dot = 0.125 mm) + /// + /// + /// 0 -> OK. + /// + ///这个 Draw_Line 函数会画一个属性是"OR"或"XOR"的线条及一条白线 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Draw_Line(char mode, int x, int y, int hor_dots, int ver_dots); + /// + /// 开启或关闭错误回传功能 + /// + /// + /// 当 option 是’N’时 关闭状态回馈。 + /// ‘S’ 是开启状态回馈。 + /// + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// B_Error_Reporting(‘S’); + /// + /// 这个 B_Error_Reporting 函数会使打印机状态回馈 Disable/Enable,这回 + ///馈通道是透过 RS232 Port。预定值是 Disable。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Error_Reporting(char option); + /// + /// 取得动态庫版本讯息 + /// + /// + /// 0 -> 讯息视窗不显现。 + ///1 -> 讯息视窗显现。 + /// + /// + /// B_Get_DLL_VersionA(); return version value. + /// 主版号 = (return version value) / 100. + /// 子版号 = (return version value) % 100. + /// + /// + ///int nVersion, nMainVersion, nSubVersion; + ///nVersion = B_Get_DLL_Version(1); + ///nMainVersion = nVersion / 100; + ///nSubVersion = nVersion % 100; + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern IntPtr B_Get_DLL_Version(int nShowMessage); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_DLL_VersionA(int nShowMessage); + /// + /// 转换 BMP 彩色图档变灰阶,并将图形存在打印机的 RAM 中 + /// + /// X 座标。 + /// Y 座标。 + /// + /// 图形档名称,可包含路径。 + /// 格式如:XXXXXXXX.XXX 或 X:\XXX\XXX.XXX + /// + /// + /// 0 -> OK. + /// Reference BW-Error.txt file. + /// + /// + /// B_Get_Graphic_ColorBMP(30, 20, “bb.bmp”); + /// B_Get_Graphic_ColorBMPEx(30, 20, 200, 150, 2, “bb1”, “bb.bmp”);//180 angle. + /// + /// + /// 这个 B_Get_Graphic_ColorBMP() 函数可输入任何位元数的 BMP 图档,并自动转换 + /// 为黑白灰阶图档送至打印机打印。 + /// B_Get_Graphic_ColorBMPEx() 函式可做放大,缩小及旋转的功能,可利用档名当 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_Graphic_ColorBMP(int x, int y, string filename); + /// + /// 转换 BMP 彩色图档变灰阶,并将图形存在打印机的 RAM 中,此指令可设置图片宽与高 + /// + /// + /// + /// + /// + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_Graphic_ColorBMPEx(int x, int y, int nWidth, int nHeight, + int rotate, string id_name, string filename); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_Graphic_ColorBMP_HBitmap(int x, int y, int nWidth, int nHeight, + int rotate, string id_name, IntPtr hbm); + /// + /// 打印一个图形并将图形存在打印机的记忆体中 + /// + /// X 座标 + /// Y 座标。(1 dot = 0.125 mm) + /// + /// 图形档名称,可含路径。 + /// 格式如:XXXXXXXX.XXX 或 X:\XXX\XXX.XXX + /// + /// + /// 0 -> OK. + /// Reference BW-Error.txt file. + /// + /// + /// B_Get_Pcx(10,100,“phone.pcx”); + /// + /// + /// 这个 B_Get_Pcx 函数会列印一个图形并将图形储存在打印机内的 RAM 或 + /// flash memory。图形档必须是 PCX 的格式。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_Pcx(int x, int y, string filename); + /// + /// 前置处理 + /// + /// 选择输入模式。0 -> 输入字串,1 -> 输入档案。 + /// 资料来源,可为字串或档案名称,可含路径。 + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// string aa = “ZT\r\n”; + ///B_Initial_Setting(0, aa); + ///or + ///B_Initial_Setting(1, “initfile.txt”); + /// + /// + /// 这个 B_Initial_Setting 函数前置处理的动作,是将一串 Command 先送至印表 + /// 机,由字串或档案输入,在使用这个函数时,须先在 B_Create_Prn() 之后其他 + /// 函数之前,可作为使用者自订型态。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Initial_Setting(int Type, string Source); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_WriteData(int IsImmediate, byte[] pbuf, int length); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_ReadData(byte[] pbuf, int length, int dwTimeoutms); + /// + /// 列印一个图形 + /// + /// X 座标 + /// Y 座标。备注:1 dot = 0.125 mm。 + /// 图形档名称。 + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// B_Load_Pcx(50, 30, “phone”); + /// + /// + /// 这个 B_Load_Pcx 函数会列印一个 PCX 格式图形,而图形必须事先载入打印 + /// 机内的 RAM 或 flash memory 储存。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Load_Pcx(int x, int y, string pcxname); + /// + /// 开启使用中文字型档案 (1615 和 2424)。 + /// + /// 中文字型档案来源路径。 + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + ///B_Open_ChineseFont(“C:\ET3”); + /// + /// + /// 这个 B_Open_ChineseFont 函数开启中文点矩阵字型档案 (1615 和 2424), + /// 供 B_Prn_Text_Chinese 函数使用。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Open_ChineseFont(string path); + /// + /// 打印一个 FORM (表格),并输入 FORM 所有变数、计数资料 + /// + /// 列印的份数,范围:1~32767。 + /// 複製的份数,范围:1~32767。 + /// 表格名称,同于之前载入的 FORM 名称,或原先储存在打印机内的 FORM。 + /// 输入 FORM 所有变数、计数资料,用 ",“依序分别区隔开。如果变数裡有”,“号, + ///可用”;,"来代表逗号。 + /// + /// 0 -> OK. + /// Reference BW-Error.txt file. + /// + /// + /// B_Print_form(3, 2, “demo”, “2000,Bicycle”); + /// + /// + /// 这个 B_Print_Form 函数会送所有资料及表格到 Printer,这个函数使用前 + /// 须先执行 B_Set_Form(),并在所有函数之后,B_ClosePrn() 之前执行。当使 + /// 用此函数时,就不须执行 B_Print_Out()。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Print_Form(int labset, int copies, string form_out, string var); + /// + /// 打印所有资料和加上跳号复制功能 + /// + /// 列印的份数,1 ~ 32767。 + /// + /// 複製的份数,1 ~ 32767。 + /// 当为 1 时同等于Print_Out()功能。 + /// + /// + /// 0-> OK. + /// Reference BW-Error.txt file. + /// + /// + /// B_Print_MCopy(2, 2); + /// + /// + /// 这个 B_Print_MCopy 函数会送所有资料到 Printer,这个函数须在所有函数之后, + ///B_ClosePrn() 之前执行,当使用此函数时,就不须执行 B_Print_Out()。 + ///它包含 B_Print_Out() 所有功能。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Print_MCopy(int labset, int copies); + /// + /// 送出打印内容 + /// + /// 列印复制的份数 + /// 0 -> OK. + /// + /// 这个 B_Print_Out 函数会送所有资料到 Printer,这个函数须在所有函数之后, + ///B_ClosePrn() 之前执行。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Print_Out(int labset); + /// + /// 打印一维条形码 + /// + /// X 坐标。 + /// Y 坐标。 + /// 列印方向定位,'0’是 0°,'1’是90°、'2’是180°,'3’是270° + /// + /// 条码型式、如下表: + ///type 条码种类 + ///0 Code 128 UCC(shipping container code) + ///1 Code 128 subset A, B and C + ///1E UCC/EAN + ///2 Interleaved 2 of 5 + ///2C Interleaved 2 of 5 with check sum digit + ///2D Interleaved 2 of 5 with human readable check digit + ///2G German Postcode + ///2M Matrix 2 of 5 + ///2U UPC Interleaved 2 of 5 + ///3 Code 3 of 9 + ///3C Code 3 of 9 with check sum digit + ///9 Code 93 + ///E30 EAN-13 + ///E32 EAN-13 2 digit add-on + ///E35 EAN-13 5 digit add-on + ///E80 EAN-8 + ///E82 EAN-8 2 digit add-on + ///E85 EAN-8 5 digit add-on + ///K Codabar + ///P Postnet + ///UA0 UPC-A + ///UA2 UPC-A 2 digit add-on + ///UA5 UPC-A 5 digit add-on + ///UE0 UPC-E + ///UE2 UPC-E 2 digit add-on + ///UE5 UPC-E 5 digit add-on + ///R14 RSS-14 + ///RL RSS Limited + ///RS RSS Stacked + ///RT RSS Truncated + ///RSO RSS Stacked Omnidirectiona + ///REX RSS Expanded + /// + /// bar 宽度在最小单位,若是RSS条码,则此参数为条码寬度的倍数,范围为1 ~10,预设值为1。 + /// + /// 寬度在最小单位, + /// 若是RSS条码,则此参数为每列条码可包含的最大資料区域数量,只在使用RSS Expanded条码时 + /// 有效,在其它类型的RSS条码中则为无效参数,范围为2 ~22,预设值为22,且此值必需為偶数。 + /// + /// + /// 条码高度。 + /// RSS条码的标准的最小高度限制: + /// R14 -> 33 pixels + /// RL -> 10 pixels + /// RS -> 13 pixels + /// RT -> 13 pixels + /// RSO -> 69 pixels + /// REX -> 34 pixels + /// + /// 当 human 是'N'时,则不列印文字,当 human 是'B'时,则列印可读文字。 + /// + /// 资料字串,与资料末端加上,则有跳号功能, + /// Operation: + or - 记号,Number: 0 ~ 32768 数值。 + /// 若在RSS需要加上2D(composite symbol)的资料时, 需加上'|'符号, 如1234567890123|123. + /// RSS条码的最大数值限制: + /// R14 -> 9999999999999 + /// RL -> 1999999999999 + /// RS -> 9999999999999 + /// RT -> 9999999999999 + /// RSO -> 9999999999999 + /// REX -> 74 digits + /// + /// 0 -> OK. + /// + /// 注:经测试,type=1E 手机不能识别;type=1 手机可识别; + /// 这个 B_Prn_Barcode 函数可以列印出一个指定类型的条码 功能。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + + public static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow, + int width, int height, char human, string data); + /// + /// 获取标签宽度 + /// + /// + /// + //[DllImport("Library\\x64\\Winpplb.dll")] + //public static extern int B_Get_PrintWidth(ref int labelWidth); + + /// + /// 打印出打印机配置讯息 + /// + /// + /// 这个 B_Prn_Configuration 函数会打印打印机内部配置,包含设定、 + /// firmware 版本、accessories、等…。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern void B_Prn_Configuration(); + + [DllImport("Library\\x64\\Winpplb.dll")] + /// + /// 印出一行文字和加上跳號功能 + /// + /// X 座标 + /// Y 座标 + /// 列印方向定位,'0’是 0°,'1’是90°、'2’是180°,'3’是270° + /// 选择字形,1~5 选择常伫字形。 + /// 水平放大比例,范围:1~24。 + /// 垂直放大比例,范围:1~24。 + /// + /// 反白功能,'N’普通文字,'R’反白文字。 + /// 资料字串,当尾端资料加上 格式为加上跳号功能, + /// Operation: + or - 记号,Number: 0 ~ 32768 数值。 + /// + /// + /// 0 -> OK. + /// Reference BW-Error.txt file. + /// + /// + ///B_Prn_Text(50, 110, 0, 4, 1, 1, ‘N’, “A123456”); //无跳号功能 + ///or + ///B_Prn_Text(50, 110, 0, 4, 1, 1, ‘N’, “A123456<-1>”); //有跳号功能 + /// + public static extern int B_Prn_Text(int x, int y, int ori, int font, int hor_factor, + int ver_factor, char mode, string data); + /// + /// 打印出一行文字,使用中文字型档案 (1615 或 2424) + /// + /// X 座标 + /// Y 座标 + /// 矩阵字型选择。0 -> 1615、1 -> 2424。 + /// 给予一个识别名称存放于打印机内,以后直接使用 B_Load_Pcx() 即可将旧图呼叫出来。 + /// 文字内容。 + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// 这个 B_Prn_Text_Chinese 函数可以印出一行文字,使用中文点矩阵字型档案 + ///(1615 或 2424)。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Prn_Text_Chinese(int x, int y, int fonttype, string id_name, + string data); + /// + /// 打印Windows仿真字 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Prn_Text_TrueType(int x, int y, int FSize, string FType, + int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, + string data); + /// + /// 打印出一行Windows仿真字,並控制字型的宽及高 + /// + /// X 座标, 单位: 像素 + /// Y 座标, 单位: 像素 + /// 字型高度,单位为点(dot) + /// 字型宽度,单位为点(dot)。FSize / FHeight / FWidth = (dpi * point) / 72. + /// TrueType font 字型名称。 + /// TrueType font 字体旋转。1 -> 0, 2 -> 90, 3 -> 180, 4 -> 270 + /// + /// TrueType font 字体粗细。 + /// 0 and NULL and 400 -> 400 标准、 + /// 100 -> 非常细、200 -> 极细、 + /// 300 -> 细 、500 -> 中等、 + /// 600 -> 半粗 、700 -> 粗 、 + /// 800 -> 特粗 、900 -> 黑体。 + /// + /// TrueType font 字体斜体。0 -> FALSE、1 -> TRUE。 + /// TrueType font 字体加底线。0 -> FALSE、1 -> TRUE。 + /// TrueType font 字体加删除线。0 -> FALSE、1 -> TRUE。 + /// 给予一个识别名称存放于打印机内,以后直接使用 B_Load_Pcx() 即可将旧图呼叫出来。 + /// + /// 文字内容。 + /// B_Prn_Text_TrueType_Uni()与B_Prn_Text_TrueType_UniB()所输入的data格式为UTF-8、 + /// UTF-16或Unicode big endian之字串,且需为0结尾。 + /// + /// + ///0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + ///这个 B_Prn_Text_TrueType() 函数可以印出一行 True Type Font 文字。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Prn_Text_TrueType_W(int x, int y, int FHeight, int FWidth, + string FType, int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, + string id_name, string data); + /// + /// 设置转印模式、启动 Cutter 或 Peel + /// + /// + /// 打印机功能选项。 + ///1 -> 开启热转,关闭 Cutter 和 Peel。 + ///2 -> 开启热感,关闭 Cutter 和 Peel。 + ///3 -> 开启热感和 Cutter,关闭 Peel。 + ///4 -> 开启热感和 Peel,关闭 Cutter。 + ///5 -> 开启热转和 Cutter,关闭 Peel。 + ///6 -> 开启热转和 Peel,关闭 Cutter。 + /// + /// + /// 0 -> OK. + /// Reference BW-Error.txt file. + /// + /// + /// B_Select_Option(1); + /// B_Select_Option2(3, 2); + /// + /// + /// B_Select_Option, B_Select_Option2函数可以选择不同 Printer 选项,使印 + ///表机依据这些选项工作。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Select_Option(int option); + /// + /// 设置转印模式、启动 Cutter 或 Peel + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Select_Option2(int option, int p); + /// + /// 符号设定选择 + /// + /// 资料位元数量。8 是 8-bit data 和 7 是 7-bit data。 + /// + /// 符号设定。见下表:备注:工厂内定符号设定是 Code page 437(English)。 + /// | 8 bit data | 7 bit data | + ///|symbol| Code page |symbol| Code page | + /// | 0 |English(437) | 0 |USASCII | + /// | 1 |Latin(850) | 1 |British | + /// | 2 |Slavic(852) | 2 |German | + /// | 3 |Portugal(860) | 3 |French | + /// | 4 |Canadian?French(863)| 4 |Danish | + /// | 5 |Nordic(865) | 5 |Italian | + /// | | | 6 |Spanish | + /// | | | 7 |Swedish | + /// | | | 8 |Swiss | + /// csymbol; + ///符号设定。见下表:备注:工厂内定符号设定是 Code page 437(English)。 + ///| 8 bit data | 7 bit data | + /// |symbol| Code page |symbol| Code page | + /// | 0 |English(437) | 0 |USASCII | + /// | 1 |Latin(850) | 1 |British | + ///| 2 |Slavic(852) | 2 |German | + /// | 3 |Portugal(860) | 3 |French | + /// | 4 |Canadian/French(863)| 4 |Danish | + ///| 5 |Nordic(865) | 5 |Italian | + /// | 6 |Turkish(857) | 6 |Spanish | + /// | 7 |Icelandic(861) | 7 |Swedish | + /// | 8 |Hebrew(862) | 8 |Swiss | + ///| 9 |Cyrillic(855) | | | + ///| 10 |Cyrillic CIS(866) | | | + ///| 11 |Greek(737) | | | + ///| 12 |Greek(851) | | | + ///| 13 |Greek(869) | | | + ///| A |Latin(1252) | | | + ///| B |Latin(1250) | | | + ///| C |Cyrillic(1251) | | | + ///| D |Greek(1253) | | | + ///| E |Turkish(1254) | | | + ///| F |Hebrew(1255) | | | + /// + /// KDU country code. + /// 0 -> OK. + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Select_Symbol(int num_bit, int symbol, int country); + /// + /// 符号设定选择 + /// + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Select_Symbol2(int num_bit, string csymbol, int country); + /// + /// 启动 Back feed + /// + /// + /// 功能选项, + /// “B” 关闭 Back feed。 + /// “F” 启动 Back feed。 + ///它可吐出一定长度,让使用者看到印出结果。 + /// + /// 0 -> OK. + /// B_Set_Backfeed(‘B’); + /// 这个 B_Set_Backfeed 函数可以调整停止点。 + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Backfeed(char option); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Backfeed_Offset(int offset); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_CutPeel_Offset(int offset); + /// + /// 储存影像图档 + /// + /// + /// 1 -> 储存图档 + ///0 -> 不储存图档 + /// + /// 储存图档的名称 + /// 0 -> OK. + /// B_Set_BMPSave(1, “C:\TempBMP.bmp”); + /// + /// 这个 B_Set_BMPSave 函数,可以决定是否储存影像图档。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_BMPSave(int nSave, string strBMPFName); + /// + /// 设置打印浓度 + /// + /// 设定打印头打印热度,范围:0~15,內定是 8。 + /// 0 -> OK. + /// + /// 這個 B_Set_Darkness 函数控制影像浓淡,想得到更好的印出品质,你应该 + /// 考虑一些因素,印出图案样式、速度、耗材种类等。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Darkness(int darkness); + /// + /// 设置除错环境 + /// + /// + /// 1 -> 除错环境致能 + /// 0 -> 除错环境关闭 + /// + /// 0 -> OK. + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_DebugDialog(int nEnable); + /// + /// 设置打印方向 + /// + /// + /// 设定列印方向,范围:B 和 T。它们是对角对称。内定是 T。 + /// + /// 0 -> OK. + /// + /// B_Set_Direction(‘T’); + /// + /// 这个 B_Set_Direction 函数设定列印方向,对整个版面内所有图形文字。 + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Direction(char direction); + /// + /// 储存并打印 FORM (表格) + /// + /// 表格档案名称,可含路径。 + /// 0 -> OK. + ///B_Set_Form(“demo.prn”); + /// + ///这个 B_Set_Form 函数储存并列印 FORM (表格)。在使用这个函数时,须先 + ///在 B_Print_Form函数之前。使用此函数时,就必须执行 B_Print_Form()。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Form(string formfile); + /// + /// 同时设置标签长度及 GAP 长度 + /// + /// 在最后影像线段的标籤长度。单位 dot。 + /// GAP 长度。当是连续纸时,必须设为 0。 + /// 0 -> OK. + /// + /// 这个 B_Set_Labgap 函数设定标籤长度及 GAP 长度。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Labgap(int lablength, int gaplength); + /// + /// 设置标签宽度 + /// + /// 标籤宽度。单位 dot。 + /// 0 -> OK + /// + /// 这个 B_Set_Labwidth 函数设定标籤宽度。当使用此函数,就不能使用 B_Set_Originpoint 函数。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Labwidth(int labwidth); + /// + /// 设置打印初始位置 + /// + /// 水平边界基点。单位 dot。 + /// 垂直边界基点。单位 dot。 + /// 0 -> OK. + /// + /// B_Set_Originpoint(0, 0); + /// + /// + /// 这个 B_Set_Originpoint 函数使用重新设定起源点 X、Y 轴。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Originpoint(int hor, int ver); + /// + /// 设置 Serial Port + /// + /// + /// 鲍尔率,如下表: + ///38 -> 38400 + ///19 -> 19200 + ///96 -> 9600 + ///48 -> 4800 + ///24 -> 2400 + ///57 -> 57600 + ///11 -> 115200 + /// + /// 。'O’是 odd,'E’是 even parity, 'N’是 none parity。 + /// Data bit number,7 或 8。 + /// Stop bit number,1 或 2。 + /// 0 -> OK. + /// + ///VC: + /// B_Set_Prncomport(96, ‘N’, 8, 1); + /// + /// + /// 这个 B_Set_Prncomport 函数会设定打印机序列埠设定值,来改变打印机相同于 + ///PC 序列埠设定值,如果不同则无法与 PC 连接。此函数必须在函数 Print_Out + ///之前执行,必须单独执行。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Prncomport(int baud, char parity, int data, int stop); + /// + /// 设置 PC 序列埠 + /// + /// + /// 鲍尔率,如下表: + /// 1 -> 110 9 -> 19200 + /// 2 -> 300 10 -> 38400 + /// 3 -> 600 11 -> 56000 + /// 4 -> 1200 12 -> 57600 + /// 5 -> 2400 13 -> 115200 + /// 6 -> 4800 14 -> 128000 + /// 7 -> 9600 15 -> 256000 + /// 8 -> 14400 0 -> 9600 + /// + /// + /// Data bit number: + /// 0 -> 7-bit data + /// 7 -> 7-bit data + /// 8 -> 8-bit data + /// + /// + /// 0 -> none parity + /// 1 -> even parity + /// 2 -> odd parity + /// + /// 1 stop bit + /// 1 -> 1 stop bit + /// 2 -> 2 stop bits + /// + /// + /// Setup hardware flow control + ///1 -> DTR CONTROL HANDSHAKE; + ///0 -> DTR CONTROL ENABLE; + /// + /// + /// Setup hardware flow control + /// 1 -> RTS CONTROL HANDSHAKE; + /// 0 -> RTS CONTROL ENABLE; + /// + /// + /// Setup software flow control + /// 0 -> Enable; + /// 1 -> Disable; + /// + /// 0 -> OK. + /// + /// B_Set_Prncomport_PC(0, 0, 0, 0, 0, 0, 0); + /// + /// + /// 这个 B_Set_Prncomport_PC 函数会设定 PC 序列埠设定值,来改变 PC 相同于打印机序列埠 + ///设定值,如果不同则无法与打印机连接。此函数必须在函数 B_Print_Out 之前执行。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Prncomport_PC(int nBaudRate, int nByteSize, int nParity, + int nStopBits, int nDsr, int nCts, int nXonXoff); + /// + /// 设置打印速度 + /// + /// + /// 列印速度,范围:0~7。 + ///| speed Value | SPEED | + /// | 0 or 1 | 1 ips (25 mmps) | + /// | 2 | 2 ips (50 mmps) | + /// | 3 | 3 ips (75 mmps) | + ///| 4 | 4 ips (100 mmps) | + /// | 5 | 5 ips (125 mmps) | + /// | 6 | 6 ips (150 mmps) | + /// | 7 | 7 ips (175 mmps) | + /// + /// + /// + /// 这个 B_Set_Speed 函数设定列印速度,GT-2140最高速度可达4ips。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_Speed(int speed); + /// + /// 开启或关闭进度对话框 + /// + /// + /// 0 -> 关闭。 + ///1 -> 开启。 + /// + /// + /// + /// 这个 B_Set_ProcessDlg 函数可开关进度对话框 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_ProcessDlg(int nShow); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_ErrorDlg(int nShow); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_GetUSBBufferLen(); + /// + /// 枚举USB端口设备 + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_EnumUSB(byte[] buf); + /// + /// 开启USB打印端口 + /// + /// USB 传输埠, nPort由1开始 + /// 0 :成功 + /// + /// 说明:用以开启USB打印机端口,开启成功后才可以打印标签内容。而这个函数必須在 + /// B_EnumUSB()搜索到可用的USB打印机端口后,才能执行。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_CreateUSBPort(int nPort); + /// + /// 使打印机重开机 + /// + /// + /// 0 -> OK. + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_ResetPrinter(); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_GetPrinterResponse(byte[] buf, int nMax); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_TFeedMode(int nMode); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_TFeedTest(); + /// + /// 开启端口進行传输 + /// + /// + /// 选择输出埠种类。 + /// 0 -> 档案 + /// 1 -> Serial port + /// 2 -> Parallel prot + /// 4 -> USB port + /// 5 -> LAN port + /// 6 -> USB port + /// + /// 选择输出埠编号。当 nPortType为 1 时, 1 -> com1, 2 -> com2,… + /// + /// 当 nPortType 为 0 时,资料则输出至档案,filename 为档案名称,可含路径。 + /// 当 nPortType 为 4 时,filename 指的是想开启的USB的index, index由1开始. + /// 当 nPortType 为 5 时,filename 指的是想开启的IP Address, 使用TCP/IP, + /// port 9100去开启. + /// 当 nPortType 为 6 时,filename 指的是想开启的USB的装置路径. + /// + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + /// 说明: B_CreatePort() 函数会开启你选择的输出埠或开启你键入的输出档。 + /// 而这个函数必须在所有函数之前执行。 + /// B_CreatePrn(), B_CreateUSBPort(), B_CreateNetPort() 和 B_CreatePort() 不能同时使用。 + /// + + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_CreatePort(int nPortType, int nPort, string filename); + /// + /// 打印一個已存在打印机內的 FORM (表格),并输入 FORM 所有变数、计数资料 + /// + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Execute_Form(string form_out, string var); + /// + /// 打印 QR 條碼 + /// + /// X 坐标 + /// Y 坐标 + /// QR条码模式,范围:1,2 (若不符范围则打印机会采用预设值: 2)。 + /// 条码尺寸,范围: 1~99 (若不符范围则打印机会采用预设值: 3)。 + /// + /// 错误校正等級。 + /// L = Lower error correction, most data + ///M = Default + ///Q = Optimized for error correction over data + ///H = Highest error correction, latest data + /// + /// + /// 資料輸入模式。 + ///A = 自動模式 + ///M = 手動模式 + ///(若不符範圍則印表機會採用預設值: A) + /// + /// 項目 |Symbol Number| c | 1~16 | + /// 变数 | Divisions | d | 1~16 | + /// 范围 | Parity | p | 0~255| + /// 资料字串。 + /// 0 -> OK. + /// B_Bar2d_QR 函數可以列印 QR 条码,支持中文字及日文字。 + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Bar2d_QR(int x, int y, int model, int scl, char error, + char dinput, int c, int d, int p, string data); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_GetNetPrinterBufferLen(); + /// + /// 枚举 Net Printer设备 + /// + /// + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_EnumNetPrinter(byte[] buf); + /// + /// 使用 网路进行传输 + /// + /// USB 传输埠 ; LAN 传输埠, nPort由1开始. + /// + /// 0 -> OK. + ///Reference BW-Error.txt file. + /// + /// + ///说明: B_CreateUSBPort() 和 B_CreateNetPort()函数会开启你选择的输出埠或 + /// 开启你键入的输出档。而这个函数必须在所有函数之前执行。 + /// B_CreatePrn(), B_CreateUSBPort() , B_CreateNetPort() 和 B_CreatePort() 不能同时使用。 + /// + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_CreateNetPort(int nPort); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Prn_Text_TrueType_Uni(int x, int y, int FSize, string FType, + int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, + byte[] data, int format); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Prn_Text_TrueType_UniB(int x, int y, int FSize, string FType, + int Fspin, int FWeight, int FItalic, int FUnline, int FStrikeOut, string id_name, + byte[] data, int format); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_GetUSBDeviceInfo(int nPort, byte[] pDeviceName, + out int pDeviceNameLen, byte[] pDevicePath, out int pDevicePathLen); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_EncryptionKey(string encryptionKey); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Check_EncryptionKey(string decodeKey, string encryptionKey, + int dwTimeoutms); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_CommTimeout(int ReadTotalTimeoutConstant, int WriteTotalTimeoutConstant); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Get_CommTimeout(out int ReadTotalTimeoutConstant, out int WriteTotalTimeoutConstant); + [DllImport("Library\\x64\\Winpplb.dll")] + public static extern int B_Set_LabelForSmartPrint(int lablength, int gaplength); + + + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index 65b20240..5aaf649b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -39,6 +39,7 @@ namespace Tnb.WarehouseMgr /// public class TimedTaskBackgroundService : BackgroundService { + public bool IsStarted { get; set; } private IEventPublisher _eventPublisher = default!; private readonly IServiceProvider _serviceProvider; private static Dictionary> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase); @@ -59,6 +60,7 @@ namespace Tnb.WarehouseMgr protected override Task ExecuteAsync(CancellationToken stoppingToken) { + IsStarted = true; var queueTask = Task.Run(async () => { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj index cb4b994d..b74e112b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj +++ b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj @@ -1,4 +1,4 @@ - + @@ -18,4 +18,22 @@ + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs index 108fca64..2c510901 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryService.cs @@ -218,5 +218,16 @@ namespace Tnb.WarehouseMgr } return (row > 0); } + + /// + /// 条码打印 + /// + /// + /// + [HttpPost] + public async Task BarCodePrint(List barCodes) + { + await base.BarCodePrint(barCodes); + } } } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs index 00ee9dfe..18b256c2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs @@ -33,6 +33,8 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; using System.Reflection; +using Tnb.WarehouseMgr.Print; +using System.Runtime.InteropServices; namespace Tnb.WarehouseMgr { @@ -161,12 +163,12 @@ namespace Tnb.WarehouseMgr ? (a, b) => a.id == input.data[nameof(WmsOutstockH.carry_id)].ToString() : (a, b) => outStkCarrys.Select(x => x.id).Contains(b.carry_id); - carryCodesPart = await _db.Queryable().InnerJoin((a, b) => a.id == b.carry_id).InnerJoin((a, b, c) => a.location_id == c.id) - .Where(whereExp) - .Select() - .MergeTable() - .OrderBy(it=>it.create_time) - .ToListAsync(); + carryCodesPart = await _db.Queryable().InnerJoin((a, b) => a.id == b.carry_id).InnerJoin((a, b, c) => a.location_id == c.id) + .Where(whereExp) + .Select() + .MergeTable() + .OrderBy(it => it.create_time) + .ToListAsync(); if (carryCodesPart?.Count > 0) { @@ -375,6 +377,146 @@ namespace Tnb.WarehouseMgr return Task.FromResult(true); } + /// + /// 测试获取路径 + /// + /// + [HttpGet] + public async Task GetTest() + { + //D:\Workspce\tianyi\TuoTong-LowCodePlatform-BackEnd\apihost\Tnb.API.Entry\bin\Debug\net6.0\ + var dllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64"); + var files = Directory.GetFiles(dllPath); + return dllPath; + } + + + public async Task PrintTest(List barCodes) + { + // open port. + int nLen, ret, sw; + byte[] pbuf = new byte[128]; + string strmsg; + + IntPtr ver; + System.Text.Encoding encAscII = System.Text.Encoding.ASCII; + System.Text.Encoding encUnicode = System.Text.Encoding.Unicode; + + // dll version. + ver = PPLBUtility.B_Get_DLL_Version(0); + // search port. + nLen = PPLBUtility.B_GetUSBBufferLen() + 1; + strmsg = "DLL "; + strmsg += Marshal.PtrToStringAnsi(ver); + strmsg += "\r\n"; + if (nLen > 1) + { + byte[] buf1, buf2; + int len1 = 128, len2 = 128; + buf1 = new byte[len1]; + buf2 = new byte[len2]; + PPLBUtility.B_EnumUSB(pbuf); + PPLBUtility.B_GetUSBDeviceInfo(1, buf1, out len1, buf2, out len2); + sw = 1; + if (1 == sw) + { + ret = PPLBUtility.B_CreatePrn(12, encAscII.GetString(buf2, 0, len2));// open usb. + } + else + { + ret = PPLBUtility.B_CreateUSBPort(1);// must call B_GetUSBBufferLen() function fisrt. + } + if (0 != ret) + { + strmsg += "Open USB fail!"; + } + else + { + strmsg += "Open USB:\r\nDevice name: "; + strmsg += encAscII.GetString(buf1, 0, len1); + strmsg += "\r\nDevice path: "; + strmsg += encAscII.GetString(buf2, 0, len2); + //sw = 2; + if (2 == sw) + { + //Immediate Error Report. + PPLBUtility.B_WriteData(1, encAscII.GetBytes("^ee\r\n"), 5);//^ee + ret = PPLBUtility.B_ReadData(pbuf, 4, 1000); + } + } + } + else + { + System.IO.Directory.CreateDirectory(PPLBUtility.szSavePath); + ret = PPLBUtility.B_CreatePrn(0, PPLBUtility.szSaveFile);// open file. + strmsg += "Open "; + strmsg += PPLBUtility.szSaveFile; + if (0 != ret) + { + strmsg += " file fail!"; + } + else + { + strmsg += " file succeed!"; + } + } + if (0 != ret) + return null; + + // sample setting. + //B_Set_DebugDialog(1); + //var sznop2 = "测试"; + //var sznop1 = "测试2"; + PPLBUtility.B_Set_Originpoint(0, 0); + PPLBUtility.B_Select_Option(2); + PPLBUtility.B_Set_Darkness(8); + PPLBUtility.B_Del_Pcx("*");// delete all picture. + //PPLBUtility.B_WriteData(0, encAscII.GetBytes(sznop2), sznop2.Length); + //PPLBUtility.B_WriteData(1, encAscII.GetBytes(sznop1), sznop1.Length); + //When using standard label, and the printer is Intelli Print mode or Smart Print mode, + //When calling this function and giving the correct label information, + //the immediate print function will be enabled according to the label length setting. + PPLBUtility.B_Set_LabelForSmartPrint(254 * 3, 30);//label information: length= 3 * 25.4 mm, gap= 3 mm. + + //draw box. + //PPLBUtility.B_Draw_Box(20, 20, 4, 760, 560); + //PPLBUtility.B_Draw_Line('O', 400, 20, 4, 540); + + //print text, true type text. + PPLBUtility.B_Prn_Text(250, 50, 0, 2, 2, 2, 'N', "PPLB Lib Example"); + //PPLBUtility.B_Prn_Text_TrueType(30, 100, 30, "Arial", 1, 400, 0, 0, 0, "AA", "TrueType Font");//save in printer. + //PPLBUtility.B_Prn_Text_TrueType_W(30, 160, 20, 20, "Times New Roman", 1, 400, 0, 0, 0, "AB", "TT_W: 多字元測試"); + //PPLBUtility.B_Prn_Text_TrueType_Uni(30, 220, 30, "Times New Roman", 1, 400, 0, 0, 0, "AC", Encoding.Unicode.GetBytes("TT_Uni: 多字元測試"), 1);//UTF-16 + //encUnicode.GetBytes("\xFEFF", 0, 1, pbuf, 0);//UTF-16.//pbuf[0]=0xFF,pbuf[1]=0xFE; + //encUnicode.GetBytes("TT_UniB: 多字元測試", 0, 14, pbuf, 2);//copy mutil byte. + //encUnicode.GetBytes("\x0000", 0, 1, pbuf, 30);//null.//pbuf[30]=0x00,pbuf[31]=0x00; + //PPLBUtility.B_Prn_Text_TrueType_UniB(30, 280, 30, "Times New Roman", 1, 400, 0, 0, 0, "AD", pbuf, 0);//Byte Order Mark. + + var labelWth = 800; + var barcodeWth = 508; + var x = (labelWth - barcodeWth) / 2; + + //barcode. + PPLBUtility.B_Prn_Barcode(150, 100, 0, "E80", 8, 500, 70, 'N', "1234<+10>");//have a counter + //PPLBUtility.B_Bar2d_QR(420, 200, 1, 3, 'M', 'A', 0, 0, 0, "QR CODE"); + + //picture. + //PPLBUtility.B_Get_Graphic_ColorBMP(420, 280, "bb.bmp");// Color bmp file. + //PPLBUtility.B_Get_Graphic_ColorBMPEx(420, 320, 200, 150, 2, "bb1", "bb.bmp");//180 angle. + //IntPtr himage = LoadImage(IntPtr.Zero, "bb.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); + //PPLBUtility.B_Get_Graphic_ColorBMP_HBitmap(630, 280, 250, 80, 1, "bb2", himage);//90 angle. + //if (IntPtr.Zero != himage) + // DeleteObject(himage); + + // output. + PPLBUtility.B_Print_Out(1);// copy 2. + + // close port. + PPLBUtility.B_ClosePrn(); + return "success"; + } + + /// /// 根据出库申请单ID获取申请单明细信息 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs index 7c38bb97..0f3c657d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs @@ -97,8 +97,8 @@ namespace Tnb.WarehouseMgr [HttpPost, Timed(Name = nameof(PackSortingByAdd))] public async Task PackSortingByAdd(CancellationTokenSource? cts = default) { - if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; - var curUser = await GetUserIdentity(); + //if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; + //var curUser = await GetUserIdentity(); //Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId}\t Thread pool: {Thread.CurrentThread.IsThreadPoolThread}"); @@ -267,7 +267,7 @@ namespace Tnb.WarehouseMgr { RequestURL = App.HttpContext?.Request?.Path, RequestMethod = App.HttpContext?.Request?.Method, - userIdentity = curUser, + userIdentity = await GetUserIdentity(_userManager.ToKen), }; var timedTaskEx = ex.ToTimedTaskException(ei); cts?.Cancel(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs index 131c9fd7..c5ac5cad 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs @@ -80,8 +80,8 @@ namespace Tnb.WarehouseMgr [HttpPost, Timed(Name = nameof(KittingOutByAdd))] public async Task KittingOutByAdd(CancellationTokenSource? cts = default) { - if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; - var curUser = await GetUserIdentity(); + //if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; + //var curUser = await GetUserIdentity(); var curDb = _db.CopyNew(); try { @@ -136,8 +136,8 @@ namespace Tnb.WarehouseMgr setSortingH.id = SnowflakeIdHelper.NextId(); setSortingH.kittingout_id = ko.id; setSortingH.seq = ko.seq; - setSortingH.org_id = curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value; - setSortingH.create_id = curUser.FindFirst(ClaimConst.CLAINMUSERID)!.Value; + setSortingH.org_id = _userManager.User.OrganizeId; + setSortingH.create_id = _userManager.UserId; setSortingH.create_time = DateTime.Now; await curDb.Insertable(setSortingH).ExecuteCommandAsync(); @@ -148,8 +148,8 @@ namespace Tnb.WarehouseMgr x.id = SnowflakeIdHelper.NextId(); x.bill_id = setSortingH.id; x.warehouse_id = setSortingH.warehouse_id; - x.org_id = curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value; - x.create_id = curUser.FindFirst(ClaimConst.CLAINMUSERID)!.Value; + x.org_id = _userManager.User.OrganizeId; + x.create_id = _userManager.UserId; x.create_time = DateTime.Now; }); await curDb.Insertable(setSortDetails).ExecuteCommandAsync(); @@ -171,7 +171,7 @@ namespace Tnb.WarehouseMgr { RequestURL = App.HttpContext?.Request?.Path, RequestMethod = App.HttpContext?.Request?.Method, - userIdentity = curUser, + userIdentity = await GetUserIdentity(_userManager.ToKen), }; var timedTaskEx = ex.ToTimedTaskException(ei); cts?.Cancel(); @@ -185,8 +185,8 @@ namespace Tnb.WarehouseMgr [HttpPost, Timed(Name = nameof(KittingOutByIsToBeShipped))] public async Task KittingOutByIsToBeShipped(CancellationTokenSource? cts = default) { - if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; - var curUser = await GetUserIdentity(); + //if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; + //var curUser = await GetUserIdentity(); var curDb = _db.CopyNew(); try { @@ -225,7 +225,7 @@ namespace Tnb.WarehouseMgr WmsPretaskH preTask = new() { - org_id = curUser.FindFirst(ClaimConst.CLAINMORGID)?.Value, + org_id = _userManager.User.OrganizeId, startlocation_id = sPoint?.location_id!, startlocation_code = sPoint?.location_code!, endlocation_id = ePoint?.location_id!, @@ -246,7 +246,7 @@ namespace Tnb.WarehouseMgr area_code = it.Key, require_id = ko.id, require_code = ko.bill_code, - create_id = curUser.FindFirst(ClaimConst.CLAINMUSERID)!.Value, + create_id = _userManager.UserId, create_time = DateTime.Now, source_id = ko.source_id, source_code = ko.source_code @@ -278,7 +278,7 @@ namespace Tnb.WarehouseMgr { RequestURL = App.HttpContext?.Request?.Path, RequestMethod = App.HttpContext?.Request?.Method, - userIdentity = curUser, + userIdentity = await GetUserIdentity(_userManager.ToKen), }; var timedTaskEx = ex.ToTimedTaskException(ei); cts?.Cancel(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Core.dll b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Core.dll new file mode 100644 index 00000000..05b0e1ec Binary files /dev/null and b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Core.dll differ diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.Usb.dll b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.Usb.dll new file mode 100644 index 00000000..6124fddf Binary files /dev/null and b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.Usb.dll differ diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.dll b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.dll new file mode 100644 index 00000000..4beb6abd Binary files /dev/null and b/WarehouseMgr/Tnb.WarehouseMgr/ZebraLib/SdkApi.Desktop.dll differ diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 2d5ed531..380d5a41 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -64,8 +64,10 @@ public class Startup : AppStartup services.AddOverideVisualDev(); //注册任务消息通知 added by ly on 20230814 services.AddTaskMessageNotify(); + + services.AddSingleton(); //定时任务 - services.AddHostedService(); + //services.AddHostedService(); } diff --git a/system/Tnb.OAuth/OAuthService.cs b/system/Tnb.OAuth/OAuthService.cs index 70bdb220..186c6dd8 100644 --- a/system/Tnb.OAuth/OAuthService.cs +++ b/system/Tnb.OAuth/OAuthService.cs @@ -43,6 +43,7 @@ using JNPF.Extras.DatabaseAccessor.SqlSugar.Models; using Aop.Api.Domain; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using bf = System.Reflection.BindingFlags; namespace JNPF.OAuth; @@ -142,6 +143,8 @@ public class OAuthService : IDynamicApiController, ITransient private readonly IMHandler _imHandler; + private readonly BackgroundService _backgroundService; //added by ly on 20230916 + /// @@ -165,7 +168,8 @@ public class OAuthService : IDynamicApiController, ITransient ICacheManager cacheManager, IUserManager userManager, IEventPublisher eventPublisher, - IMHandler imHandler) + IMHandler imHandler, + BackgroundService backgroundService) { _captchaHandler = captchaHandler; _userRepository = userRepository; @@ -185,6 +189,7 @@ public class OAuthService : IDynamicApiController, ITransient _userManager = userManager; _eventPublisher = eventPublisher; _imHandler = imHandler; + _backgroundService = backgroundService; } #region Get @@ -287,6 +292,20 @@ public class OAuthService : IDynamicApiController, ITransient var userId = _userManager.UserId; + //modify by ly on 20230918 登录成功后启动定时服务 + if (!userId.IsNullOrWhiteSpace()) + { + var isStartedProperty = _backgroundService.GetType().GetProperty("IsStarted"); + + if (isStartedProperty?.GetValue(_backgroundService) is bool isStarted && !isStarted) + { + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + await _backgroundService.StartAsync(cancellationTokenSource.Token); + } + } + + + var loginOutput = new CurrentUserOutput(); loginOutput.userInfo = await _userManager.GetUserInfo(); @@ -388,6 +407,9 @@ public class OAuthService : IDynamicApiController, ITransient { //await _cacheManager.DelAsync("AsscessToken"); + + //modify by ly on 20230918 + _backgroundService.PropertySetValue("IsStarted", false); UserManager.AsscessToken = string.Empty; var tenantId = _userManager.TenantId ?? "default";