年度变更建库软件5.0版本
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.

445 lines
19 KiB

6 months ago
using DevExpress.Spreadsheet;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using KGIS.Framework.AE;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.Helper;
using KGIS.Framework.Views;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using Worksheet = DevExpress.Spreadsheet.Worksheet;
using KUI.Windows;
using System.Linq;
namespace Kingo.Plugin.DLTB_IDG.View
{
/// <summary>
/// 核查记录挂接.xaml 的交互逻辑
/// </summary>
public partial class HCRecordConnectionView : UserControl, IDockPanel2
{
/// <summary>
/// 提取图斑视图数据
/// </summary>
private DataTable IntoData { get; set; }
private IFeatureLayer DLTBBG_Layer_Temp = null;
private string BGBSMs = string.Empty;
private string excelPath = string.Empty;
private IFeatureLayer featureBGLayer = null;
Dictionary<string, List<object>> fieldValueDict = null;
Dictionary<string, string> keyValuePairs = null;
public HCRecordConnectionView()
{
InitializeComponent();
Title = "核查记录挂接";
DevExpress.Xpf.Core.ThemeManager.SetTheme(this, DevExpress.Xpf.Core.Theme.Office2013LightGray);
DockAreas = DockStyle.DockRight | DockStyle.DockBottom | DockStyle.DockLeft;
FloatSize = new System.Drawing.Size(1030, 660);
DockWidth = 660;
DockHeight = 380;
DefaultArea = DockStyle.DockBottom;
ShowCloseButton = true;
ShowAutoHideButton = false;
IsShowInMap = true;
}
#region 继承属性
public bool IsShowInMap { get; set; }
public Guid ID { get; set; }
public DockStyle DockAreas { get; set; }
public System.Drawing.Size FloatSize { get; set; }
public int DockWidth { get; set; }
public int DockHeight { get; set; }
public DockStyle DefaultArea { get; set; }
public bool ShowCloseButton { get; set; }
public bool ShowAutoHideButton { get; set; }
public string Title { get; set; }
public event EventHandler CloseViewHandler;
#endregion
/// <summary>
/// 数据提取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnDataExtract_Click(object sender, RoutedEventArgs e)
{
try
{
excelPath = string.Empty; //@"E:\软件产品测试总目录\普陀区\浙江扣除系数问题\(330903)浙江省舟山市普陀区问题图斑核实记录表.xlsx";
KGIS.Framework.Utils.Dialog.OpenFileDialog openFileDialog = new KGIS.Framework.Utils.Dialog.OpenFileDialog();
openFileDialog.Title = "导入扣除系数表EXCEL";
openFileDialog.Filter = "Excel Files(*.xlsx)| *.xlsx";
openFileDialog.FileName = string.Empty;
openFileDialog.FilterIndex = 1;
if (openFileDialog.ShowDialog())
{
excelPath = openFileDialog.FileName;
}
if (featureBGLayer == null)
featureBGLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG");
if (featureBGLayer == null || string.IsNullOrWhiteSpace(excelPath)) return;
this.ShowLoading("正在进行核查记录挂接数据提取.........", 0, 0);
// 打开 Excel 文件
FileStream stream = new FileStream(excelPath, FileMode.Open);
Workbook workbook = new Workbook();
workbook.LoadDocument(stream, DocumentFormat.OpenXml);
Worksheet sheet = workbook.Worksheets[0];
// 获取 Excel 表格中的数据范围
Range usedRange = sheet.GetUsedRange();
int rowCount = usedRange.RowCount;
int columnCount = usedRange.ColumnCount;
// 获取 Excel 表格中的字段名和值
List<string> fieldNames = new List<string>();
fieldValueDict = new Dictionary<string, List<object>>();
int indexValue = 1;
for (int i = 0; i < columnCount; i++)
{
string fieldName = sheet.Rows[indexValue][i].DisplayText.ToString();
while (i == 0 && fieldName != "省代码")
{
indexValue++;
fieldName = sheet.Rows[indexValue][i].DisplayText.ToString();
}
fieldNames.Add(fieldName);
}
for (int j = 2; j <= rowCount; j++)
{
string BSMValue = sheet.Rows[j][4].DisplayText.ToString();
if (string.IsNullOrWhiteSpace(BSMValue)) continue;
List<object> fieldValues = new List<object>();
for (int i = 0; i < columnCount; i++)
{
object value = sheet.Rows[j][i].Value;
if (value != null)
{
fieldValues.Add(value);
}
}
fieldValueDict[BSMValue] = fieldValues;
}
DLTBBG_Layer_Temp = GeoDBAPI.CreateFeatureLayerInmemeory("DLTBBG", "地类图斑变更", (featureBGLayer.FeatureClass as IGeoDataset).SpatialReference, featureBGLayer.FeatureClass.ShapeType, featureBGLayer.FeatureClass.Fields);
IFeatureClassAPI featureClassAPI = new FeatureClassAPI(featureBGLayer.FeatureClass);
featureClassAPI.FcToFc(DLTBBG_Layer_Temp.FeatureClass, null, false);
//创建要素类字段
foreach (string fieldName in fieldNames)
{
IField field = new FieldClass();
IFieldEdit fieldEdit = (IFieldEdit)field;
fieldEdit.Name_2 = fieldName + "_HC";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
fieldEdit.Length_2 = 255;
DLTBBG_Layer_Temp.FeatureClass.AddField(field);
}
IFeatureCursor cursorBG = DLTBBG_Layer_Temp.FeatureClass.Update(null, true);
IFeature featurebg = null;
IFields fieldsBg = DLTBBG_Layer_Temp.FeatureClass.Fields;
while ((featurebg = cursorBG.NextFeature()) != null)
{
string BSMBGValue = featurebg.Value[fieldsBg.FindField("BSM")].ToString();
if (!fieldValueDict.ContainsKey(BSMBGValue)) continue;
for (int i = 0; i < fieldsBg.FieldCount; i++)
{
IField field = fieldsBg.get_Field(i);
if (field.Name.Contains("_HC"))
{
foreach (var item in fieldValueDict[BSMBGValue])
{
featurebg.Value[i] = item;
i++;
if (!string.IsNullOrWhiteSpace(item.ToString()) && item.ToString().Contains("扣除系数:不通过"))
BGBSMs += string.Format("'{0}',", BSMBGValue);
}
break;
}
}
featurebg.Store();
}
cursorBG.Flush();
IQueryFilter queryFilter = new QueryFilterClass()
{
WhereClause = "标识码_HC Is NULL OR 标识码_HC=''"
};
(DLTBBG_Layer_Temp as ITable).DeleteSearchedRows(queryFilter);
LoadData(DLTBBG_Layer_Temp);
this.CloseLoading();
MessageHelper.ShowTips("核查记录挂接数据提取完成!");
if (workbook != null) workbook.Dispose();
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
LogAPI.Debug(ex);
}
finally
{
this.CloseLoading();
}
}
/// <summary>
/// 数据挂接
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnDataHitch_Click(object sender, RoutedEventArgs e)
{
try
{
if (DLTBBG_Layer_Temp == null || DLTBBG_Layer_Temp.FeatureClass.FeatureCount(null) == 0) return;
this.ShowLoading("正在进行核查记录数据挂接.........", 0, 0);
IFeatureLayer featureJC = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("地类图斑");
int JCKCDLXSIndex = featureJC.FeatureClass.FindField("KCXS");
int JCGDPDJBIndex = featureJC.FeatureClass.FindField("GDPDJB");
IQueryFilter queryFilter = new QueryFilterClass() { WhereClause = string.Format("BSM In({0})", BGBSMs.Trim(',')) };
IFeatureCursor featureBGCur = featureBGLayer.FeatureClass.Update(queryFilter, true);
IFeature feature = null;
int BGKCXSIndex = featureBGLayer.FeatureClass.FindField("KCXS");
int BGGDPDJBIndex = featureBGLayer.FeatureClass.FindField("GDPDJB");
int BGBSMIndex = featureBGLayer.FeatureClass.FindField("BSM");
keyValuePairs = new Dictionary<string, string>();
while ((feature = featureBGCur.NextFeature()) != null)
{
//keyValuePairs[BSMValue] = "非关联数据";
List<IFeature> features = FeatureAPI.Identify2(feature.ShapeCopy, featureJC);
if (features.Count == 1 && (feature.Value[BGKCXSIndex] != features[0].Value[JCKCDLXSIndex] || feature.Value[BGGDPDJBIndex] != features[0].Value[JCGDPDJBIndex]))
{
string BSMValue = feature.Value[BGBSMIndex].ToString();
keyValuePairs[BSMValue] = "关联数据";
feature.Value[BGKCXSIndex] = features[0].Value[JCKCDLXSIndex];
feature.Value[BGGDPDJBIndex] = features[0].Value[JCGDPDJBIndex];
feature.Store();
}
}
featureBGCur.Flush();
this.CloseLoading();
MessageHelper.ShowTips("挂接完成!");
}
catch (Exception ex)
{
MessageHelper.ShowError(ex.Message);
LogAPI.Debug(ex);
}
finally
{
this.CloseLoading();
}
}
/// <summary>
/// 结果导出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BtnDataExport_Click(object sender, RoutedEventArgs e)
{
try
{
var sourcesfile = SysAppPath.GetCurrentAppPath() + string.Format(@"TempalateReports\核查挂接结果模板\{0}", "核查挂接结果.xls");
Aspose.Cells.Workbook workbook = new Aspose.Cells.Workbook(sourcesfile);
workbook.CalculateFormula(true);
Aspose.Cells.Worksheet sheet = workbook.Worksheets[0];
string xlsFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");
string OutPath = string.Empty;
KGIS.Framework.Utils.Dialog.FolderBrowserDialog pBrowser = new KGIS.Framework.Utils.Dialog.FolderBrowserDialog
{
ShowNewFolderButton = true
};
if (pBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
OutPath = pBrowser.SelectedPath;
}
else
return;
string TempPath = string.Format(@"{0}\{1}{2}.xls", OutPath, "核查挂接结果", xlsFileName);
int IndexValue = 1;//行
int XHValue = 1;
if (fieldValueDict == null) return;
foreach (var item in fieldValueDict)
{
for (int j = 0; j < 3; j++)
{
Aspose.Cells.Cell cell = sheet.Cells[IndexValue, j];
if (j == 0)
{
cell.PutValue(XHValue);
XHValue++;
continue;
}
else if (j == 1)
{
cell.PutValue(item.Key);
continue;
}
else
{
if (keyValuePairs.ContainsKey(item.Key))
cell.PutValue(keyValuePairs[item.Key]);
else
cell.PutValue("非关联数据");
}
}
IndexValue++;
}
workbook.Save(TempPath);
MessageHelper.ShowTips("挂接结果导出成功!");
}
catch (Exception ex)
{
MessageHelper.ShowTips(ex.Message);
LogAPI.Debug(ex);
}
}
/// <summary>
/// 加载视图数据
/// </summary>
private void LoadData(IFeatureLayer FcAPI_DLTBHRGC)
{
IFeatureCursor cursor = null;
IFeature BgFeature = null;
try
{
if (FcAPI_DLTBHRGC.FeatureClass == null || FcAPI_DLTBHRGC.FeatureClass.FeatureCount(null) <= 0) return;
IntoData = new DataTable();//从地类图斑图层取数据
ConstructColumn(FcAPI_DLTBHRGC.FeatureClass.Fields);
IQueryFilter queryfilter = new QueryFilterClass
{
WhereClause = string.Format("")
};
cursor = FcAPI_DLTBHRGC.FeatureClass.Search(queryfilter, true);
while ((BgFeature = cursor.NextFeature()) != null)
{
DataRow dr = IntoData.NewRow();
dr[0] = false;
for (int i = 0; i < IntoData.Columns.Count; i++)
{
if (i == 0)
{
dr[i] = false;
continue;
}
object obj = BgFeature.get_Value((int)IntoData.Columns[i].ExtendedProperties["index"]);
if (obj == null)
{
continue;
}
else
{
if (obj.ToString().Contains("1899/12/30 0:00:00"))
{
obj = DBNull.Value;
}
}
if (obj is string)
obj = obj.ToString().Trim();
dr[i] = obj;
}
IntoData.Rows.Add(dr);
}
dgInto2.ItemsSource = null;
dgInto2.ItemsSource = IntoData;
}
catch (Exception ex)
{
LogAPI.Debug("加载区划调整数据失败,异常信息如下:");
LogAPI.Debug(ex);
MessageHelper.ShowError("加载区划调整数据失败:" + ex.Message);
}
}
/// <summary>
/// 根据地类图斑划入过程构造列
/// </summary>
/// <param name="fields"></param>
private void ConstructColumn(IFields fields)
{
if (fields != null)
{
IntoData = new DataTable();
DataColumn col1 = new DataColumn();
col1.ColumnName = "IsValid";
col1.Caption = "选中";
col1.DataType = typeof(bool);
IntoData.Columns.Add(col1);
for (int i = 0; i < fields.FieldCount; i++)
{
IField field = fields.get_Field(i);
if (field.Name.ToUpper().StartsWith("SHAPE")) continue;
if ("SFJZ,NYJY,NYYPDL,TZ,BGDL,BGFW,WBGLX,SJLY,SFJCTB,BZ,BGZT,JCZT,XZQTZLX".Contains(field.Name)) continue;
DataColumn col = new DataColumn();
col.ExtendedProperties.Add("index", i);
col.ColumnName = field.Name;
col.Caption = field.AliasName;
switch (field.Type)
{
case esriFieldType.esriFieldTypeSmallInteger:
col.DataType = typeof(short);
break;
case esriFieldType.esriFieldTypeInteger:
col.DataType = typeof(int);
break;
case esriFieldType.esriFieldTypeSingle:
break;
case esriFieldType.esriFieldTypeDouble:
col.DataType = typeof(double);
break;
case esriFieldType.esriFieldTypeString:
col.DataType = typeof(string);
break;
case esriFieldType.esriFieldTypeDate:
col.DataType = typeof(DateTime);
break;
case esriFieldType.esriFieldTypeOID:
col.DataType = typeof(Int32);
break;
case esriFieldType.esriFieldTypeGeometry:
break;
case esriFieldType.esriFieldTypeBlob:
break;
case esriFieldType.esriFieldTypeRaster:
break;
case esriFieldType.esriFieldTypeGUID:
break;
case esriFieldType.esriFieldTypeGlobalID:
break;
case esriFieldType.esriFieldTypeXML:
break;
default:
break;
}
col.ReadOnly = !field.Editable;
IntoData.Columns.Add(col);
Marshal.ReleaseComObject(field);
}
}
}
public void ClosePanel()
{
Platform.Instance.CloseView(this);
}
public void ClosePanelInvoke()
{
CloseViewHandler?.Invoke(this, null);
}
public void ShowPanel()
{
Platform.Instance.OpenView(this, false);
}
}
}