当前位置:   article > 正文

.netcore TSC打印机打印

.netcore TSC打印机打印

此文章给出两种打印案例,

第一种是单列打印,第二种是双列打印

需要注意打印机名称的设置,程序中使用的打印机名称为999,电脑中安装打印机时名称也要为999。

以下是我在使用过程中总结的一些问题:

一 TSC打印机使用使用过程中遇到的问题

1、打印机刚连上就报警。

一般是纸张或色带安装有问题,纸张要放到档杆的下方。

2、打印机显示正常,DiagTool工具无法连接到打印机,无论点什么都提示“Port Open Error”。

如果使用USB模式,需要用线把打印机和电脑连接起来,同时打印机需插上网线。工具中,通讯接口选择USB,点击“读取状态”,正常显示待机中,点击“读取”,会重置工具中的各参数。

点击“网络设定”,指定IP地址,这里设置为192.168.50.222

如果用服务器连接打印机,这个时候已经添加了打印机,登录服务器,找到打印机,打开打印机属性-端口,打印机名称或ip地址设置为与打印机ip一致即可。

3、打印机打印完成后报警。

检查纸张,纸张安装过紧或档条没压住纸,都会导致此问题。

接下来上代码

二 打印方式

2.1 单列打印

这种打印方式示例中,打印的位置是可以配置的

  1. using Microsoft.Extensions.Logging;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Imagine.Mes.MesTrackV3.Application.CommonTool;
  7. using Imagine.Mes.MesTrackV3.Application.Dtos;
  8. using Volo.Abp.DependencyInjection;
  9. using Newtonsoft.Json;
  10. using System.IO;
  11. using Newtonsoft.Json.Linq;
  12. namespace Imagine.Mes.MesTrackV3.Application.Services
  13. {
  14. /// <summary>
  15. /// 打印服务
  16. /// </summary>
  17. public interface IPrintService
  18. {
  19. /// <summary>
  20. /// 打印流程卡
  21. /// </summary>
  22. /// <param name="printType">打印枚举 0-二维码;1-条形码</param>
  23. /// <param name="body">流程卡集合</param>
  24. /// <returns></returns>
  25. Task PrintLotAsync(PrintEnum printType, List<PrintLotInDto> body);
  26. }
  27. public class PrintService : IPrintService,IScopedDependency
  28. {
  29. private readonly ILogger<PrintService> _logger;
  30. public PrintService(ILogger<PrintService> logger)
  31. {
  32. _logger = logger;
  33. }
  34. #region 打印流程卡
  35. /// <summary>
  36. /// 打印流程卡
  37. /// </summary>
  38. /// <param name="printType">打印枚举 0-二维码;1-条形码</param>
  39. /// <param name="body">流程卡集合</param>
  40. /// <returns></returns>
  41. /// <exception cref="Exception"></exception>
  42. public async Task PrintLotAsync(PrintEnum printType, List<PrintLotInDto> body)
  43. {
  44. try
  45. {
  46. List<PrintLotInDto> printOutboundOrderList = new List<PrintLotInDto>();
  47. var jsonObject=await GetJsonFileAsync("CommonTool\\PrintLot.json");
  48. for (int i = 0; i < body.Count; i++)
  49. {
  50. await PrintLotAsync(printType,jsonObject, new PrintLotInDto
  51. {
  52. LotNo = body[i].LotNo,
  53. ProductCode = body[i].ProductCode,
  54. ProductName = body[i].ProductName,
  55. Quantity = body[i].Quantity,
  56. WorkOrderNo = body[i].WorkOrderNo,
  57. UnitName= body[i].UnitName
  58. });
  59. }
  60. }
  61. catch (Exception ex)
  62. {
  63. _logger.LogError($"打印流程卡错误:{ex}");
  64. throw new Exception($"打印流程卡错误:{ex.Message}");
  65. }
  66. }
  67. /// <summary>
  68. /// 打印流程卡
  69. /// </summary>
  70. /// <param name="printType">打印类型:0-二维码;1-条形码</param>
  71. /// <param name="jsonObject"></param>
  72. /// <param name="param"></param>
  73. /// <returns></returns>
  74. private async Task PrintLotAsync(PrintEnum printType, JObject jsonObject, PrintLotInDto param)
  75. {
  76. #region 模板
  77. string port = "999";
  78. string currentEncoding = "utf-16";
  79. string chineseFont = "宋体";
  80. byte[] lotNo = Encoding.GetEncoding(currentEncoding).GetBytes($"批 次 号:{param.LotNo}");
  81. byte[] productCode = Encoding.GetEncoding(currentEncoding).GetBytes($"产品编码:{param.ProductCode}");
  82. byte[] productName = Encoding.GetEncoding(currentEncoding).GetBytes($"产品名称:{param.ProductName}");
  83. byte[] quantity = Encoding.GetEncoding(currentEncoding).GetBytes($"数 量:{param.Quantity} {param.UnitName}");
  84. byte[] workOrderNo = Encoding.GetEncoding(currentEncoding).GetBytes($"工 单 号:{param.WorkOrderNo}");
  85. byte[] date = Encoding.GetEncoding(currentEncoding).GetBytes($"打印日期:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
  86. byte status = TSCLIB_DLL.usbportqueryprinter();//0 = idle, 1 = head open, 16 = pause, following <ESC>!? command of TSPL manual
  87. //打印机共享名999
  88. int openport = TSCLIB_DLL.openport(@$"{port}");
  89. //M 纸张宽度 ,N 纸张高度
  90. TSCLIB_DLL.sendcommand("SIZE 100 mm, 80 mm");
  91. TSCLIB_DLL.sendcommand("SPEED 4");
  92. TSCLIB_DLL.sendcommand("DENSITY 12");
  93. TSCLIB_DLL.sendcommand("DIRECTION 1");
  94. TSCLIB_DLL.sendcommand("SET TEAR ON");
  95. TSCLIB_DLL.sendcommand("CODEPAGE UTF-8");
  96. TSCLIB_DLL.clearbuffer();
  97. if (printType == PrintEnum.QRCode)//打印二维码
  98. {
  99. //文字(x边距,y边距,字体高度,旋转,字体样式,下划线,字体,文字内容)
  100. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["lotNo"]["x"]), Convert.ToInt32(jsonObject["lotNo"]["y"]), Convert.ToInt32(jsonObject["lotNo"]["size"]), 0, 0, 0, chineseFont, lotNo);
  101. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["productCode"]["x"]), Convert.ToInt32(jsonObject["productCode"]["y"]), Convert.ToInt32(jsonObject["productCode"]["size"]), 0, 0, 0, chineseFont, productCode);
  102. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["productName"]["x"]), Convert.ToInt32(jsonObject["productName"]["y"]), Convert.ToInt32(jsonObject["productName"]["size"]), 0, 0, 0, chineseFont, productName);
  103. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["quantity"]["x"]), Convert.ToInt32(jsonObject["quantity"]["y"]), Convert.ToInt32(jsonObject["quantity"]["size"]), 0, 0, 0, chineseFont, quantity);
  104. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["workOrderNo"]["x"]), Convert.ToInt32(jsonObject["workOrderNo"]["y"]), Convert.ToInt32(jsonObject["workOrderNo"]["size"]), 0, 0, 0, chineseFont, workOrderNo);
  105. TSCLIB_DLL.windowsfontUnicode(Convert.ToInt32(jsonObject["date"]["x"]), Convert.ToInt32(jsonObject["date"]["y"]), Convert.ToInt32(jsonObject["date"]["size"]), 0, 0, 0, chineseFont, date);
  106. //二维码
  107. //QRCODE x,y,ECC Level,cell width(二维码大小),mode,rotation(旋转),[model,mask,]"content"
  108. TSCLIB_DLL.sendcommand($"QRCODE {Convert.ToInt32(jsonObject["qRCode"]["x"])},{Convert.ToInt32(jsonObject["qRCode"]["y"])},H,{Convert.ToInt32(jsonObject["qRCode"]["size"])},A,0,M2,\"{param.LotNo}\"");
  109. }
  110. else// 打印条码.
  111. {
  112. // 在 (450, 200) 的坐标上
  113. // 以 Code128 的条码方式
  114. // 条码高度 300
  115. // 打印条码的同时,还打印条码的文本信息.
  116. // 旋转的角度为 0 度
  117. // 条码 宽 窄 比例因子为 7:7
  118. // 条码内容为:barCode
  119. //BARCODE X,Y,”code type”,height,human readable,rotation,narrow,wide,[alignment,]”content“
  120. TSCLIB_DLL.barcode("30", "30", "128", "180", "1", "0", "6", "6", $"{param.LotNo}");
  121. }
  122. //TSCLIB_DLL.sendcommand(String.Format("QRCODE 740,320,H,8,A,0,M2,\"{0}\"", trayCode));
  123. //DMATRIX码 。DMATRIX 命令,740,320,90,90 指定 X 坐标,指定 Y 坐标,条码区域宽度
  124. //TSCLIB_DLL.sendcommand($"DMATRIX 740,320,90,90,x18,30,30,\"{trayCode}\"");
  125. int printlabel = TSCLIB_DLL.printlabel("1", "1");
  126. TSCLIB_DLL.closeport();
  127. #endregion
  128. await Task.CompletedTask;
  129. }
  130. #endregion 打印流程卡
  131. #region 获取json文件内容
  132. private async Task<JObject> GetJsonFileAsync(string path)
  133. {
  134. try
  135. {
  136. // 获取文件的绝对路径
  137. string filePath = Path.Combine(AppContext.BaseDirectory, path);
  138. string jsonContent = string.Empty;//json内容
  139. var exists = System.IO.File.Exists(filePath);
  140. if (!exists) throw new Exception($"配置文件[{path.Split("\\")[path.Split("\\").Length - 1]}]不存在");
  141. // 读取文件的内容
  142. using (StreamReader file = File.OpenText(filePath))
  143. {
  144. jsonContent = await file.ReadToEndAsync();
  145. }
  146. // 解析JSON到JObject
  147. JObject jsonObj = JObject.Parse(jsonContent);
  148. // 反序列化
  149. //var plcModel = JsonConvert.DeserializeObject<List<PLCModel>>(jsonContent);
  150. return jsonObj;
  151. }
  152. catch (Exception ex)
  153. {
  154. _logger.LogError(ex.ToString(), ex);
  155. throw new Exception(ex.Message);
  156. }
  157. }
  158. #endregion
  159. }
  160. }
  1. /// <summary>
  2. /// 打印流程卡
  3. /// </summary>
  4. public class PrintLotInDto
  5. {
  6. /// <summary>
  7. /// 批次号
  8. /// </summary>
  9. public string LotNo { get; set; }
  10. /// <summary>
  11. /// 产品名称
  12. /// </summary>
  13. public string ProductName { get; set; }
  14. /// <summary>
  15. /// 产品编码
  16. /// </summary>
  17. public string ProductCode { get; set; }
  18. /// <summary>
  19. /// 数量
  20. /// </summary>
  21. public int Quantity { get; set; }
  22. /// <summary>
  23. /// 工单号
  24. /// </summary>
  25. public string WorkOrderNo { get; set; }
  26. / <summary>
  27. / 打印日期
  28. / </summary>
  29. //public DateTime Date { get; set; }
  30. /// <summary>
  31. /// 单位名称
  32. /// </summary>
  33. public string UnitName { get; set; }
  34. }
  35. /// <summary>
  36. /// 打印枚举
  37. /// </summary>
  38. public enum PrintEnum
  39. {
  40. QRCode = 0,//二维码
  41. BarCode = 1//条形码
  42. }

PrintLot.json文件内容

  1. {
  2. //批次号
  3. "lotNo": {
  4. "x": 430, //x坐标
  5. "y": 320, //y坐标
  6. "size": 50 //字体大小
  7. },
  8. //产品编码
  9. "productCode": {
  10. "x": 230,
  11. "y": 400,
  12. "size": 50
  13. },
  14. //产品名称
  15. "productName": {
  16. "x": 230,
  17. "y": 480,
  18. "size": 50
  19. },
  20. //数量
  21. "quantity": {
  22. "x": 230,
  23. "y": 560,
  24. "size": 50
  25. },
  26. //工单号
  27. "workOrderNo": {
  28. "x": 230,
  29. "y": 640,
  30. "size": 50
  31. },
  32. //打印日期
  33. "date": {
  34. "x": 230,
  35. "y": 720,
  36. "size": 50
  37. },
  38. //二维码
  39. "qRCode": {
  40. "x": 450,
  41. "y": 30,
  42. "size": 10 //二维码大小
  43. }
  44. }

2.2 双列打印

  1. using Imagine.Mes.MesBase.Application.CommonTool;
  2. using Imagine.Mes.MesBase.Application.Dtos;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using Volo.Abp.DependencyInjection;
  9. namespace Imagine.Mes.MesBase.Application.Services
  10. {
  11. public interface IPrintService
  12. {
  13. /// <summary>
  14. /// 打印库位信息
  15. /// </summary>
  16. /// <param name="printType"></param>
  17. /// <param name="body"></param>
  18. /// <returns></returns>
  19. Task PrintWarehouselocationsAsync(PrintTypeEnum printType, List<WarehouseLocationNoParam> body);
  20. }
  21. public class PrintService : IPrintService, ITransientDependency
  22. {
  23. private readonly ILogger<PrintService> _logger;
  24. public PrintService(
  25. ILogger<PrintService> logger
  26. )
  27. {
  28. _logger = logger;
  29. }
  30. public async Task PrintWarehouselocationsAsync(PrintTypeEnum printType, List<WarehouseLocationNoParam> body)
  31. {
  32. try
  33. {
  34. List<PrintWarehouseLocationParam> printQualityInspectionList = new List<PrintWarehouseLocationParam>();
  35. for (int i = 0; i < body.Count; i += 2)
  36. {
  37. PrintWarehouseLocationParam printQualityInspection = new PrintWarehouseLocationParam();
  38. printQualityInspection.QRCodeContent = body[i].QRCodeContent;
  39. printQualityInspection.WarehouseLocationName = body[i].WarehouseLocationName;
  40. printQualityInspection.WarehouseLocationNo = body[i].WarehouseLocationNo;
  41. printQualityInspection.QRCodeContent2 = i + 1 < body.Count ? body[i + 1].QRCodeContent : null;
  42. printQualityInspection.WarehouseLocationName2 = i + 1 < body.Count ? body[i + 1].WarehouseLocationName : null;
  43. printQualityInspection.WarehouseLocationNo2 = i + 1 < body.Count ? body[i + 1].WarehouseLocationNo : null;
  44. printQualityInspectionList.Add(printQualityInspection);
  45. await PrintWarehouselocationAsync(printType, new PrintWarehouseLocationParam
  46. {
  47. QRCodeContent = printQualityInspection.QRCodeContent,
  48. WarehouseLocationName = printQualityInspection.WarehouseLocationName,
  49. WarehouseLocationNo = printQualityInspection.WarehouseLocationNo,
  50. QRCodeContent2 = printQualityInspection.QRCodeContent2,
  51. WarehouseLocationName2 = printQualityInspection.WarehouseLocationName2,
  52. WarehouseLocationNo2 = printQualityInspection.WarehouseLocationNo2
  53. });
  54. }
  55. }
  56. catch (Exception ex)
  57. {
  58. _logger.LogError($"打印质检单/入库单错误:{ex}");
  59. }
  60. }
  61. /// <summary>
  62. /// 打印出库单/入库单
  63. /// </summary>
  64. /// <param name="printType">打印类型:0-二维码;1-条形码</param>
  65. /// <param name="param"></param>
  66. /// <returns></returns>
  67. private async Task PrintWarehouselocationAsync(PrintTypeEnum printType, PrintWarehouseLocationParam param)
  68. {
  69. #region 模板
  70. string port = "999";
  71. string currentEncoding = "utf-16";
  72. string chineseFont = "宋体";
  73. byte[] warehouseLocationNo = null;
  74. byte[] warehouseLocationName = null;
  75. byte[] warehouseLocationNo2 = null;
  76. byte[] warehouseLocationName2 = null;
  77. warehouseLocationNo = Encoding.GetEncoding(currentEncoding).GetBytes($"{param.WarehouseLocationNo}");
  78. warehouseLocationName = Encoding.GetEncoding(currentEncoding).GetBytes($"{param.WarehouseLocationName}");
  79. warehouseLocationNo2 = Encoding.GetEncoding(currentEncoding).GetBytes($"{param.WarehouseLocationNo2}");
  80. warehouseLocationName2 = Encoding.GetEncoding(currentEncoding).GetBytes($"{param.WarehouseLocationName2}");
  81. byte status = TSCLIB_DLL.usbportqueryprinter();//0 = idle, 1 = head open, 16 = pause, following <ESC>!? command of TSPL manual
  82. //打印机共享名999
  83. int openport = TSCLIB_DLL.openport(@$"{port}");
  84. //M 纸张宽度 ,N 纸张高度
  85. TSCLIB_DLL.sendcommand("SIZE 100 mm, 30 mm");
  86. TSCLIB_DLL.sendcommand("SPEED 2");
  87. TSCLIB_DLL.sendcommand("DENSITY 15");
  88. TSCLIB_DLL.sendcommand("DIRECTION 1");
  89. TSCLIB_DLL.sendcommand("SET TEAR ON");
  90. TSCLIB_DLL.sendcommand("CODEPAGE UTF-8");
  91. TSCLIB_DLL.clearbuffer();
  92. if (printType == PrintTypeEnum.QRCode)//打印二维码
  93. {
  94. TSCLIB_DLL.windowsfontUnicode(150, 20, 26, 0, 0, 0, chineseFont, warehouseLocationName);
  95. TSCLIB_DLL.sendcommand($"QRCODE 180,55,H,5,A,0,M2,\"{param.QRCodeContent}\"");
  96. TSCLIB_DLL.windowsfontUnicode(150, 180, 26, 0, 0, 0, chineseFont, warehouseLocationNo);
  97. if (!string.IsNullOrWhiteSpace(param.QRCodeContent2))
  98. {
  99. TSCLIB_DLL.windowsfontUnicode(550, 20, 26, 0, 0, 0, chineseFont, warehouseLocationName2);
  100. TSCLIB_DLL.sendcommand($"QRCODE 580,55,H,5,A,0,M2,\"{param.QRCodeContent2}\"");
  101. TSCLIB_DLL.windowsfontUnicode(550, 180, 26, 0, 0, 0, chineseFont, warehouseLocationNo2);
  102. }
  103. }
  104. else// 打印条码.
  105. {
  106. // 在 (450, 200) 的坐标上
  107. // 以 Code128 的条码方式
  108. // 条码高度 300
  109. // 打印条码的同时,还打印条码的文本信息.
  110. // 旋转的角度为 0 度
  111. // 条码 宽 窄 比例因子为 7:7
  112. // 条码内容为:barCode
  113. //BARCODE X,Y,”code type”,height,human readable,rotation,narrow,wide,[alignment,]”content“
  114. TSCLIB_DLL.barcode("300", "340", "128", "180", "1", "0", "6", "6", $"{param.QRCodeContent2}");
  115. }
  116. //TSCLIB_DLL.sendcommand(String.Format("QRCODE 740,320,H,8,A,0,M2,\"{0}\"", trayCode));
  117. //DMATRIX码 。DMATRIX 命令,740,320,90,90 指定 X 坐标,指定 Y 坐标,条码区域宽度
  118. //TSCLIB_DLL.sendcommand($"DMATRIX 740,320,90,90,x18,30,30,\"{trayCode}\"");
  119. int printlabel = TSCLIB_DLL.printlabel("1", "1");
  120. TSCLIB_DLL.closeport();
  121. #endregion
  122. await Task.CompletedTask;
  123. }
  124. }
  125. /// <summary>
  126. /// 打印枚举
  127. /// </summary>
  128. public enum PrintTypeEnum
  129. {
  130. QRCode = 0,//二维码
  131. BarCode = 1//条形码
  132. }
  133. }

  1. /// <summary>
  2. /// 库位码打印参数
  3. /// </summary>
  4. public class WarehouseLocationNoParam
  5. {
  6. /// <summary>
  7. /// 二维码内容
  8. /// </summary>
  9. public string QRCodeContent { get; set; }
  10. /// <summary>
  11. /// 库位名称
  12. /// </summary>
  13. public string WarehouseLocationName { get; set; }
  14. /// <summary>
  15. /// 库位编码
  16. /// </summary>
  17. public string WarehouseLocationNo { get; set; }
  18. }
  1. /// <summary>
  2. /// 库位码打印参数
  3. /// </summary>
  4. public class PrintWarehouseLocationParam
  5. {
  6. /// <summary>
  7. /// 二维码内容
  8. /// </summary>
  9. public string QRCodeContent { get; set; }
  10. /// <summary>
  11. /// 库位名称
  12. /// </summary>
  13. public string WarehouseLocationName { get; set; }
  14. /// <summary>
  15. /// 库位编码
  16. /// </summary>
  17. public string WarehouseLocationNo { get; set; }
  18. /// <summary>
  19. /// 二维码内容2
  20. /// </summary>
  21. public string QRCodeContent2 { get; set; }
  22. /// <summary>
  23. /// 库位名称2
  24. /// </summary>
  25. public string WarehouseLocationName2 { get; set; }
  26. /// <summary>
  27. /// 库位编码2
  28. /// </summary>
  29. public string WarehouseLocationNo2 { get; set; }
  30. }

2.3 用到的公共类

  1. using System.Runtime.InteropServices;
  2. namespace Imagine.Mes.MesBase.Application.CommonTool
  3. {
  4. public class TSCLIB_DLL
  5. {
  6. [DllImport("TSCLIB.dll", EntryPoint = "about")]
  7. public static extern int about();
  8. [DllImport("TSCLIB.dll", EntryPoint = "openport")]
  9. public static extern int openport(string printername);
  10. [DllImport("TSCLIB.dll", EntryPoint = "barcode")]
  11. public static extern int barcode(string x, string y, string type,
  12. string height, string readable, string rotation,
  13. string narrow, string wide, string code);
  14. [DllImport("TSCLIB.dll", EntryPoint = "clearbuffer")]
  15. public static extern int clearbuffer();
  16. [DllImport("TSCLIB.dll", EntryPoint = "closeport")]
  17. public static extern int closeport();
  18. [DllImport("TSCLIB.dll", EntryPoint = "downloadpcx")]
  19. public static extern int downloadpcx(string filename, string image_name);
  20. [DllImport("TSCLIB.dll", EntryPoint = "formfeed")]
  21. public static extern int formfeed();
  22. [DllImport("TSCLIB.dll", EntryPoint = "nobackfeed")]
  23. public static extern int nobackfeed();
  24. [DllImport("TSCLIB.dll", EntryPoint = "printerfont")]
  25. public static extern int printerfont(string x, string y, string fonttype,
  26. string rotation, string xmul, string ymul,
  27. string text);
  28. [DllImport("TSCLIB.dll", EntryPoint = "printlabel")]
  29. public static extern int printlabel(string set, string copy);
  30. [DllImport("TSCLIB.dll", EntryPoint = "sendcommand")]
  31. public static extern int sendcommand(string printercommand);
  32. [DllImport("TSCLIB.dll", EntryPoint = "setup")]
  33. public static extern int setup(string width, string height,
  34. string speed, string density,
  35. string sensor, string vertical,
  36. string offset);
  37. [DllImport("TSCLIB.dll", EntryPoint = "windowsfont")]
  38. public static extern int windowsfont(int x, int y, int fontheight,
  39. int rotation, int fontstyle, int fontunderline,
  40. string szFaceName, string content);
  41. [DllImport("TSCLIB.dll", EntryPoint = "windowsfontUnicode")]
  42. public static extern int windowsfontUnicode(int x, int y, int fontheight,
  43. int rotation, int fontstyle, int fontunderline,
  44. string szFaceName, byte[] content);
  45. [DllImport("TSCLIB.dll", EntryPoint = "sendBinaryData")]
  46. public static extern int sendBinaryData(byte[] content, int length);
  47. [DllImport("TSCLIB.dll", EntryPoint = "usbportqueryprinter")]
  48. public static extern byte usbportqueryprinter();
  49. }
  50. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/876315
推荐阅读
相关标签
  

闽ICP备14008679号