Преглед изворни кода

!1120 扩展打印模板支持浏览器打印和客户端打印
Merge pull request !1120 from Mr先生/next

zuohuaijun пре 1 година
родитељ
комит
cb6957f600

+ 22 - 1
Admin.NET/Admin.NET.Core/Entity/SysPrint.cs

@@ -1,9 +1,10 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
 //
 // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
+
 namespace Admin.NET.Core;
 
 /// <summary>
@@ -28,6 +29,26 @@ public partial class SysPrint : EntityTenant
     [Required]
     public virtual string Template { get; set; }
 
+    /// <summary>
+    /// 打印类型
+    /// </summary>
+    [SugarColumn(ColumnDescription = "打印类型")]
+    [Required]
+    public virtual PrintTypeEnum? PrintType { get; set; }
+
+    /// <summary>
+    /// 客户端服务地址
+    /// </summary>
+    [SugarColumn(ColumnDescription = "客户端服务地址", Length = 128)]
+    [MaxLength(128)]
+    public virtual string? ClientServiceAddress { get; set; }
+
+    /// <summary>
+    /// 打印参数
+    /// </summary>
+    [SugarColumn(ColumnDescription = "打印参数", ColumnDataType = "text")]
+    public virtual string? PrintParam { get; set; }
+
     /// <summary>
     /// 排序
     /// </summary>

+ 25 - 0
Admin.NET/Admin.NET.Core/Enum/PrintTypeEnum.cs

@@ -0,0 +1,25 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+
+namespace Admin.NET.Core;
+/// <summary>
+/// 打印类型枚举
+/// </summary>
+[Description("打印类型枚举")]
+public enum PrintTypeEnum
+{
+    /// <summary>
+    /// 浏览器打印
+    /// </summary>
+    [Description("浏览器打印")]
+    Browser = 1,
+    /// <summary>
+    /// 浏览器打印
+    /// </summary>
+    [Description("客户端打印")]
+    Client = 2,
+}

+ 20 - 0
Web/src/views/system/print/component/editPrint.vue

@@ -34,6 +34,7 @@
 							<el-input v-model="state.ruleForm.name" placeholder="模板名称" clearable />
 						</el-form-item>
 					</el-col>
+
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="排序">
 							<el-input-number v-model="state.ruleForm.orderNo" placeholder="排序" class="w100" />
@@ -47,6 +48,24 @@
 							</el-radio-group>
 						</el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="打印类型">
+							<el-radio-group v-model="state.ruleForm.printType">
+								<el-radio :value="1">浏览器打印</el-radio>
+								<el-radio :value="2">客户端打印</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="客户端服务地址"  >
+							<el-input v-model="state.ruleForm.clientServiceAddress" placeholder="客户端服务地址" clearable />
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="打印参数">
+							<el-input v-model="state.ruleForm.printParam" placeholder="请输入打印参数" clearable type="textarea" />
+						</el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
 						<el-form-item label="备注">
 							<el-input v-model="state.ruleForm.remark" placeholder="请输入备注内容" clearable type="textarea" />
@@ -116,6 +135,7 @@ const submit = async () => {
 	state.showDialog2 = true;
 	if (state.ruleForm.orderNo == undefined) state.ruleForm.orderNo = 100;
 	if (state.ruleForm.status == undefined) state.ruleForm.status = 1;
+	if (state.ruleForm.printType == undefined) state.ruleForm.printType = 1;
 };
 
 // 模板设置取消

+ 50 - 9
Web/src/views/system/print/component/hiprint/preview.vue

@@ -17,16 +17,27 @@ const state = reactive({
 	waitShowPrinter: false,
 	width: 0, // 纸张宽 mm
 	printData: {}, // 打印数据
+	printType:1,//默认浏览器打印
+	printParam:{
+		printer:'',//打印机名称
+		title:'',//打印任务名称
+		color:false,// 是否打印颜色 默认 true
+		copies:1,//打印份数 默认 1
+	},
+	//打印参数
 	hiprintTemplate: {} as any,
 });
 
 const previewContentRef = ref();
 
-const showDialog = (hiprintTemplate: any, printData: {}, width = 210) => {
+const showDialog = (hiprintTemplate: any, printData: {}, width = 210,printType=1,printParam:{printer:'',title:'',color:false,copies:1}) => {
+
 	state.dialogVisible = true;
 	state.width = width;
 	state.hiprintTemplate = hiprintTemplate;
 	state.printData = printData;
+	state.printParam = printParam;
+	state.printType=printType;
 	nextTick(() => {
 		while (previewContentRef.value?.firstChild) {
 			previewContentRef.value.removeChild(previewContentRef.value.firstChild);
@@ -38,15 +49,45 @@ const showDialog = (hiprintTemplate: any, printData: {}, width = 210) => {
 
 const print = () => {
 	state.waitShowPrinter = true;
-	state.hiprintTemplate.print(
-		state.printData,
-		{},
-		{
-			callback: () => {
-				state.waitShowPrinter = false;
-			},
+	debugger
+	// 判断是否已成功连接
+	if (state.printType==2) {
+		// 注意:连接是异步的
+		// 已连接
+		// 获取打印机列表
+		const printerList = state.hiprintTemplate.getPrinterList();
+
+		let sfcz= printerList.some((item)=>{
+			return item.name==state.printParam.printer;
+		})
+		if(!sfcz){
+			alert('打印机不存在');
+		}else{
+			// 直接打印 将使用系统设置的 默认打印机
+			state.hiprintTemplate.print2(state.printData,state.printParam);
+
+			// 发送任务到打印机成功
+			state.hiprintTemplate.on('printSuccess', function (e) {
+				state.waitShowPrinter=false;
+			})
+			// 发送任务到打印机失败
+			state.hiprintTemplate.on('printError', function (e) {
+				state.waitShowPrinter=false;
+				alert('打印失败:'+e);
+			})
 		}
-	);
+		
+	} else {
+		state.hiprintTemplate.print(
+			state.printData,
+			{},
+			{
+				callback: () => {
+					state.waitShowPrinter = false;
+				},
+			}
+		);
+	}
 };
 
 const toPdf = () => {