using Aspose.Cells; using Newtonsoft.Json; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using WIP_BLL; using WIP_DAL; using WIP_Models; using WIP_common; using System.Reflection; namespace WIP_Print { public class PrintMgr { public XSSFWorkbook workbook; public string strPrintType = "";//打印类型值 public string namespaceName = "WIP_Print.PrintMgr"; private readonly string wipSource = WipSource.PrintService; public PrintMgr(PrintType printType) { this.strPrintType = Convert.ToInt32(printType).ToString(); } /// /// 将要打印的实体对象转为Cell集合对象的JSON字符串 /// /// 要打印的实体对象 /// 模板名称 /// Cell集合对象的JSON字符串 public virtual string GetJsonDataAsExcelCellModel(string printJson, string tempFileName) { return ""; } /// /// 转模板文件为JSON数据 /// /// public string TempleteFileToJSON() { List dataList = ExcelUtil.GetCellListByTemplateFile(workbook); string json_templete_dataList = JsonConvert.SerializeObject(dataList); //记录模板的JSON数据 if (!ExcelUtil.printTypeDict.ContainsKey(strPrintType)) { ExcelUtil.printTypeDict.Add(strPrintType, json_templete_dataList); } return json_templete_dataList; } /// /// 获取要打印模块的XSSFWorkbook /// /// 模板名称 /// public XSSFWorkbook CreateWorkbook(string tempFileName) { string filePath = System.Threading.Thread.GetDomain().BaseDirectory + "\\"; string filePostfix = ".xlsx"; using (FileStream fs = new FileStream(filePath + @"PrintTemplete\" + tempFileName + filePostfix, FileMode.Open, FileAccess.Read)) { workbook = new XSSFWorkbook(fs); fs.Close(); } return workbook; } /// /// 初始化模板的JSON数据 /// /// /// public string InitTempleteFileJsonData(string tempFileName) { this.workbook = this.CreateWorkbook(tempFileName); string json_dataList = ""; //判断是否已经有了模板的JSON数据 if (ExcelUtil.printTypeDict.ContainsKey(strPrintType)) { json_dataList = ExcelUtil.printTypeDict[strPrintType]; } else { json_dataList = this.TempleteFileToJSON(); } return json_dataList; } /// /// 打印操作 /// /// /// /// public void Print(string json_cellList, PrintInfo printInfo, PageOrientationType orientation) { IDictionary logDict = new Dictionary(); logDict.Add("json_cellList", json_cellList); logDict.Add("printInfo", printInfo); logDict.Add("orientation", orientation); UdtWip_ExceptionInfo exception = WipLogHelper.GetNewExceptionInfo>(namespaceName, "Print", logDict , "", printInfo == null ? "" : printInfo.processCardNumber, ExceptionSource.WIPPost, ExceptionLevel.BusinessError, wipSource); try { //创建文件 List sheetModelList = new List(); List cellModelList = JsonConvert.DeserializeObject>(json_cellList); ExcelSheetModel sheetModel = new ExcelSheetModel() { sheetName = this.workbook.GetSheetAt(0).SheetName, dataList = cellModelList, sheetType = "", }; sheetModelList.Add(sheetModel); byte[] bytes = ExcelUtil.writeExcelToFile(this.workbook, sheetModelList, printInfo.tempName); //修改为“打印中” var result = UpdatePrintStatusToPrinting(printInfo.id); if (!result) throw new Exception("更新状态为打印中失败,printInfo.id:" + printInfo.id.ToString()); PrintHelper.PrintExcel(bytes, printInfo.printerName, orientation); //打印成功 this.DoByPrintResultSuccess(printInfo); } catch (Exception ex) { WipLogHelper.GetExceptionInfoForError(ex, ref exception); WipLogHelper.WriteExceptionInfo(exception); //打印失败 this.DoByPrintResultFailure(printInfo, ex); } } /// /// 替换打印的占位符 /// /// 要取值的实体对象 /// 要取值的实体对象值 /// /// public string Replace(T obj, string json_dataList) { PropertyInfo[] properArray = typeof(T).GetProperties(); Object value = null; string str = ""; foreach (var proper in properArray) { if (proper.GetCustomAttribute(typeof(PrintAttribute), false) != null) { value = proper.GetValue(obj, null); if (value == null) value = ""; if (proper.PropertyType == typeof(string)) { str = WIPCommon.NullToEmpty(value.ToString()); } else if (proper.PropertyType == typeof(int?) || proper.PropertyType == typeof(int)) { str = WIPCommon.NullToEmpty(value == null ? "" : value.ToString()); } else if (proper.PropertyType == typeof(DateTime) || proper.PropertyType == typeof(DateTime?)) { str = WIPCommon.FormatDateTime((DateTime?)value); } //替换 json_dataList = json_dataList.Replace("[" + proper.Name + "]", str); } } return json_dataList; } #region 私有方法 /// /// 打印成功的操作 /// /// private void DoByPrintResultSuccess(PrintInfo printInfo) { if (printInfo.delFlag == false) { DoByPrintResult(true, printInfo); } else {//只打印 var processCardPrintQueueId = ProcessCardPrintQueueBLL.GetInstance().GetProcessCardPrintQueueId(printInfo); if (processCardPrintQueueId > 0) { ProcessCardPrintQueueDAL.GetInstance().UpdateProcessCardPrintQueuePrintCount(processCardPrintQueueId); } } } /// /// 打印失败的操作 /// /// /// private void DoByPrintResultFailure(PrintInfo printInfo, Exception ex) { if (printInfo.delFlag == false) { DoByPrintResult(false, printInfo, ex.Message); } } /// /// 更新状态为“打印中” /// /// /// private bool UpdatePrintStatusToPrinting(int printId) { var nowTime = DateTime.Now; List list = new List() { new PropertyParam(){ PropertyName="lastModifyTime",ObjectValue=nowTime,dbType=SqlDbType.DateTime}, new PropertyParam() { PropertyName = "printFlag", ObjectValue = Convert.ToInt32(PrintStatus.Printing).ToString(), dbType = SqlDbType.NVarChar, size = 10 } }; list.Add(new PropertyParam() { IsWhereFilter = true, PropertyName = "id", ObjectValue = printId, dbType = SqlDbType.Int }); var result = DALCommon.UpdateExtend(list, Table.PrintInfo); return result; } /// /// 打印结果处理 /// /// 打印结果 /// 打印信息 /// 错误信息 /// private bool DoByPrintResult(bool printResult, PrintInfo printInfo, string errMsg = "") { var retResult = false;//返回结果 IDictionary logDict = new Dictionary(); logDict.Add("printResult", printResult); logDict.Add("printInfo", printInfo); UdtWip_ExceptionInfo exception = WipLogHelper.GetNewExceptionInfo>(namespaceName, "DoByPrintResult", logDict , "", printInfo == null ? "" : printInfo.processCardNumber, ExceptionSource.WIPPost, ExceptionLevel.BusinessError, wipSource); try { #region 准备数据 SqlParameter[] parameters_UpdatePrintResult = this.GetSqlParamForUpdatePrintResult(printResult, printInfo, errMsg); //是否是后道缓冲区或者抛丸区,正在待打印队列里打印成功操作 var isPrintProcessCardSuccessByWaitPrintQueue = ValidateIsPrintProcessCardSuccessByWaitPrintQueue(printResult, printInfo); #endregion #region 事务处理 using (SqlConnection conn = new SqlConnection(DbHelperSQL.connectionString)) { conn.Open(); using (SqlTransaction trans = conn.BeginTransaction()) { TransactionModel transModel = new TransactionModel() { conn = conn, trans = trans }; try { var execResult = PrintInfoDAL.GetInstance().UpdatePrintResult(parameters_UpdatePrintResult, transModel); if (execResult != 1) {//返回1代表执行成功,返回-1代表失败 throw new Exception("处理打印结果失败,parameters:" + JsonConvert.SerializeObject(parameters_UpdatePrintResult) + ",execResult:" + execResult.ToString()); } if (isPrintProcessCardSuccessByWaitPrintQueue) {//执行成功,更新 流转卡队列的打印状态=下料中。 var result = ProcessCardPrintQueueDAL.GetInstance().UpdateProcessCardPrintQueueStatus(printInfo.processCardNumber, PrintStatus.Blanking, "下料中", false, transModel); if (!result) { throw new Exception("更新 流转卡队列的打印状态=下料中 失败,processCardNumber:" + printInfo.processCardNumber); } } trans.Commit(); retResult = true; } catch { retResult = false; trans.Rollback(); throw; } } } #endregion #region 打印成功,如果满足条件,要通知WCS料道滚动,下料 this.BufferLayingOffToWCSWithRetry(retResult, isPrintProcessCardSuccessByWaitPrintQueue, printInfo); #endregion } catch (Exception ex) { retResult = false; WipLogHelper.GetExceptionInfoForError(ex, ref exception); WipLogHelper.WriteExceptionInfo(exception); } return retResult; } /// /// 验证是否是后道缓冲区或者抛丸区,正在待打印队列里打印成功操作 /// 这里的操作打印成功后需要更新打印状态为下料中,同时要通知立库下料 /// /// 打印结果 /// 打印信息 /// private bool ValidateIsPrintProcessCardSuccessByWaitPrintQueue(bool printResult, PrintInfo printInfo) { if (printResult && printInfo.delFlag == false && (printInfo.printType == Convert.ToInt32(PrintType.ProcessCardForBuffer).ToString() || printInfo.printType == Convert.ToInt32(PrintType.ProcessCardForPostHeatStorageOut).ToString())) { return true; } return false; } /// /// 打印成功,要通知WCS料道滚动,下料 /// /// 事务执行结果 /// 是否是后道缓冲区或者抛丸区,正在待打印队列里打印成功操作 private void BufferLayingOffToWCSWithRetry(bool retResult, bool isPrintProcessCardSuccessByWaitPrintQueue, PrintInfo printInfo) { if (retResult && isPrintProcessCardSuccessByWaitPrintQueue) { BufferLayingOffParam bufferLayingOffParam = new BufferLayingOffParam() { sysCode = SysCode.WIP, equipId = printInfo.printArea, processCardNumber = printInfo.processCardNumber, timestamp = WIPCommon.ForamtCurDateTime() }; MethodReturnResultModel ret = WCS.BufferLayingOffToWCSWithRetry(bufferLayingOffParam); if (!ret.IsSuccess) { //更新打印状态为“下料错误” var result = ProcessCardPrintQueueDAL.GetInstance().UpdateProcessCardPrintQueueStatus(printInfo.processCardNumber, PrintStatus.BlankFailure, "下料错误:" + ret.ErrMsg, false); if (!result) { throw new Exception("更新 流转卡队列的打印状态=下料中 失败,processCardNumber:" + printInfo.processCardNumber); } } } } /// /// 获取更新打印结果的sql参数 /// /// /// /// /// private SqlParameter[] GetSqlParamForUpdatePrintResult(bool printResult, PrintInfo printInfo, string errMsg) { var isPrintProcessCard = "0";//是否是打印流转卡 var isPrintSuccess = "0";//是否打印成功 var processCardPrintQueueId = 0; if (printInfo.delFlag == false && printInfo.printType == Convert.ToInt32(PrintType.ProcessCardForBuffer).ToString() || printInfo.printType == Convert.ToInt32(PrintType.ProcessCardForPostHeatStorageOut).ToString()) { isPrintProcessCard = "1"; processCardPrintQueueId = ProcessCardPrintQueueBLL.GetInstance().GetProcessCardPrintQueueId(printInfo); } if (printResult) {//打印成功 isPrintSuccess = "1"; } SqlParameter[] parameters = { new SqlParameter("@printResult",SqlDbType.VarChar,2), new SqlParameter("@printInfoId",SqlDbType.Int), new SqlParameter("@printErrMsg",SqlDbType.NVarChar,100), new SqlParameter("@isPrintProcessCard",SqlDbType.VarChar,2), new SqlParameter("@processCardPrintQueueId",SqlDbType.Int), new SqlParameter("@printTime",SqlDbType.DateTime), new SqlParameter("@processCardNumber",SqlDbType.NVarChar,50) }; parameters[0].Value = isPrintSuccess; parameters[1].Value = printInfo.id; parameters[2].Value = errMsg; parameters[3].Value = isPrintProcessCard; parameters[4].Value = processCardPrintQueueId; parameters[5].Value = DateTime.Now; parameters[6].Value = printInfo.processCardNumber; return parameters; } #endregion } }