DeviceManager/DeviceRepairAndOptimization/Pages/DriveMaintenance/xuc_DriveMaintenance.cs

683 lines
26 KiB
C#
Raw Normal View History

2024-05-28 14:36:38 +00:00
using DevExpress.Spreadsheet;
using DevExpress.XtraEditors;
using DevExpress.XtraSpreadsheet;
using DevExpress.XtraSpreadsheet.Menu;
using DeviceRepairAndOptimization.Models;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Linq;
using System.Threading.Tasks;
using DevExpress.Utils.Menu;
using DeviceRepairAndOptimization.Common;
using DeviceRepairAndOptimization.Biz;
namespace DeviceRepairAndOptimization.Pages.DriveMaintenance
{
public partial class xuc_DriveMaintenance : XtraUserControl
{
SheetDatasModel vls = new SheetDatasModel();
private const string pattern = @"^[a-zA-Z][1-9]\d*$";
/// <summary>
/// 窗体未显示到的行数
/// </summary>
int SubRowsCount = 0;
/// <summary>
/// 窗体未显示到的列数
/// </summary>
int SubColumnsCount = 0;
string TemplatePath = string.Empty;
DriveInfomationModel driveInfo;
List<Cell> EditCell;
List<Cell> CanEditCell;
List<Cell> SignatureEditCell;
List<Cell> DateEditCell;
/// <summary>
/// 照片集合
/// </summary>
public Image[] Images
{
get
{
try
{
List<Image> ls = new List<Image>();
foreach (Control item in imgs_Content.Controls)
{
if (item.GetType() == typeof(PictureEdit))
{
ls.Add(((PictureEdit)item).Image);
}
}
return ls.ToArray();
}
catch
{
return null;
}
}
}
/// <summary>
/// 上传的其他文件
/// </summary>
public string File
{
get
{
return txt_FilePath.Text;
}
}
/// <summary>
/// 获取excel的数据集
/// </summary>
public byte[] GetExcelFileBytes
{
get
{
try
{
return worksheet.Workbook.SaveDocument(DocumentFormat.Xlsx);
}
catch
{
return null;
}
}
}
public Worksheet worksheet
{
get
{
return excelControl.Document.Worksheets.ActiveWorksheet;
}
}
/// <summary>
/// 最大行下标
/// </summary>
private int LastUsedRowIndex
{
get
{
return worksheet.Rows.LastUsedIndex;
}
}
/// <summary>
/// 最大列下标
/// </summary>
private int LastUsedColumnIndex
{
get
{
return worksheet.GetUsedRange().ColumnCount - 1;
}
}
#region
/// <summary>
/// 有效数据行总高度
/// </summary>
private double _RowHeightSum = 0;
private double RowHeightSum
{
get
{
if (_RowHeightSum > 0)
return _RowHeightSum;
if (worksheet == null)
return _RowHeightSum;
for (int i = LastUsedRowIndex; i > 0; i--)
{
_RowHeightSum += worksheet.Rows[i].RowHeight * (double)ZoomValue / 100;
if (_RowHeightSum < excelControl.Height)
{
SubRowsCount++;
}
else
{
SubRowsCount = SubRowsCount * 2;
break;
}
}
return _RowHeightSum;
}
}
#endregion
#region
/// <summary>
/// 有效数据列总宽度
/// </summary>
private double _ColumnWidthSum = 0;
private double ColumnWidthSum
{
get
{
if (_ColumnWidthSum > 0)
return _ColumnWidthSum;
if (worksheet == null)
return _ColumnWidthSum;
for (int i = LastUsedColumnIndex; i > 0; i--)
{
_ColumnWidthSum += worksheet.Columns[i].ColumnWidth * (double)ZoomValue / 100;
if (_ColumnWidthSum < excelControl.Width)
{
SubColumnsCount++;
}
else
{
SubColumnsCount = SubColumnsCount * 2;
break;
}
}
return _ColumnWidthSum;
}
}
#endregion
private Cell CurrentCell;
// 创建右键菜单
SpreadsheetPopupMenu popupMenu;
SpreadsheetPopupMenu popupMenuContent;
SpreadsheetPopupMenu popupMenuUser;
SpreadsheetPopupMenu popupMenuDate;
List<ExcelContent> Datas = new List<ExcelContent>();
int ZoomValue
{
get
{
return excelControl.ActiveWorksheet.ActiveView.Zoom;
}
}
public xuc_DriveMaintenance(DriveInfomationModel entity, string templatePath)
{
InitializeComponent();
TemplatePath = templatePath;
driveInfo = entity;
}
/// <summary>
/// 程序加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void xuc_DriveMaintenance_Load(object sender, EventArgs e)
{
splashScreenManager1.ShowWaitForm();
LoadingTemplate();
//获取Windows显示的缩放比例
this.Width = (int)(ComputerHelper.WorkingArea.Width * 0.9);
this.Height = (int)(ComputerHelper.WorkingArea.Height * 0.9) - 200;
this.Left = (ComputerHelper.WorkingArea.Width - this.Width) / 2;
this.Top = (ComputerHelper.WorkingArea.Height - this.Height) / 2;
if (ComputerHelper.ScaleX > 1 || ComputerHelper.ScaleX > 1)
{
//开启横向滚动条
excelControl.Options.HorizontalScrollbar.Visibility = SpreadsheetScrollbarVisibility.Visible;
}
excelControl.MouseDown += (s, ev) =>
{
if (ev.Button == MouseButtons.Right)
{
// 获取鼠标位置对应的单元格
Cell cell = excelControl.GetCellFromPoint(new PointF(ev.X, ev.Y));
//判断是否为编辑列
if (cell != null && EditCell.IndexOf(cell) >= 0)
{
if (cell.IsMerged)
{
//获取主单元格位置
int top = (cell.GetMergedRanges()[0]).TopRowIndex;
int left = (cell.GetMergedRanges()[0]).LeftColumnIndex;
CurrentCell = worksheet.Cells[top, left];
}
else
{
CurrentCell = cell;
}
popupMenu.ShowPopup(excelControl, new Point(ev.X, ev.Y));
}
else
//判断是否为异常填写
if (CanEditCell.IndexOf(cell) >= 0)
{
if (cell.IsMerged)
{
//获取主单元格位置
int top = (cell.GetMergedRanges()[0]).TopRowIndex;
int left = (cell.GetMergedRanges()[0]).LeftColumnIndex;
CurrentCell = worksheet.Cells[top, left];
}
popupMenuContent.ShowPopup(excelControl, new Point(ev.X, ev.Y));
}
else
//保养签名
if (SignatureEditCell.IndexOf(cell) >= 0)
{
if (cell.IsMerged)
{
//获取主单元格位置
int top = (cell.GetMergedRanges()[0]).TopRowIndex;
int left = (cell.GetMergedRanges()[0]).LeftColumnIndex;
CurrentCell = worksheet.Cells[top, left];
}
else
{
CurrentCell = cell;
}
popupMenuUser.ShowPopup(excelControl, new Point(ev.X, ev.Y));
}
else
//保养日期
if (DateEditCell.IndexOf(cell) >= 0)
{
if (cell.IsMerged)
{
//获取主单元格位置
int top = (cell.GetMergedRanges()[0]).TopRowIndex;
int left = (cell.GetMergedRanges()[0]).LeftColumnIndex;
CurrentCell = worksheet.Cells[top, left];
}
else
{
CurrentCell = cell;
}
popupMenuDate.ShowPopup(excelControl, new Point(ev.X, ev.Y));
}
}
};
popupMenu = new SpreadsheetPopupMenu()
{
//正常:√ 紧固:N 给油:U 清洁:C 修理:R 调整:T 替换:H 有问题打△并写在异常处理拦,不适用或无生产打N/A
Items =
{
new DXMenuItem("正常",(a,aa)=>{CurrentCell.Value = "√"; ChangeDatas(ExcelContentType.Text,"√"); } ),
new DXMenuItem("紧固",(a,aa)=>{CurrentCell.Value = "N"; ChangeDatas(ExcelContentType.Text,"N"); } ),
new DXMenuItem("给油",(a,aa)=>{CurrentCell.Value = "U"; ChangeDatas(ExcelContentType.Text,"U"); } ),
new DXMenuItem("清洁",(a,aa)=>{CurrentCell.Value = "C"; ChangeDatas(ExcelContentType.Text,"C"); } ),
new DXMenuItem("修理",(a,aa)=>{CurrentCell.Value = "R"; ChangeDatas(ExcelContentType.Text,"R"); } ),
new DXMenuItem("调整",(a,aa)=>{CurrentCell.Value = "T"; ChangeDatas(ExcelContentType.Text,"T"); } ),
new DXMenuItem("替换",(a,aa)=>{CurrentCell.Value = "H"; ChangeDatas(ExcelContentType.Text,"H"); } ),
new DXMenuItem("有问题",(a,aa)=>{CurrentCell.Value = "△"; ChangeDatas(ExcelContentType.Text,"△"); } ),
new DXMenuItem("不适用或无生产",(a,aa)=>{CurrentCell.Value = "N/A"; ChangeDatas(ExcelContentType.Text,"N/A");} ),
new DXMenuItem("清空",(a,aa)=>{CurrentCell.Value = ""; ChangeDatas(ExcelContentType.Text,"",true);} ),
}
};
//其它异常处理
popupMenuContent = new SpreadsheetPopupMenu()
{
Items =
{
new DXMenuItem("编辑",(a,aa)=>
{
// 显示输入框
string result = XtraInputBox.Show("其它异常处理:", "输入框", "");
// 设置单元格的文本格式
CurrentCell.BeginUpdate();
CurrentCell.Alignment.Vertical = SpreadsheetVerticalAlignment.Top;
CurrentCell.Alignment.Horizontal = SpreadsheetHorizontalAlignment.Left;
CurrentCell.EndUpdate();
CurrentCell.Value += result;
ChangeDatas(ExcelContentType.Text,result,string.IsNullOrEmpty(result));
} ),
}
};
//签名
popupMenuUser = new SpreadsheetPopupMenu()
{
Items =
{
new DXMenuItem("签名",(a,aa)=> { CurrentCell.Value = GlobalInfo.CurrentUser.RealName; } ),
new DXMenuItem("清空",(a,aa)=> { CurrentCell.Value = ""; ChangeDatas(ExcelContentType.Text,"",true);} ),
}
};
//时间
popupMenuDate = new SpreadsheetPopupMenu()
{
Items =
{
new DXMenuItem("时间",(a,aa)=>
{
// 创建 DateEdit 控件
DateEdit dateEdit = new DateEdit(){ Width = 800,Height = 320 };
dateEdit.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.Fluent;
// 弹出式日期选择框
if (XtraDialog.Show(dateEdit, "选择日期", MessageBoxButtons.OKCancel) == DialogResult.OK)
{
// 用户点击了确定按钮,获取选定的日期
DateTime selectedDate = dateEdit.DateTime;
CurrentCell.Value = selectedDate.ToString("yyyy年MM月dd日");
}
} ),
new DXMenuItem("清空",(a,aa)=>
{
CurrentCell.Value = "";
ChangeDatas(ExcelContentType.Text,"",true);
} ),
}
};
splashScreenManager1.TryCloseWait();
}
/// <summary>
/// 表单发生更改
/// </summary>
/// <param name="contentType"></param>
/// <param name="value"></param>
/// <param name="beClear"></param>
void ChangeDatas(ExcelContentType contentType, string value, bool beClear = false)
{
if (beClear)
{
ExcelContent entity = Datas.Where(x => x.RowIndex == CurrentCell.RowIndex && x.ColumnIndex == CurrentCell.ColumnIndex).FirstOrDefault();
if (entity != null)
Datas.Remove(entity);
}
else
{
Datas.Add(new ExcelContent
{
ColumnIndex = CurrentCell.ColumnIndex,
RowIndex = CurrentCell.RowIndex,
ContentType = contentType,
Text = value
});
}
}
void LoadingTemplate()
{
//// 创建并显示等待窗口
//SplashScreenManager.ShowDefaultWaitForm("加载模板", "请稍等...");
//执行耗时操作
//取当前运行目录
string currentDirectory = Application.StartupPath;
//string filePath = Path.Combine(currentDirectory, "Download", TemplatePath);
excelControl.LoadDocument(IOExtend.FileToByteArray(TemplatePath));
//excelControl.LoadDocument(TemplatePath);
if (excelControl.Document.Worksheets.Contains("正文"))
excelControl.Document.Worksheets.ActiveWorksheet = excelControl.Document.Worksheets["正文"];
excelControl.ActiveWorksheet.ActiveView.Zoom = 145;
excelControl.DocumentLoaded += (s, e) =>
{
EditCell = new List<Cell>();
CanEditCell = new List<Cell>();
SignatureEditCell = new List<Cell>();
DateEditCell = new List<Cell>();
//设置基本信息
for (int i = 0; i < LastUsedRowIndex; i++)
{
CellValue value = worksheet.Cells[i, 0].Value;
//填写设备型号,设备序号,年份信息
if (value.IsText && value.TextValue == "序号")
{
for (int j = 1; j < LastUsedColumnIndex; j++)
{
value = worksheet.Cells[i, j].Value;
if (value.IsText && value.TextValue.Contains("设备型号"))
{
value = worksheet.Cells[i, j + 1].Value;
if (value.IsEmpty)
{
worksheet.Cells[i, j + 1].Value = driveInfo.EquipmentName;
j++;
}
}
else if (value.IsText && value.TextValue.Contains("设备编号"))
{
value = worksheet.Cells[i, j + 1].Value;
if (value.IsEmpty)
{
worksheet.Cells[i, j + 1].Value = driveInfo.EquipmentID;
j++;
}
}
else if (value.IsText && value.TextValue.IndexOf("标记") >= 0 && value.TextValue.IndexOf("并写在异常处理拦,不适用或无生产打") >= 0)
{
worksheet.Cells[i, j].Value = value.TextValue.Replace(" 年", DateTime.Now.Year + "年");
}
}
}
else if (value.IsText && Regex.IsMatch(value.TextValue.Trim(), pattern))
{
//如果首列的内容为 单英文开头+ N*数字结束,则判断为需填写的列
for (int j = 1; j < LastUsedColumnIndex; j++)
{
value = worksheet.Cells[i, j].Value;
if (worksheet.Cells[i, j].IsMerged)
{
//获取主单元格位置
int top = (worksheet.Cells[i, j].GetMergedRanges()[0]).TopRowIndex;
int left = (worksheet.Cells[i, j].GetMergedRanges()[0]).LeftColumnIndex;
if (!worksheet.Cells[top, left].Value.IsEmpty)
continue;
}
if (value.IsEmpty)
{
// 获取指定单元格的图片集合
var picturesInCell = worksheet.Pictures.Where(picture =>
picture.TopLeftCell.RowIndex <= i &&
picture.BottomRightCell.RowIndex >= i &&
picture.TopLeftCell.ColumnIndex <= j &&
picture.BottomRightCell.ColumnIndex >= j);
if (picturesInCell.Any())
continue;
EditCell.Add(worksheet.Cells[i, j]);
}
}
}
else if (value.IsText && value.TextValue.Replace("\n", "").Trim() == "其它异常处理" && worksheet.Cells[i, 1].IsMerged)
{
//异常处理信息
List<CellRange> cells = worksheet.Cells[i, 1].GetMergedRanges().ToList();
if (cells != null && cells.Count == 1)
{
CanEditCell.AddRange(cells[0]);
//保养日期
value = worksheet.Cells[i, cells[0].RightColumnIndex + 1].Value;
if (value.IsText && value.TextValue.Replace("\n", "").Trim() == "保养签名")
{
for (int j = cells[0].RightColumnIndex + 2; j < LastUsedColumnIndex; j++)
{
SignatureEditCell.Add(worksheet.Cells[i, j]);
}
}
//保养签名
value = worksheet.Cells[i + 1, cells[0].RightColumnIndex + 1].Value;
if (value.IsText && value.TextValue.Replace("\n", "").Trim() == "保养日期")
{
for (int j = cells[0].RightColumnIndex + 2; j < LastUsedColumnIndex; j++)
{
DateEditCell.Add(worksheet.Cells[i + 1, j]);
}
}
}
}
}
// 关闭等待窗口
//SplashScreenManager.CloseDefaultWaitForm();
};
}
private void excelControl_ScrollPositionChanged(object sender, ScrollPositionChangedEventArgs e)
{
Task.Run(() =>
{
if (RowHeightSum > this.excelControl.Height)
{
if (e.RowIndex > (LastUsedRowIndex - SubRowsCount))
Invoke(new Action(() => { worksheet.ScrollToRow(LastUsedRowIndex - SubRowsCount); }));
}
if (ColumnWidthSum > this.excelControl.Width)
{
if (e.ColumnIndex > (LastUsedColumnIndex - SubColumnsCount))
Invoke(new Action(() => { worksheet.ScrollToColumn(LastUsedColumnIndex - SubColumnsCount); }));
}
});
}
/// <summary>
/// 取消右键菜单的显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void excelControl_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)
{
e.Menu = null;
}
/// <summary>
/// 添加图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_AddPic_Click(object sender, EventArgs e)
{
try
{
DialogControl.CameraDialog d = new DialogControl.CameraDialog();
if (d.ShowDialog() == DialogResult.OK)
{
using (Graphics graphics = Graphics.FromImage(d.CameraImage))
{
string watermarkText = ApiHelper.Instance.GetServiceTime();
if (string.IsNullOrWhiteSpace(watermarkText))
{
XtraMessageBox.Show("未能获取到服务器时间。", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
Font watermarkFont = new Font("Arial", 12, FontStyle.Bold);
SizeF size = graphics.MeasureString(watermarkText, watermarkFont);
Brush watermarkBrush = new SolidBrush(Color.Red);
int l = d.CameraImage.Size.Width - (int)size.Width - 30;
int h = d.CameraImage.Size.Height - (int)size.Height - 10;
graphics.DrawString(watermarkText, watermarkFont, watermarkBrush, new PointF(l, h));
}
PictureEdit pe = new PictureEdit
{
Image = d.CameraImage,
Width = 94,
Height = 94,
};
pe.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom;
pe.PopupMenuShowing += Pe_PopupMenuShowing; ;
Control btn = imgs_Content.Controls.Find("btn_AddPic", false)?.First();
imgs_Content.Controls.RemoveByKey("btn_AddPic");
imgs_Content.Controls.Add(pe);
imgs_Content.Controls.Add(btn);
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 图片控件自定义右键菜单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Pe_PopupMenuShowing(object sender, DevExpress.XtraEditors.Events.PopupMenuShowingEventArgs e)
{
// 创建一个新的菜单项
DXMenuItem customItem = new DXMenuItem("删除", (s, ee) => { RemovePictureButton_Click(sender, ee); });
// 将菜单项全部清除,并添加自定义菜单到默认右键菜单中
e.PopupMenu.Items.Clear();
e.PopupMenu.Items.Add(customItem);
}
/// <summary>
/// 移除当前照片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RemovePictureButton_Click(object sender, EventArgs e)
{
// 移除当前照片
imgs_Content.Controls.Remove((Control)sender);
}
/// <summary>
/// 选择上传的PDF文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Uploads_Click(object sender, EventArgs e)
{
try
{
//扩展 - 自定义待选择文件类型
OpenFileDialog ofd = new OpenFileDialog();
//自定义待选择文件类型
ofd.Filter = "PDF|*.pdf;";
if (ofd.ShowDialog() == DialogResult.OK)
{
txt_FilePath.Text = ofd.FileName;
}
}
catch (Exception ex)
{
XtraMessageBox.Show(ex.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}