You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
13 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using HighWayIot.Repository.domain;
using HighWayIot.Repository.service;
using Models;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Threading.Timer;
namespace HighWayIot.Winform.Business
{
/// <summary>
/// 定时报表导出
/// </summary>
public class TimerExportBusiness
{
private Timer RecordTimer;
private string _savePath = string.Empty;
/// <summary>
/// 处理前的报表数据
/// </summary>
private List<ZxDailyReportEntity> _zxDailyReportEntities;
/// <summary>
/// 导出的报表
/// </summary>
private List<ExportTableEntity> _exportTableEntities = new List<ExportTableEntity>();
private DataTable dataTable;
public TimerExportBusiness()
{
RecordTimer = new Timer(ExportJudge, null, 0, 1000);
}
/// <summary>
/// 判断是否该导出了
/// </summary>
/// <param name="o"></param>
private void ExportJudge(object o)
{
DateTime now = DateTime.Now;
var timeList = SysShiftTimeService.Instance.GetShiftInfos();
var morningShift = timeList.Where(x => x.ShiftName == "早").FirstOrDefault();
var startArray = morningShift.ShiftStartTime.Split(':');
if(startArray.Length != 3)
{
return;
}
if (now.Hour == Convert.ToInt32(startArray[0])
&& now.Minute == Convert.ToInt32(startArray[1])
&& now.Second == Convert.ToInt32(startArray[3]))
{
AutoExport();
ZxDailyReportService.Instance.DeleteMoreData();
}
}
private void AutoExport()
{
_savePath = XmlUtil.Instance.ExportPathReader();
//获取前一天的报表
_zxDailyReportEntities = ZxDailyReportService.Instance.GetOneDayDailyReportInfos();
//查询所有称重信息
List<ZxWeightEntity> _zxWeightEntities = ZxWeightService.Instance.GetWeightInfos();
//查询所有配方信息
List<ZxRecipeEntity> _zxRecipeEntities = ZxRecipeService.Instance.GetRecipeInfos();
//开始关联 生成报表
foreach (ZxDailyReportEntity rawEntity in _zxDailyReportEntities)
{
ExportTableEntity exportTableEntity = new ExportTableEntity();
ZxRecipeEntity recipeEntity = _zxRecipeEntities.Where(x => x.RecipeCode == rawEntity.RecipeCode).FirstOrDefault();
ZxWeightEntity baseWeight = _zxWeightEntities.Where(x => x.RecipeCode == rawEntity.RecipeCode && x.MaterialType == "基部胶").FirstOrDefault();
ZxWeightEntity midWeight = _zxWeightEntities.Where(x => x.RecipeCode == rawEntity.RecipeCode && x.MaterialType == "中层胶").FirstOrDefault();
ZxWeightEntity faceWeight = _zxWeightEntities.Where(x => x.RecipeCode == rawEntity.RecipeCode && x.MaterialType == "胎面胶").FirstOrDefault();
if (recipeEntity == null)
{
continue;
}
exportTableEntity.RecipeCode = rawEntity.RecipeCode;
exportTableEntity.RecipeName = rawEntity.RecipeName;
exportTableEntity.SpecCode = rawEntity.SpecCode;
exportTableEntity.SpecName = recipeEntity.RecipeSpecName;
exportTableEntity.StartTime = rawEntity.StartTime.ToString("yyyy-MM-dd hh:mm:ss");
//基部胶
if (baseWeight != null)
{
exportTableEntity.BaseRubName = baseWeight.MaterialName;
exportTableEntity.BaseRubThickness = baseWeight.SetThickness.ToString();
//基部胶宽度和层数(可能有三层
if (baseWeight.SetLayer2 == 0 || baseWeight.SetLayer2 == null)
{
exportTableEntity.BaseRubWidth = baseWeight.SetWidth.ToString();
exportTableEntity.BaseRubLayer = baseWeight.SetLayer.ToString();
}
else if (baseWeight.SetLayer3 == 0 || baseWeight.SetLayer3 == null)
{
exportTableEntity.BaseRubWidth = $"{baseWeight.SetWidth2}/{baseWeight.SetWidth}";
exportTableEntity.BaseRubLayer = $"{baseWeight.SetLayer2}/{baseWeight.SetLayer}";
}
else
{
exportTableEntity.BaseRubWidth = $"{baseWeight.SetWidth2}/{baseWeight.SetWidth3}/{baseWeight.SetWidth}";
exportTableEntity.BaseRubLayer = $"{baseWeight.SetLayer2}/{baseWeight.SetLayer3}/{baseWeight.SetLayer}";
}
exportTableEntity.BaseRubFinishTime = GeneralUtils.DateTimeToString(rawEntity.StartTime, rawEntity.BaseEndTime);
}
//中层胶
if (midWeight != null)
{
exportTableEntity.MidRubName = midWeight.MaterialName;
exportTableEntity.MidRubThickness = midWeight.SetThickness.ToString();
//中层胶宽度和层数(可能有三层
if (midWeight.SetLayer2 == 0 || midWeight.SetLayer2 == null)
{
exportTableEntity.MidRubWidth = midWeight.SetWidth.ToString();
exportTableEntity.MidRubLayer = midWeight.SetLayer.ToString();
}
else if (midWeight.SetLayer3 == 0 || midWeight.SetLayer3 == null)
{
exportTableEntity.MidRubWidth = $"{midWeight.SetWidth2}/{midWeight.SetWidth}";
exportTableEntity.MidRubLayer = $"{midWeight.SetLayer2}/{midWeight.SetLayer}";
}
else
{
exportTableEntity.MidRubWidth = $"{midWeight.SetWidth2}/{midWeight.SetWidth3}/{midWeight.SetWidth}";
exportTableEntity.MidRubLayer = $"{midWeight.SetLayer2}/{midWeight.SetLayer3}/{midWeight.SetLayer}";
}
exportTableEntity.MidRubFinishTime = GeneralUtils.DateTimeToString(rawEntity.StartTime, rawEntity.MidEndTime);
}
//胎面胶
if (faceWeight != null)
{
exportTableEntity.FaceRubName = faceWeight.MaterialName;
exportTableEntity.FaceRubThickness = faceWeight.SetThickness.ToString();
//胎面胶宽度和层数(可能有三层
if (faceWeight.SetLayer2 == 0 || faceWeight.SetLayer2 == null)
{
exportTableEntity.FaceRubWidth = faceWeight.SetWidth.ToString();
exportTableEntity.FaceRubLayer = faceWeight.SetLayer.ToString();
}
else if (faceWeight.SetLayer3 == 0 || faceWeight.SetLayer3 == null)
{
exportTableEntity.FaceRubWidth = $"{faceWeight.SetWidth2}/{faceWeight.SetWidth}";
exportTableEntity.FaceRubLayer = $"{faceWeight.SetLayer2}/{faceWeight.SetLayer}";
}
else
{
exportTableEntity.FaceRubWidth = $"{faceWeight.SetWidth2}/{faceWeight.SetWidth3}/{faceWeight.SetWidth}";
exportTableEntity.FaceRubLayer = $"{faceWeight.SetLayer2}/{faceWeight.SetLayer3}/{faceWeight.SetLayer}";
}
exportTableEntity.FaceRubFinishTime = GeneralUtils.DateTimeToString(rawEntity.StartTime, rawEntity.FaceEndTime);
}
exportTableEntity.RawTireWidth = (faceWeight.SetThickness * 2 + faceWeight.SetWidth).ToString();
exportTableEntity.StandardWeight = rawEntity.StandardWeight.ToString();
exportTableEntity.RawTireWeight = (rawEntity.RawTireWeight ?? 0).ToString();
exportTableEntity.RepeatWeight = (rawEntity.RepeatWeight ?? 0).ToString();
exportTableEntity.IsDone = rawEntity.IsDone == 1 ? "已完成" : "未完成";
_exportTableEntities.Add(exportTableEntity);
}
try
{
dataTable = ToDataTable(_exportTableEntities.ToArray());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
ExportExcel(dataTable, _savePath);
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="dt"></param>
public void ExportExcel(DataTable dt, string path)
{
try
{
//创建一个工作簿
IWorkbook workbook = new HSSFWorkbook();
//创建一个 sheet 表
ISheet sheet = workbook.CreateSheet(dt.TableName);
//创建一行
IRow rowH = sheet.CreateRow(0);
//创建一个单元格
ICell cell = null;
//创建单元格样式
ICellStyle cellStyle = workbook.CreateCellStyle();
//创建格式
IDataFormat dataFormat = workbook.CreateDataFormat();
//设置为文本格式,也可以为 text即 dataFormat.GetFormat("text");
cellStyle.DataFormat = dataFormat.GetFormat("@");
//设置列名
foreach (DataColumn col in dt.Columns)
{
//创建单元格并设置单元格内容
rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption);
//设置单元格格式
rowH.Cells[col.Ordinal].CellStyle = cellStyle;
}
//写入数据
for (int i = 0; i < dt.Rows.Count; i++)
{
//跳过第一行,第一行为列名
IRow row = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
cell = row.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
cell.CellStyle = cellStyle;
}
}
//设置导出文件路径
//string path = HttpContext.Current.Server.MapPath("Export/");
//设置新建文件路径及名称
string savePath = $"{path}/自动导出-203报表{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.xls";
//创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew, FileAccess.Write);
//创建一个 IO 流
MemoryStream ms = new MemoryStream();
//写入到流
workbook.Write(ms);
//转换为字节数组
byte[] bytes = ms.ToArray();
file.Write(bytes, 0, bytes.Length);
file.Flush();
//还可以调用下面的方法,把流输出到浏览器下载
//OutputClient(bytes);
//释放资源
bytes = null;
ms.Close();
ms.Dispose();
file.Close();
file.Dispose();
workbook.Close();
sheet = null;
workbook = null;
MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 实体类转dt
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entities"></param>
/// <returns></returns>
public DataTable ToDataTable<T>(T[] entities)
{
DataTable dataTable = new DataTable(typeof(T).Name);
PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo propInfo in properties)
{
// Get the Description attribute if it exists
var descriptionAttribute = propInfo.GetCustomAttribute<DescriptionAttribute>();
string columnName = descriptionAttribute != null ? descriptionAttribute.Description : propInfo.Name;
dataTable.Columns.Add(columnName, propInfo.PropertyType);
}
foreach (T entity in entities)
{
object[] values = new object[properties.Length];
for (int i = 0; i < properties.Length; i++)
{
values[i] = properties[i].GetValue(entity);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
}
}