|
|
|
|
using Admin.Core.Common;
|
|
|
|
|
using Admin.Core.IService;
|
|
|
|
|
using Aucma.Core.PrintTo.Common;
|
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
|
using CommunityToolkit.Mvvm.Input;
|
|
|
|
|
using CommunityToolkit.Mvvm.Messaging;
|
|
|
|
|
using FastReport;
|
|
|
|
|
using log4net;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using NPOI.HSSF.Record.Chart;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows;
|
|
|
|
|
|
|
|
|
|
namespace Aucma.Core.PrintTo.ViewModels
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* 特殊条码打印
|
|
|
|
|
*
|
|
|
|
|
* */
|
|
|
|
|
public partial class SpecialPrintToViewModel : ObservableObject
|
|
|
|
|
{
|
|
|
|
|
private static readonly log4net.ILog log = LogManager.GetLogger(typeof(SpecialPrintToViewModel));
|
|
|
|
|
private Queue<string> BarcodesUnprinted { get; } = new Queue<string>();
|
|
|
|
|
private Queue<string> BarcodesPrinted { get; } = new Queue<string>();
|
|
|
|
|
protected readonly IOrderBomInfoServices _orderBomInfoServices;
|
|
|
|
|
private PrintState printState { get; set; } = PrintState.Idle;//打印状态
|
|
|
|
|
|
|
|
|
|
protected bool isPrint { get; set; } = true;//打印打印标志
|
|
|
|
|
|
|
|
|
|
public SpecialPrintToViewModel(string barCode, int num) {
|
|
|
|
|
_orderBomInfoServices = App.ServiceProvider.GetService<IOrderBomInfoServices>();
|
|
|
|
|
State = "Green";
|
|
|
|
|
ErrorNum = 0;
|
|
|
|
|
printState = PrintState.Printing;
|
|
|
|
|
BarCode = barCode;
|
|
|
|
|
Num = num;
|
|
|
|
|
MaxProgress = num;
|
|
|
|
|
Progress = 0;
|
|
|
|
|
SuspendEnabled = "False";
|
|
|
|
|
OperateEnabled = "True";
|
|
|
|
|
// 非阻塞打印
|
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
await ExecPrintAsync(barCode, num); ;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#region 执行打印
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 执行打印
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="barCode">二维码</param>
|
|
|
|
|
/// <param name="num">打印数量</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
|
|
|
|
public Task ExecPrintAsync(string barCode,int num)
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < num; i++) { BarcodesUnprinted.Enqueue(barCode); }
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 打印
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
public void StartOperate()
|
|
|
|
|
{
|
|
|
|
|
printState= PrintState.Printing;
|
|
|
|
|
SuspendEnabled = "True";
|
|
|
|
|
OperateEnabled = "False";
|
|
|
|
|
State = "Green";
|
|
|
|
|
if (isPrint)//首次打印
|
|
|
|
|
{
|
|
|
|
|
isPrint= false;
|
|
|
|
|
// 非阻塞打印
|
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
await Print();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
public async Task<bool> Print()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
string printer = Appsettings.app("Printer", "PrinterName");
|
|
|
|
|
int printNum = BarcodesUnprinted.Count;//打印数
|
|
|
|
|
int i = 1;
|
|
|
|
|
|
|
|
|
|
while (BarcodesUnprinted.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
if (printState == PrintState.Paused)
|
|
|
|
|
{
|
|
|
|
|
SetPaused();
|
|
|
|
|
Thread.Sleep(1 * 1000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (printState == PrintState.Completetd) break;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var item = BarcodesUnprinted.Peek();
|
|
|
|
|
|
|
|
|
|
#region 打印机
|
|
|
|
|
//对接打印机
|
|
|
|
|
Report barReport = new Report();
|
|
|
|
|
barReport.Load(System.Environment.CurrentDirectory + @"\Report\MaterialBar.frx");
|
|
|
|
|
|
|
|
|
|
// 设置打印机和打印选项
|
|
|
|
|
barReport.PrintSettings.ShowDialog = false; // 是否打开打印机选择框
|
|
|
|
|
barReport.PrintSettings.Printer = printer; // 设置打印机名称
|
|
|
|
|
barReport.PrintSettings.Copies = 1; // 设置打印份数
|
|
|
|
|
//barReport.PrintSettings.PageRange = "1-3"; // 设置打印页范围
|
|
|
|
|
barReport.SetParameterValue("BoxBarData.Id", item);
|
|
|
|
|
barReport.SetParameterValue("BoxBarData.Order_No", item);//订单码
|
|
|
|
|
barReport.SetParameterValue("BoxBarData.Order_Material_Name", item);//物料名称
|
|
|
|
|
barReport.SetParameterValue("BoxBarData.Bar_Code", item);//二维码
|
|
|
|
|
|
|
|
|
|
//barReport.Prepare();
|
|
|
|
|
//string BarPath = System.Environment.CurrentDirectory + @"\pdf\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf";
|
|
|
|
|
//barReport.Export(new PDFExport(), BarPath);
|
|
|
|
|
|
|
|
|
|
barReport.Print();
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
PrintProgress = $"[{printNum}/{i}] {item}";
|
|
|
|
|
BarcodesPrinted.Enqueue(BarcodesUnprinted.Dequeue());
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
Progress = i;
|
|
|
|
|
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
log.Error($"打印出错:{ex.Message}");
|
|
|
|
|
ErrorNum++;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
isPrint = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//打印完成
|
|
|
|
|
SetCompletetd();
|
|
|
|
|
SuspendEnabled = "False";
|
|
|
|
|
OperateEnabled = "False";
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
log.Error($"打印出错:{ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
return await Task.FromResult(true);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 暂停
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
private void SuspendOperate()
|
|
|
|
|
{
|
|
|
|
|
printState = PrintState.Paused;
|
|
|
|
|
|
|
|
|
|
State = "yellow";
|
|
|
|
|
isPrint = false;
|
|
|
|
|
|
|
|
|
|
SuspendEnabled = "False";
|
|
|
|
|
OperateEnabled = "True";
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 暂停
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 暂停
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SetPaused()
|
|
|
|
|
{
|
|
|
|
|
printState = PrintState.Paused;
|
|
|
|
|
|
|
|
|
|
State = "yellow";
|
|
|
|
|
isPrint = false;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 完成
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 暂停
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void SetCompletetd()
|
|
|
|
|
{
|
|
|
|
|
printState = PrintState.Completetd;
|
|
|
|
|
|
|
|
|
|
State = "Green";
|
|
|
|
|
isPrint = false;
|
|
|
|
|
OperateEnabled = "True";
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 关闭当前界面
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 关闭当前界面
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="parameter"></param>
|
|
|
|
|
[RelayCommand]
|
|
|
|
|
public void CloseWindow(object parameter)
|
|
|
|
|
{
|
|
|
|
|
var window = parameter as Window;
|
|
|
|
|
if (window == null) return;
|
|
|
|
|
isPrint = true;
|
|
|
|
|
if (printState == PrintState.Completetd)
|
|
|
|
|
{
|
|
|
|
|
WeakReferenceMessenger.Default.Send<string>("Refresh");//刷新窗口
|
|
|
|
|
window.Close();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (MessageBox.Show("确定要退出打印吗?", "系统提醒", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes)
|
|
|
|
|
{
|
|
|
|
|
printState = PrintState.Stopped;
|
|
|
|
|
WeakReferenceMessenger.Default.Send<string>("Refresh");//刷新窗口
|
|
|
|
|
window.Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 属性
|
|
|
|
|
|
|
|
|
|
#region 二维码值
|
|
|
|
|
private string _barCode;
|
|
|
|
|
|
|
|
|
|
public string BarCode { get => _barCode; set => SetProperty(ref _barCode, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 数量
|
|
|
|
|
private int _num;
|
|
|
|
|
|
|
|
|
|
public int Num { get => _num; set => SetProperty(ref _num, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 进度条最大值
|
|
|
|
|
private int _maxProgress;
|
|
|
|
|
|
|
|
|
|
public int MaxProgress { get => _maxProgress; set => SetProperty(ref _maxProgress, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 异常数量
|
|
|
|
|
private int _errorNum;
|
|
|
|
|
public int ErrorNum { get => _errorNum; set => SetProperty(ref _errorNum, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 打印进度
|
|
|
|
|
private string _printProgress;
|
|
|
|
|
|
|
|
|
|
public string PrintProgress {
|
|
|
|
|
get => _printProgress;
|
|
|
|
|
set => SetProperty(ref _printProgress, value);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 打印状态
|
|
|
|
|
private string _state;
|
|
|
|
|
|
|
|
|
|
public string State { get => _state; set => SetProperty(ref _state, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 进度条进度
|
|
|
|
|
private int _progress;
|
|
|
|
|
|
|
|
|
|
public int Progress { get => _progress; set => SetProperty(ref _progress, value); }
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 操作打印按钮状态
|
|
|
|
|
private string _operateEnabled;
|
|
|
|
|
public string OperateEnabled
|
|
|
|
|
{
|
|
|
|
|
get => _operateEnabled;
|
|
|
|
|
set => SetProperty(ref _operateEnabled, value);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 操作暂停按钮状态
|
|
|
|
|
private string _suspendEnabled;
|
|
|
|
|
public string SuspendEnabled
|
|
|
|
|
{
|
|
|
|
|
get => _suspendEnabled;
|
|
|
|
|
set => SetProperty(ref _suspendEnabled, value);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|