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

345 lines
12 KiB

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 Eplan.EplApi.Base;
using Eplan.EplApi.DataModel;
using Microsoft.Office.Interop.Excel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using KPlan.Util;
using KPlan.RefActions;
namespace KPlan.RefActions {
public partial class CheckForm : Form {
public String projectCode = "";
public Project currentProject = null;
public string xmlFilePath = "";
public CheckForm() {
InitializeComponent();
}
private void CheckForm_Load(object sender, EventArgs e) {
TCTool.ReadConfigs();
int titleNum = TCTool.BomTitleName.Count;
this.ComListView.Columns.Add("检查结果", 80, HorizontalAlignment.Left); //一步添加表头信息
foreach (string str in TCTool.BomTitleName) {
this.ComListView.Columns.Add(str, 120, HorizontalAlignment.Left); //一步添加表头信息
}
Progress progress = new Progress("EnhancedProgress");
progress.SetActionText("正在加载表单...");
progress.SetTitle("加载表单");
progress.BeginPart(100.0, "进度");
progress.ShowImmediately();
progress.SetAllowCancel(true);
if (!ReadXMLFile()) {
btnGenerateList.Enabled = false;
}
else {
btnGenerateList.Enabled = true;
}
progress.EndPart(true);
}
/**
*
* 功能解析partslist XML文件
* 过滤掉不需要的部件,
* 得到需要的部件列表的信息
*
* 入参partslist XML 文件地址
*
*/
public bool ReadXMLFile() {
XmlTextReader xtr = new XmlTextReader(xmlFilePath);
//MessageBox.Show("xtr---------------------------" + xmlFilePath);
string name_f = "@@";
bool is_dos = false;
bool is_device = false;
string device_name = "";
bool hasError = false;
int record_code_idx = -1;
int record_num_idx = -1;
int PropertyNoum = TCTool.BomPropertyKey.Count;
for (int step = 0; step < PropertyNoum; step++) {
//MessageBox.Show("TCTool.BomPropertyKey[step]---------------------------" + TCTool.BomPropertyKey[step]);
if (TCTool.BomPropertyKey[step].Equals("P_ARTICLE_ERPNR")) {
record_code_idx = step;
}
if (TCTool.BomPropertyKey[step].Equals("P_ARTICLEREF_COUNT")) {
record_num_idx = step;
}
}
try {
this.ComListView.BeginUpdate(); //数据更新UI暂时挂起直到EndUpdate绘制控件可以有效避免闪烁并大大提高加载速度
while (xtr.Read()) {
bool is_other = true;
if (is_device) {
if (xtr.NodeType == XmlNodeType.EndElement) {
is_device = false;
}
else {
continue;
}
}
if (xtr.NodeType != XmlNodeType.Element) {
continue;
}
if (!xtr.HasAttributes) {
continue;
}
string element_name = xtr.Name;
bool is_P_ARTICLE_DISCONTINUED = false;
bool is_wire = false;
string wire_length = "";
string record_code = "";
string record_num = "";
string record_type = "";
string[] propertyValue = new string[PropertyNoum];
while (xtr.MoveToNextAttribute()) {
if (xtr.Name == "P_ARTICLEREF_IDENTNAME") {
device_name = xtr.Value;
}
//if (xtr.Name == "P_ARTICLEREF_IDENTNAME" && xtr.Value.Equals("=+"))
//{
// xtr.MoveToElement();
// is_device = true;
// break;
//}
if (xtr.Name == "P_ARTICLE_DISCONTINUED") //停用
{
if (!xtr.Value.Equals("0")) {
is_P_ARTICLE_DISCONTINUED = true;
}
}
if (xtr.Name == "P_ARTICLE_PARTIAL_LENGTH_VALUE") //此处标识出连接线的部件
{
is_wire = true;
wire_length = xtr.Value;
}
else if (xtr.Name == "P_ARTICLE_ERPNR") {
is_other = false;
record_code = xtr.Value;
}
else if (xtr.Name == "P_ARTICLEREF_COUNT") {
record_num = xtr.Value;
}
else if (xtr.Name == "P_ARTICLE_TYPENR") {
record_type = xtr.Value;
}
for (int step = 0; step < PropertyNoum; step++) {
if (xtr.Name == TCTool.BomPropertyKey[step].ToString()) {
//if (xtr.Name.Equals("P_ARTICLE_ERPNR") && record_code_idx == -1)
//{
// record_code_idx = step;
//}
//if (xtr.Name.Equals("P_ARTICLEREF_COUNT") && record_num_idx == -1)
//{
// record_num_idx = step;
//}
is_other = false;
if (xtr.Value.Contains("@") && xtr.Value.Contains(";")) {
string[] arrStr = xtr.Value.Split(';');
int arrLen = arrStr.Length;
for (int cnt = 0; cnt < arrLen; cnt++) {
if (arrStr[cnt].StartsWith("zh_CN") || arrStr[cnt].StartsWith("??")) {
propertyValue[step] = arrStr[cnt].Split('@')[1];
break;
}
}
}
else {
propertyValue[step] = xtr.Value;
}
break;
}
}
}
if (element_name == "device") //此处过滤掉一些组合设备的部件
{
if (device_name.IndexOf(name_f) != -1) {
is_dos = true;
}
else {
is_dos = false;
}
}
else if (element_name == "part") {
if (is_dos) {
continue;
}
if (TCTool.lineCount != "TRUE") {
if (is_wire) {
continue;
}
}
else {
if (is_wire) {
if (!string.IsNullOrEmpty(wire_length) && !string.IsNullOrEmpty(record_num)) {
double dwire_length = Convert.ToDouble(wire_length);
if (dwire_length != 0.0) {
double drecord_num = Convert.ToDouble(record_num);
drecord_num = dwire_length * drecord_num;
record_num = drecord_num.ToString();
propertyValue[record_num_idx] = record_num;
}
}
}
}
if (record_num.Equals("0")) {
continue;
}
if (is_other) {
name_f = device_name;
}
ListViewItem lvi = new ListViewItem();
lvi.UseItemStyleForSubItems = false;
if (record_code.Equals("")) {
for (int i = 0; i < TCTool.P_ARTICLE_TYPENRs.Count; i++) {
if (record_type.Equals(TCTool.P_ARTICLE_TYPENRs[i].ToString(), StringComparison.OrdinalIgnoreCase)) {
record_code = TCTool.P_ARTICLE_ERPNRs[i].ToString();
propertyValue[record_code_idx] = record_code;
break;
}
}
}
if (is_P_ARTICLE_DISCONTINUED) {
lvi.ForeColor = Color.Red;
hasError = true;
lvi.Text = "停产部件";
}
else {
if (record_code.Equals("")) {
lvi.ForeColor = Color.Red;
hasError = true;
lvi.Text = "TC不存在2";
}
else {
int findItem = TCTool.checkItem(record_code);
if (findItem == 0) {
lvi.ForeColor = Color.Red;
hasError = true;
lvi.Text = "TC不存在3";
}
else {
lvi.Text = "TC存在";
}
}
}
for (int step = 0; step < PropertyNoum; step++) {
if (propertyValue[step] == null) {
lvi.SubItems.Add("");
}
else {
lvi.SubItems.Add(propertyValue[step]).ForeColor=Color.Black;
}
}
this.ComListView.Items.Add(lvi);
}
}
xtr.Close();
this.ComListView.EndUpdate(); //结束数据处理UI界面一次性绘制。
}
catch (XmlException ex) {
MessageBox.Show(ex.Message);
}
return hasError;
}
private void generateListButton_Click(object sender, EventArgs e) {
Progress progress = new Progress("EnhancedProgress");
progress.SetActionText("正在生成excel...");
progress.SetTitle("生成申请清单");
progress.BeginPart(100.0, "进度");
progress.ShowImmediately();
progress.SetAllowCancel(true);
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
string nowtime = DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss");
string fileName = Environment.GetEnvironmentVariable("temp") + "\\申请清单" + nowtime + ".xlsx";
if (File.Exists(fileName)) {
File.Delete(fileName);
}
excel.Visible = false;
excel.Application.Workbooks.Add(true);
Workbook wb = (Workbook)excel.ActiveWorkbook;
Worksheet st = (Worksheet)wb.ActiveSheet;
int col = 1;
foreach (string str in TCTool.BomTitleName) {
st.Cells[1, col] = str;
col++;
}
int row = 2;
for (int i = 0; i < ComListView.Items.Count; i++) {
if (ComListView.Items[i].Text == "TC存在") {
continue;
}
for (int j = 0; j < col - 1; j++) {
st.Cells[row, j + 1] = ComListView.Items[i].SubItems[j + 1].Text;
}
row++;
}
//保存excel文件
wb.SaveCopyAs(fileName);
//关闭文件
wb.Close(false, Type.Missing, Type.Missing);
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.GC.Collect();
progress.EndPart(true);
GeneralListForm generalListForm = new GeneralListForm();
generalListForm.labelName = "申请清单生成完成,请查看!";
generalListForm.xlsPath = fileName;
generalListForm.ShowDialog();
}
private void ComListView_ColumnClick(object sender, ColumnClickEventArgs e) {
ComListView.ListViewItemSorter = new ListViewItemComparer(e.Column);
ComListView.Sort();
}
}
public class ListViewItemComparer : IComparer {
private int col;
public ListViewItemComparer(int col) {
this.col = col;
}
public int Compare(object x, object y) {
int returnVal = -1;
returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
((ListViewItem)y).SubItems[col].Text);
return returnVal;
}
}
}