|
|
using KPlan.Util;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Collections.ObjectModel;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Windows;
|
|
|
using System.Windows.Controls;
|
|
|
using System.Windows.Data;
|
|
|
using System.Windows.Documents;
|
|
|
using System.Windows.Input;
|
|
|
using System.Windows.Media;
|
|
|
using System.Windows.Media.Imaging;
|
|
|
using System.Windows.Navigation;
|
|
|
using System.Windows.Shapes;
|
|
|
using System.Windows.Forms;
|
|
|
using System.IO;
|
|
|
using System.Runtime.InteropServices;
|
|
|
using System.ComponentModel;
|
|
|
using Teamcenter.Soa.Client.Model.Strong;
|
|
|
using Teamcenter.Soa.Client.Model;
|
|
|
using Eplan.EplApi.MasterData;
|
|
|
|
|
|
namespace KPlan.Forms {
|
|
|
/// <summary>
|
|
|
/// Interaction logic for PartSyncResult.xaml
|
|
|
/// </summary>
|
|
|
public partial class PartSyncResult : Window {
|
|
|
|
|
|
private ObservableCollection<SyncResult> tableData;
|
|
|
public const string EXPORT_FILE_NAME = "同步失败条目";
|
|
|
public const string EXPORT_FILE_EXT = "xlsx";
|
|
|
private KBackgroundWorker bgWorkder_apply;
|
|
|
private MDPartsDatabase mdPartsDatabase;
|
|
|
|
|
|
public PartSyncResult(MDPartsDatabase mdPartsDatabase, Window parent, int success, int canceled, ObservableCollection<SyncResult> resData) {
|
|
|
InitializeComponent();
|
|
|
this.mdPartsDatabase = mdPartsDatabase;
|
|
|
this.Owner = parent;
|
|
|
table_Sync_Result.ItemsSource = resData;
|
|
|
this.tableData = resData;
|
|
|
l_Summary.Content = "同步成功"+success+"行,同步失败"+resData.Count+"行"+(canceled>0?", 取消"+canceled+"行":"");
|
|
|
bgWorkder_apply = new KBackgroundWorker(this);
|
|
|
bgWorkder_apply.backgroundWorker.DoWork += Async_DoApply;
|
|
|
}
|
|
|
|
|
|
private void doExport() {
|
|
|
int rowCnt = tableData.Count;
|
|
|
if (rowCnt == 0) {
|
|
|
return;
|
|
|
}
|
|
|
string targetPath = null;
|
|
|
using (var fbd = new FolderBrowserDialog()) {
|
|
|
DialogResult result = fbd.ShowDialog();
|
|
|
if (result == System.Windows.Forms.DialogResult.OK) {
|
|
|
targetPath = fbd.SelectedPath;
|
|
|
}
|
|
|
}
|
|
|
if (string.IsNullOrWhiteSpace(targetPath)) {
|
|
|
return;
|
|
|
}
|
|
|
KUtil.Log("导出同步失败条目...");
|
|
|
KUtil.Log("导出路径:"+targetPath);
|
|
|
string filePath = KUtil.GetFilePath(targetPath, EXPORT_FILE_NAME, EXPORT_FILE_EXT);
|
|
|
KUtil.Log("导出文件:"+filePath);
|
|
|
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
|
|
|
if (xlApp == null) {
|
|
|
System.Windows.MessageBox.Show("Excel 未正确安装");
|
|
|
return;
|
|
|
}
|
|
|
Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
|
|
|
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
|
|
|
object misValue = System.Reflection.Missing.Value;
|
|
|
xlWorkBook = xlApp.Workbooks.Add(misValue);
|
|
|
xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
|
|
|
|
|
|
xlWorkSheet.Cells[1, 1] = "部件编号";
|
|
|
xlWorkSheet.Cells[1, 2] = "订货号";
|
|
|
xlWorkSheet.Cells[1, 3] = "名称";
|
|
|
xlWorkSheet.Cells[1, 4] = "计量单位";
|
|
|
xlWorkSheet.Cells[1, 5] = "描述(中文)";
|
|
|
xlWorkSheet.Cells[1, 6] = "描述(英文)";
|
|
|
xlWorkSheet.Cells[1, 7] = "失败原因";
|
|
|
|
|
|
for(int i = 0; i < rowCnt; i++) {
|
|
|
int r = i + 2;
|
|
|
SyncResult bean = tableData[i];
|
|
|
xlWorkSheet.Cells[r, 1] = bean.partNr;
|
|
|
xlWorkSheet.Cells[r, 2] = bean.orderNr;
|
|
|
xlWorkSheet.Cells[r, 3] = bean.name;
|
|
|
xlWorkSheet.Cells[r, 4] = bean.jldw;
|
|
|
xlWorkSheet.Cells[r, 5] = bean.desc_cn;
|
|
|
xlWorkSheet.Cells[r, 6] = bean.desc_en;
|
|
|
xlWorkSheet.Cells[r, 7] = bean.reason;
|
|
|
}
|
|
|
|
|
|
//Here saving the file in xlsx
|
|
|
xlWorkBook.SaveAs(filePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, misValue,
|
|
|
misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
|
|
|
xlWorkBook.Close(true, misValue, misValue);
|
|
|
xlApp.Quit();
|
|
|
Marshal.ReleaseComObject(xlWorkSheet);
|
|
|
Marshal.ReleaseComObject(xlWorkBook);
|
|
|
Marshal.ReleaseComObject(xlApp);
|
|
|
System.Windows.MessageBox.Show("导出完成");
|
|
|
}
|
|
|
|
|
|
private void Async_DoApply(object sender, DoWorkEventArgs e) {
|
|
|
KUtil.Log("发起编码申请...");
|
|
|
List<SyncResult> applyData = new List<SyncResult>();
|
|
|
bgWorkder_apply.Progress("检查数据...", 0);
|
|
|
bool descEmpty = false;
|
|
|
this.Dispatcher.Invoke(new Action(delegate {
|
|
|
int len = tableData.Count;
|
|
|
for (int i = 0; i < len; i++) {
|
|
|
SyncResult bean = tableData[i];
|
|
|
if (KUtil.IsEmpty(bean.desc_en)) {
|
|
|
KUtil.Log("描述缺失:"+bean.partNr);
|
|
|
descEmpty = true;
|
|
|
//break;
|
|
|
}
|
|
|
if (KPartSync.SAP_NEED_ID.Equals(bean.reason)) {
|
|
|
applyData.Add(bean);
|
|
|
}
|
|
|
}
|
|
|
}));
|
|
|
if (descEmpty) {
|
|
|
KUtil.Log("缺少英文描述,请填写后重新申请");
|
|
|
KUtil.DispatcherShow(this, "缺少英文描述,请填写后重新申请");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
DoApply(this, applyData,mdPartsDatabase);
|
|
|
}
|
|
|
|
|
|
public static void DoApply(Window window, List<SyncResult> applyData, MDPartsDatabase mdPartsDatabase) {
|
|
|
if (applyData.Count == 0) {
|
|
|
KUtil.Log("没有数据");
|
|
|
KUtil.DispatcherShow(window, "请选择“"+KPartSync.SAP_NEED_ID+"”的数据进行操作");
|
|
|
return;
|
|
|
}
|
|
|
//新建对象
|
|
|
string itemType = KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_ITEMTYPE);
|
|
|
if (KUtil.IsEmpty(itemType)) {
|
|
|
throw new Exception("未配置编码申请对象类型");
|
|
|
}
|
|
|
ItemRevision rev = TCUtil.CreateNewDocument(itemType, "编码申请单");
|
|
|
if (rev == null) {
|
|
|
throw new Exception("新建对象异常");
|
|
|
}
|
|
|
ModelObject[] mo = TCUtil.Refresh(rev);
|
|
|
TCUtil.GetProperties(false, mo, "object_string", "items_tag", "IMAN_master_form_rev");
|
|
|
KUtil.Log("新建对象完成:" + rev.Object_string);
|
|
|
//设置表单属性
|
|
|
ModelObject[] form = rev.IMAN_master_form_rev;
|
|
|
string tableProp = KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_TABLE);
|
|
|
string rowType = KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_ROWTYPE);
|
|
|
if (!KUtil.IsEmpty(tableProp) && !KUtil.IsEmpty(rowType) && form.Length > 0) {
|
|
|
KUtil.Log("保存表格属性:" + rowType + "|" + tableProp);
|
|
|
List<ModelObject> rows = new List<ModelObject>();
|
|
|
for (int i = 0; i < applyData.Count; i++) {
|
|
|
SyncResult bean = applyData[i];
|
|
|
Dictionary<string, string> props = new Dictionary<string, string>();
|
|
|
AddProp(props, bean.orderNr, KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_ORDERNR));
|
|
|
AddProp(props, Guid.NewGuid().ToString("D"), KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_GUID));
|
|
|
AddProp(props, bean.jldw, KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_UNIT));
|
|
|
AddProp(props, bean.desc_cn, KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_DESC_CN));
|
|
|
AddProp(props, bean.desc_en, KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_DESC_EN));
|
|
|
// AddProp(props, "ElecElement", "sf6_Classification");
|
|
|
ModelObject rowComp = TCUtil.CreateNewRow(rowType, props);
|
|
|
if (rowComp != null) {
|
|
|
KUtil.Log("添加行数据:" + KUtil.ToString(props));
|
|
|
rows.Add(rowComp);
|
|
|
}
|
|
|
}
|
|
|
TCUtil.SetRefProperty(form[0], tableProp, rows);
|
|
|
}
|
|
|
//存放位置
|
|
|
Folder targetFolder = GetSaveFolder();
|
|
|
if (targetFolder != null) {
|
|
|
TCUtil.CreateNewRelation(targetFolder, rev.Items_tag, "contents");
|
|
|
}
|
|
|
//发起流程
|
|
|
string prefName = KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_PROCESS_TEMPLATE);
|
|
|
string[] templateNames = TCUtil.GetPrefVals(prefName);
|
|
|
if (templateNames != null && templateNames.Length > 0) {
|
|
|
KUtil.Log("准备发起流程:" + templateNames[0]);
|
|
|
TCUtil.CreateNewProcess(templateNames[0], rev, 1);//root_target_attachments EPM_target_attachment
|
|
|
KUtil.Log("发起流程结束");
|
|
|
try {
|
|
|
SetStatus(mdPartsDatabase, applyData, KPartSync.APPLYING);
|
|
|
}catch(System.Exception ex) {
|
|
|
KUtil.LogErr(ex);
|
|
|
KUtil.Log("更改状态失败,再次尝试更改");
|
|
|
SetStatus(mdPartsDatabase, applyData, KPartSync.APPLYING);
|
|
|
}
|
|
|
KUtil.DispatcherShow(window, "编码申请流程已经发起");
|
|
|
}
|
|
|
else {
|
|
|
KUtil.DispatcherShow(window, "新建对象完成,未找到编码申请流程信息");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private static void SetStatus( MDPartsDatabase mdPartsDatabase, List<SyncResult> applyData,string status) {
|
|
|
if (applyData==null||applyData.Count == 0) {
|
|
|
return;
|
|
|
}
|
|
|
Eplan.EplApi.MasterData.MDPartsDatabaseTransaction trans = mdPartsDatabase.CreateTransaction();
|
|
|
try {
|
|
|
for (int i = 0; i < applyData.Count; i++) {
|
|
|
SyncResult bean = applyData[i];
|
|
|
if (bean.dataRow.part != null) {
|
|
|
KUtil.Log("更改状态:" + bean.partNr + " -> " + status);
|
|
|
bean.dataRow.part.Properties.ARTICLE_CERTIFICATE_ATEX = status;
|
|
|
bean.dataRow.sync_status = status;
|
|
|
}
|
|
|
}
|
|
|
trans.Commit();
|
|
|
}
|
|
|
finally {
|
|
|
trans.Dispose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private static void AddProp(Dictionary<string, string> props, string propVal, string propName) {
|
|
|
if (!KUtil.IsEmpty(propName)) {
|
|
|
int ind = propName.IndexOf('=');
|
|
|
string def = "";
|
|
|
if (ind > 0) {
|
|
|
def = propName.Substring(ind + 1);
|
|
|
propName = propName.Substring(0, ind);
|
|
|
}
|
|
|
if (KUtil.IsEmpty(propVal)) {
|
|
|
props.Add(propName, def);
|
|
|
}
|
|
|
else {
|
|
|
props.Add(propName, propVal);
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
private static Folder GetSaveFolder() {
|
|
|
string prefName = KUtil.GetConfigValue(KConfigure.BMSQ_SECTION, KConfigure.BMSQ_POSITION_PREF);
|
|
|
Folder targetFolder = null;
|
|
|
if (!KUtil.IsEmpty(prefName)) {
|
|
|
string[] uids = TCUtil.GetPrefVals(prefName);
|
|
|
if (uids != null && uids.Length > 0) {
|
|
|
string uid = uids[0].Trim();
|
|
|
KUtil.Log("从首选项获取存放文件夹:" + uid);
|
|
|
ModelObject comp = TCUtil.StringToComponent(uid);
|
|
|
if (comp != null) {
|
|
|
targetFolder = comp as Folder;
|
|
|
TCUtil.Refresh(targetFolder);
|
|
|
TCUtil.GetProperties(false, new ModelObject[] { targetFolder }, "object_name","contents");
|
|
|
KUtil.Log("找到文件夹:" + targetFolder.Object_name);
|
|
|
WorkspaceObject[] contents = targetFolder.Contents;
|
|
|
TCUtil.GetProperties(false, contents, "object_name","creation_date");
|
|
|
int len = contents==null?0: contents.Length;
|
|
|
DateTime latest = DateTime.MinValue;
|
|
|
for(int i = 0; i < len; i++) {
|
|
|
Folder cFolder = contents[i] as Folder;
|
|
|
if (cFolder == null) {
|
|
|
continue;
|
|
|
}
|
|
|
DateTime cDate = cFolder.Creation_date;
|
|
|
KUtil.Log("找到子文件夹:"+cFolder.Object_name+"|创建时间:"+cDate);
|
|
|
if (latest == null) {
|
|
|
latest = cDate;
|
|
|
targetFolder = cFolder;
|
|
|
}
|
|
|
else {
|
|
|
if (latest.CompareTo(cDate) < 0) {
|
|
|
latest = cDate;
|
|
|
targetFolder = cFolder;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
if (targetFolder == null) {
|
|
|
KUtil.Log("没有指定存放文件夹,放到NewStuff");
|
|
|
TCUtil.GetProperties(false, new ModelObject[] { TCUtil.user }, "newstuff_folder");
|
|
|
targetFolder = TCUtil.user.Newstuff_folder;
|
|
|
}
|
|
|
else {
|
|
|
KUtil.Log("找到最新的文件夹:"+targetFolder.Object_name);
|
|
|
}
|
|
|
return targetFolder;
|
|
|
}
|
|
|
|
|
|
private void Window_Loaded(object sender, RoutedEventArgs e) {
|
|
|
int len = tableData.Count;
|
|
|
bool needApply = false;
|
|
|
for(int i = 0; i < len; i++) {
|
|
|
if (KPartSync.SAP_NEED_ID.Equals(tableData[i].reason)) {
|
|
|
needApply = true;
|
|
|
}
|
|
|
}
|
|
|
b_Apply.IsEnabled = needApply;
|
|
|
b_Export.IsEnabled = len != 0;
|
|
|
}
|
|
|
|
|
|
private void CLose_Button_Click(object sender, RoutedEventArgs e) {
|
|
|
Close();
|
|
|
}
|
|
|
|
|
|
private void Export_Button_Click(object sender, RoutedEventArgs e) {
|
|
|
try {
|
|
|
doExport();
|
|
|
}catch(System.Exception ex) {
|
|
|
System.Windows.MessageBox.Show(this, "导出出错:"+ex.Message);
|
|
|
KUtil.LogErr(ex);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void Apply_Button_Click(object sender, RoutedEventArgs e) {
|
|
|
this.bgWorkder_apply.Start(null);
|
|
|
}
|
|
|
}
|
|
|
}
|