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

3324 lines
178 KiB

using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.AE.Enum;
using KGIS.Framework.AE.ExtensionMethod;
using KGIS.Framework.AE.GPHelper;
using KGIS.Framework.DBOperator;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using KGIS.Framework.Utils.ExtensionMethod;
using KGIS.Framework.Utils.Helper;
using Kingo.PluginServiceInterface;
using Kingo.PluginServiceInterface.Helper;
using Kingo.PluginServiceInterface.Model;
using Kingo.RuleCheck;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using UIShell.OSGi;
namespace Kingo.Plugin.General.Helper
{
/// <summary>
/// 单图斑建库处理逻辑
/// </summary>
public partial class DataOperationHelper_Default
{
#region DataCatalog
public IDataCatalogService DataCatalog
{
get
{
return BundleRuntime.Instance.GetFirstOrDefaultService<IDataCatalogService>();
}
}
#endregion
#region 初始化界面
/// <summary>
/// 加载单图斑属性数据
/// </summary>
public virtual ObservableCollection<TreeNode> LoadTreeData()
{
ObservableCollection<TreeNode> DataSource = new ObservableCollection<TreeNode>();
LayerCfg LayerCfg = null;
try
{
TreeNode parentNodes = new TreeNode()
{
Name = $"单图斑任务列表(0个)",
Paixu = 0,
IsExpanded = true,
Icon = "pack://application:,,,/Kingo.Plugin.DTBJK;component/Resources/列表.png",
NodeLevel = 0,
NodeID = Guid.NewGuid().ToString().Replace("-", ""),
Data = null,
IsOpenEdit = true,
ParentButtonVisibility = Visibility.Visible,
Nodes = new ObservableCollection<TreeNode>()
};
#region 单图斑建库任务矢量加载
IDataCatalogService DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IDataCatalogService>();
object LayerCfgobj = DataCatalog.CurrentLayers;
int TCXH = 1;//任务序号
if (LayerCfgobj is LayerCfg)
{
LayerCfg = (LayerCfgobj as LayerCfg).Layers.FirstOrDefault(f => f.LayerName == "监测数据" && f.LayerType == EnumLayerType.GroupLayer);
if (LayerCfg != null)
{
foreach (var LayerCfgitem in LayerCfg.Layers)
{
if (LayerCfgitem.Data is FeatureLayer)
{
IFeatureLayer JCTBFeaLayer = LayerCfgitem.Data as FeatureLayer;
IQueryFilter queryFilter = new QueryFilterClass();
if (JCTBFeaLayer is IFeatureLayerDefinition pFLDefinition)
{
queryFilter.WhereClause = pFLDefinition.DefinitionExpression;
}
var jctbcount = JCTBFeaLayer.FeatureClass.FeatureCount(queryFilter);
if (JCTBFeaLayer == null || JCTBFeaLayer.FeatureClass == null || jctbcount == 0) continue;
TreeNode parentNode = new TreeNode()//图层数据一级(类似任务包一级)
{
Name = $"{LayerCfgitem.LayerName}({jctbcount}个)",
Paixu = TCXH++,
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.DTBJK;component/Resources/数据检查.png",
NodeLevel = 1,
NodeID = Guid.NewGuid().ToString().Replace("-", ""),
Data = LayerCfgitem.Data,
ParentNode = parentNodes,
ParentButtonVisibility = Visibility.Collapsed,
Nodes = new ObservableCollection<TreeNode>(),
LoadingVisibility = Visibility.Collapsed,
OpenPackageVisibility = Visibility.Visible
};
parentNodes.Nodes.Add(parentNode);
}
}
parentNodes.Name = "单图斑任务列表(" + parentNodes.Nodes.Count + "个)";
}
#region 变更范围注释
//if (LayerCfgobj != null)
//{
// LayerCfg = (LayerCfgobj as LayerCfg).Layers.FirstOrDefault(f => f.LayerName == "变更数据" && f.LayerType == EnumLayerType.GroupLayer);
// foreach (var LayerCfgitem in LayerCfg.Layers)
// {
// if (LayerCfgitem.Data is FeatureLayer)
// {
// if (LayerCfgitem.FcName != "DLTBBG") continue;
// IFeatureLayer JCTBFeaLayer = LayerCfgitem.Data as FeatureLayer;
// IQueryFilter queryFilter = new QueryFilterClass();
// if (JCTBFeaLayer is IFeatureLayerDefinition pFLDefinition)
// {
// queryFilter.WhereClause = " SJLY='' OR SJLY is NULL";
// }
// var tbcount = JCTBFeaLayer.FeatureClass.FeatureCount(queryFilter);
// if (JCTBFeaLayer == null || JCTBFeaLayer.FeatureClass == null || tbcount == 0) continue;
// TreeNode parentNode = new TreeNode()
// {
// Name = $"{LayerCfgitem.LayerName}({tbcount}个)",
// Paixu = TCXH++,
// IsExpanded = false,
// Icon = "pack://application:,,,/Kingo.Plugin.DTBJK;component/Resources/数据检查.png",
// NodeLevel = 1,
// NodeID = Guid.NewGuid().ToString().Replace("-", ""),
// Data = LayerCfgitem.Data,
// ParentNode = parentNodes,
// ParentButtonVisibility = Visibility.Collapsed,
// Nodes = new ObservableCollection<TreeNode>(),
// LoadingVisibility = Visibility.Collapsed,
// OpenPackageVisibility = Visibility.Visible
// };
// parentNodes.Nodes.Add(parentNode);
// }
// }
// parentNodes.Name = "单图斑任务列表(" + parentNodes.Nodes.Count + "个)";
//}
#endregion
}
#endregion
#region 单图斑建库任务包加载
SyncPackage(projectInfo.TaskPath);
if (projectInfo.ListTaskPackage != null && projectInfo.ListTaskPackage.Count != 0)
{
List<TaskPackage> lstDelete = new List<TaskPackage>();
foreach (TaskPackage item in projectInfo.ListTaskPackage)
{
if (string.IsNullOrWhiteSpace(item.PackagePath) || !File.Exists(item.PackagePath))
{
lstDelete.Add(item);
continue;
}
string fileName = System.IO.Path.GetFileName(item.PackagePath);
if (item.BID == null || string.IsNullOrWhiteSpace(item.BID.ToString()))
{
item.BID = Guid.NewGuid().ToString().Replace("-", "");
}
TreeNode treeNode = new TreeNode()
{
Name = fileName + "(" + item.TBCount + "个)",
Paixu = TCXH++,
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.DTBJK;component/Resources/数据检查.png",
NodeID = Guid.NewGuid().ToString().Replace("-", ""),
NodeLevel = 1,
Data = item,//可区分任务类型
ParentNode = parentNodes,
LoadingVisibility = Visibility.Collapsed,
OpenPackageVisibility = Visibility.Visible
};
parentNodes.Nodes.Add(treeNode);
}
foreach (var item in lstDelete)
{
projectInfo.ListTaskPackage.Remove(item);
}
parentNodes.Name = "单图斑任务列表(" + parentNodes.Nodes.Count + "个)";
DataSource = new ObservableCollection<TreeNode>();
projectInfo.Save();
}
#endregion
DataSource.Add(parentNodes);
}
catch (Exception ex)
{
LogAPI.Debug(ex);
MessageHelper.ShowError("任务包加载失败:" + ex.Message);
}
TreeDataSource = DataSource;
return DataSource;
}
#endregion
#region 工具栏修改数据后,点击保存时更新任务包数据
/// <summary>
/// 工具栏修改数据后,点击保存时更新任务包数据
/// </summary>
/// <param name="differenceCursorEx"></param>
/// <param name="modifiedClass"></param>
/// <param name="rdbHelper"></param>
/// <param name="type">0:新增 1:修改 2:删除</param>
public virtual void UpdateData(IDifferenceCursorEx differenceCursorEx, IRDBHelper rdbHelper, int type)
{
//准备输入参数
int featureOID = -1;
//新图形
IRow sourceRow = null;
//旧图形
IRow differenceRow = null;
//变化字段
ILongArray longArray = null;
// 获取
differenceCursorEx.Next(out featureOID, out sourceRow, out differenceRow, out longArray);
// 获取编辑图形信息
while (featureOID != -1)
{
int bsmIndex = -1;
string excuteSQL = string.Empty;
try
{
string bsm = string.Empty;
switch (type)
{
case 0://0:新增
AddFeature(sourceRow as IFeature, rdbHelper);
break;
case 1://1:修改
AddFeature(sourceRow as IFeature, rdbHelper);
break;
case 2://2:删除
bsmIndex = differenceRow.Fields.FindField("BSM");
int jcbhIndex = differenceRow.Fields.FindField("JCBH");
int tbbsmIndex = differenceRow.Fields.FindField("TBBSM");
int sjlyIndex = differenceRow.Fields.FindField("SJLY");
string JCBHValue = "";
if (bsmIndex > -1)
{
bsm = differenceRow.get_Value(bsmIndex) as string;
}
if (jcbhIndex != -1)
{
JCBHValue = differenceRow.Value[jcbhIndex].ToString();
}
else if (tbbsmIndex != -1)
{
JCBHValue = differenceRow.Value[tbbsmIndex].ToString();
}
TreeNode treeNode = GetNodeByName(TreeDataSource[0], bsm, new List<int>() { 3 });
if (treeNode != null && treeNode.NodeLevel == 3)
{
TreeNode parNode = treeNode.ParentNode;
if (parNode != null)
{
IsAutoSaveEdit = false;//暂时作为避免再次触发保存
parNode.Nodes.Remove(treeNode);
if (parNode.PackageNode.Name.StartsWith("变更范围"))
{
//变更范围删除图斑更新二级节点信息
}
else if (parNode.Data is DataRow)
{
parNode.Name = (parNode.Data as DataRow)["JCBH"].ToString() + $"({parNode.Nodes.Count})";
}
else if (parNode.Data is WYRWTB)
{
parNode.Name = (parNode.Data as WYRWTB).TBBSM.ToString() + $"({parNode.Nodes.Count})";
excuteSQL = "delete from {0} where bsm='{1}'";
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBDLTBGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBCCWJQGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBCZCDYDGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBDLTBGXGC where BGHTBBSM ='{bsm}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBGFBQGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBLMFWGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBLSYDGX", bsm), CommandType.Text);
//rdbHelper.ExecuteNonQueryWithException($"delete from FJGX where TBBSM ='{bsm}'", CommandType.Text);
//rdbHelper.ExecuteNonQueryWithException($"delete from FJGX where tbbsm not in(select bsm from DTBDLTBGX);", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from PZWJ where bsm not in(select bsm from DTBDLTBGX);", CommandType.Text);
(DtbFeatureLayer.FeatureClass as FeatureClass).Workspace.ExecuteSQL("DELETE FROM TTQGX where BSM = '" + bsm + "'");
}
IsAutoSaveEdit = true;
}
}
treeNode = GetNodeByName(TreeDataSource[0], JCBHValue, new List<int>() { 2 });
if (sjlyIndex != -1 && treeNode != null && treeNode.NodeLevel == 2)
{
//仅仅修改任务图斑中ZZTB类型数据
if (differenceRow.Value[sjlyIndex].ToString() == "ZZTB")
{
rdbHelper.ExecuteNonQueryWithException($"delete from WYRW where JCBH='{JCBHValue}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from dtbdltbgx where TBBSM='{JCBHValue}'", CommandType.Text);
TreeNode parNode = treeNode.ParentNode;
IsAutoSaveEdit = false;//暂时作为避免再次触发保存
parNode.Nodes.Remove(treeNode);
IsAutoSaveEdit = true;
}
else if (!string.IsNullOrWhiteSpace(differenceRow.Value[sjlyIndex].ToString()))
{
if (EngineEditorBG != null)//非新增数据来源数据不保存
{
EngineEditorBG.StopEditing(false);
}
}
//处理删除图斑后,被删除图斑的质检信息未清除问题。
var flagObj = rdbHelper.ExecuteScalar($"select IsDelete from DTBDLTBGX where bsm = '{bsm}'", CommandType.Text);
if (flagObj != null && !string.IsNullOrEmpty(flagObj.ToString()) && flagObj.ToString() == "1")
{
rdbHelper.ExecuteNonQueryWithException($"delete from DTBDLTBGX where BSM ='{bsm}'", CommandType.Text);
}
}
break;
}
}
catch (Exception ex)
{
LogAPI.Debug("UpdateData执行异常:" + ex.Message);
}
differenceCursorEx.Next(out featureOID, out sourceRow, out differenceRow, out longArray);
}
}
#endregion
#region 新增图斑
/// <summary>
/// 新增图斑(单图斑新增与修改合并)
/// </summary>
public virtual void AddFeature(IFeature Newfeature, IRDBHelper rdbHelper)
{
try
{
if (Newfeature == null || Newfeature.Shape == null || Newfeature.Shape.IsEmpty) return;
IFeature featureTBBSM = null;
List<IFeature> features = null;
try
{
object LayerCfgobj = DataCatalog.CurrentLayers;
if (LayerCfgobj is LayerCfg && rdbHelper == null)//矢量数据类型
{
LayerCfg jcsj = (LayerCfgobj as LayerCfg).Layers.FirstOrDefault(f => f.LayerName == "监测数据" && f.LayerType == EnumLayerType.GroupLayer);
if (jcsj == null) return;//获取所有的监测数据图层
string JCBHValue = string.Empty;
foreach (LayerCfg itemCfg in jcsj.Layers)
{
features = FeatureAPI.Identify(Newfeature.ShapeCopy, itemCfg.Data as IFeatureLayer);
if (features != null && features.Count > 0)
{
//如果仅压盖到了一个,则挂接到该外业任务图斑
if (features.Count == 1)
{
featureTBBSM = features[0];
}
else if (features.Count > 1)
{
double _area = -1;
foreach (IFeature item in features)
{
//areaas1 = item.ShapeCopy as IArea;
IGeometry geometry = DtbFeatureLayer.FeatureClass.GetFeature(Newfeature.OID).ShapeCopy;
//此处报错可能是空间参考坐标系不一致
double interArea = FeatureAPI.GetInterArea(geometry, item.ShapeCopy);
if (_area < interArea)
{
_area = interArea;
featureTBBSM = item;
}
}
}
int index = featureTBBSM.Fields.FindField("JCBH");
if (index > -1)
{
object obj = featureTBBSM.get_Value(index);
JCBHValue = obj == null ? "" : obj.ToString();
break;
}
}
}
int tbBSMIndex = Newfeature.Fields.FindField("TBBSM");
int tbbhIndex = Newfeature.Fields.FindField("TBYBH");
int bsmIndex = Newfeature.Fields.FindField("BSM");
int tbmjIndex = Newfeature.Fields.FindField("TBMJ");
int zldwdmIndex = Newfeature.Fields.FindField("ZLDWDM");
int jckzldwdmIndex = JCKFeatureLayer.FeatureClass.Fields.FindField("ZLDWDM");
int qsdwdmIndex = Newfeature.Fields.FindField("QSDWDM");
int jckqsdwdmIndex = JCKFeatureLayer.FeatureClass.Fields.FindField("QSDWDM");
int zldwmcIndex = Newfeature.Fields.FindField("ZLDWMC");
int jckzldwmcIndex = JCKFeatureLayer.FeatureClass.Fields.FindField("ZLDWMC");
int qsdwmcIndex = Newfeature.Fields.FindField("QSDWMC");
int jckqsdwmcIndex = JCKFeatureLayer.FeatureClass.Fields.FindField("QSDWMC");
int qsxzIndex = Newfeature.Fields.FindField("QSXZ");
int jckqsxzIndex = JCKFeatureLayer.FeatureClass.Fields.FindField("QSXZ");
try
{ //继承基础库权属及性质
List<IFeature> featureJCKs = FeatureAPI.Identify2(Newfeature.ShapeCopy, JCKFeatureLayer);
double _area2 = -1;
IFeature featureJCK = null;
foreach (IFeature itemF in featureJCKs)
{
if (featureJCKs.Count == 1)
{
featureJCK = itemF;
}
else
{
//此处报错可能是空间参考坐标系不一致
double interArea = FeatureAPI.GetInterArea(Newfeature.ShapeCopy, itemF.ShapeCopy);
if (_area2 < interArea)
{
_area2 = interArea;
featureJCK = itemF;
}
}
}
if (featureJCK != null && jckqsxzIndex != -1 && jckqsdwmcIndex != -1 && jckqsdwdmIndex != -1)
{
//属性不为空 不继承基础库的属性
if (string.IsNullOrEmpty(Newfeature.Value[qsdwdmIndex].ToTrim()))
Newfeature.Value[qsdwdmIndex] = featureJCK.Value[jckqsdwdmIndex];
if (string.IsNullOrEmpty(Newfeature.Value[qsdwmcIndex].ToTrim()))
Newfeature.Value[qsdwmcIndex] = featureJCK.Value[jckqsdwmcIndex];
if (string.IsNullOrEmpty(Newfeature.Value[zldwmcIndex].ToTrim()))
Newfeature.Value[zldwmcIndex] = featureJCK.Value[jckzldwmcIndex];
if (string.IsNullOrEmpty(Newfeature.Value[zldwdmIndex].ToTrim()))
Newfeature.Value[zldwdmIndex] = featureJCK.Value[jckzldwdmIndex];
if (string.IsNullOrEmpty(Newfeature.Value[qsxzIndex].ToTrim()))
Newfeature.Value[qsxzIndex] = featureJCK.Value[jckqsxzIndex];
}
}
catch (Exception ex)
{
LogAPI.Debug("继承基础库属性异常:" + ex.Message);
}
Newfeature.Value[tbbhIndex] = JCBHValue;//图斑编号
if (featureTBBSM != null)
Newfeature.Value[tbBSMIndex] = featureTBBSM.Value[featureTBBSM.Fields.FindField("TBBSM")].ToString();//图斑标识码
IArea area1 = Newfeature.ShapeCopy as IArea;
Newfeature.Value[tbmjIndex] = Math.Round(area1.Area, 2);//图斑面积
Newfeature.Value[bsmIndex] = Guid.NewGuid().ToTrim().Replace("-", "").Substring(0, 18);
Newfeature.Store();
TreeNode treeNode = GetNodeByName(TreeDataSource[0], JCBHValue.Trim(), new List<int>() { 2 });
if (treeNode == null) return;
//节点修改
if (treeNode.Nodes.FirstOrDefault(x => x.NodeID.ToInt() == Newfeature.OID) == null)
{
TreeNode bgfwNode = new TreeNode()//第四级-变更图斑
{
Name = Newfeature.Value[bsmIndex] as string,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/变更图斑.png",
NodeID = Newfeature.OID,
NodeLevel = 3,
Data = Newfeature,
ParentNode = treeNode,
PackageNode = treeNode.PackageNode,
PackageState = "未完成",//新增图斑默认为“未完成”状态
LoadingVisibility = Visibility.Collapsed
};
treeNode.Nodes.Add(bgfwNode);
treeNode.PackageState = GetNodesJCZT(treeNode);
treeNode.Name = Newfeature.Value[tbbhIndex] + $"({treeNode.Nodes.Count})";
}
else
{
TreeNode node = treeNode.Nodes.FirstOrDefault(x => x.NodeID.ToInt() == Newfeature.OID);
node.NodeID = Newfeature.OID;
node.Data = Newfeature;
node.Name = Newfeature.Value[bsmIndex] as string;
}
//循环判断变更图斑图形是否存在,不存在则删除变更范围节点
if (treeNode.Nodes.Count > 0)
{
List<TreeNode> deleteList = new List<TreeNode>();
foreach (var item in treeNode.Nodes)
{
try
{
DtbFeatureLayer.FeatureClass.GetFeature(item.NodeID.ToInt());
}
catch (Exception ex)
{
LogAPI.Debug("新增节点获取图层失败(不处理):" + ex);
deleteList.Add(item);
}
}
IsAutoSaveEdit = false;//暂时作为避免再次触发保存
foreach (var item in deleteList)
{
treeNode.Nodes.Remove(item);
}
IsAutoSaveEdit = true;
}
}
else if (Newfeature.Class.AliasName == "单图斑地类图斑更新" && rdbHelper != null)//任务包类型数据
{
//获取当前变更图斑对应的外业任务图斑
string BSMValue = string.Empty;
string tblx = string.Empty;
int dlbmIndex = Newfeature.Fields.FindField("TBBSM");//地类编码
if (dlbmIndex > -1)
{
BSMValue = Newfeature.get_Value(dlbmIndex).ToString();
}
if (string.IsNullOrWhiteSpace(BSMValue) && CurrentWYRWTB != null)
{
BSMValue = GetTBBSM(Newfeature, ref tblx);
if (string.IsNullOrWhiteSpace(BSMValue))
BSMValue = CurrentWYRWTB.TBBSM;
}
GenerNewData(Newfeature, rdbHelper, BSMValue);
UpdateKCXS(Newfeature, rdbHelper, BSMValue);
}
else if (Newfeature.Class.AliasName == "外业图斑" && rdbHelper != null)
{
string jcbhValue = string.Empty;
int jcbhIndex = Newfeature.Class.FindField("JCBH");
int sjlyIndex = Newfeature.Class.FindField("SJLY");
if (!Newfeature.Value[sjlyIndex].ToString().Contains("ZZTB") && !string.IsNullOrWhiteSpace(Newfeature.Value[sjlyIndex].ToString()))
{
if (EngineEditorBG != null)
EngineEditorBG.StopEditing(false);
return;//非新增任务图斑修改不保存
}
bool NewJCBH = false;
jcbhValue = Newfeature.Value[jcbhIndex].ToString();
if (string.IsNullOrWhiteSpace(jcbhValue))
{
IJKTBTask GetRWTBDataHelper = new JKTBTaskHelper();
jcbhValue = GetRWTBDataHelper.GetRWTBSEQ(projectInfo.CODE, CurrentTaskPackage.YWLX).ToString();
if (string.IsNullOrWhiteSpace(jcbhValue))
{
MessageHelper.ShowTips("接口获取“JCBH”失败!");
return;
}
NewJCBH = true;
}
#region 分割任务图斑情况
//如果是分割图斑,两个要素jcbhValue是一样的,判断存在多个图斑,则也需要重新赋值jcbhValue
if (!NewJCBH)
{
IQueryFilter queryFilter = new QueryFilterClass()
{
WhereClause = $"JCBH='{jcbhValue}'"
};
ICursor cursor = (Newfeature.Class as ITable).Search(queryFilter, false);
int count = 0;
IRow row = null;
while ((row = cursor.NextRow()) != null)
{
count++;
if (count > 1)
{
IJKTBTask GetRWTBDataHelper = new JKTBTaskHelper();
jcbhValue = GetRWTBDataHelper.GetRWTBSEQ(projectInfo.CODE, CurrentTaskPackage.YWLX).ToString();
if (string.IsNullOrWhiteSpace(jcbhValue))
{
MessageHelper.ShowTips("接口获取“JCBH”失败!");
return;
}
NewJCBH = true;
break;
}
}
}
#endregion
GenerWYTBNewData(Newfeature, rdbHelper, jcbhValue, NewJCBH);
}
}
catch (Exception ex)
{
LogAPI.Debug("新增/修改图斑发生错误:" + ex.Message);
LogAPI.Debug("可能原因为:空间参考不一样所致");
LogAPI.Debug(ex.StackTrace);
}
finally
{
if (features != null)
{
foreach (var item in features)
{
Marshal.ReleaseComObject(item);
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
LogAPI.Debug(ex.StackTrace);
}
}
#endregion
public virtual void UpdateFeatureAttribute(IFeature Newfeature, IRDBHelper rdbHelper)
{
AddFeature(Newfeature, rdbHelper);
}
#region 同步任务目录文件夹任务包文件
/// <summary>
/// 同步任务目录文件夹任务包文件
/// </summary>
/// <param name="dbPath"></param>
/// <returns></returns>
public virtual void SyncPackage(string taskPath)
{
try
{
if (string.IsNullOrWhiteSpace(taskPath) || !Directory.Exists(taskPath))
{
projectInfo.ListTaskPackage = new List<TaskPackage>();
return;
}
if (projectInfo.ListTaskPackage == null)
{
projectInfo.ListTaskPackage = new List<TaskPackage>();
}
DirectoryInfo directory = new DirectoryInfo(System.IO.Path.Combine(taskPath, "未完成"));
string filter = "*.jkrw";
if (Platform.Instance.SystemType == SystemTypeEnum.WYZS)
{
filter = "*.shrw";
}
FileInfo[] files = directory.GetFiles(filter, SearchOption.AllDirectories);
if (files == null || files.Length <= 0)
{
return;
}
foreach (var item in files)
{
IRDBHelper rdbHelper = null;
try
{
TaskPackage taskPackage = projectInfo.ListTaskPackage.FirstOrDefault(x => x.PackagePath.Equals(item.FullName));
if (taskPackage != null && !string.IsNullOrWhiteSpace(taskPackage.PackageTempPath) && System.IO.File.Exists(taskPackage.PackageTempPath))
{
try
{
if (taskPackage.State.Equals("已输出"))
{
File.Delete(item.FullName);
}
}
catch
{
}
rdbHelper = RDBFactory.CreateDbHelper($"{taskPackage.PackageTempPath}{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).Pathpassword}", DatabaseType.SQLite);
FileInfo file = new FileInfo(taskPackage.PackageTempPath);
if (file.IsReadOnly)
{
LogAPI.Debug($"选择的单图斑建库任务包{taskPackage.PackageTempPath}不允许是只读文件!");
throw new Exception("选择的单图斑建库任务包不允许是只读文件!");
}
}
else
{
rdbHelper = RDBFactory.CreateDbHelper($"{item.FullName}{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).Pathpassword}", DatabaseType.SQLite);
FileInfo file = new FileInfo(item.FullName);
if (file.IsReadOnly)
{
LogAPI.Debug($"选择的单图斑建库任务包{item.FullName}不允许是只读文件!");
throw new Exception("选择的单图斑建库任务包不允许是只读文件!");
}
}
if (!rdbHelper.TableIsExist("wyrw"))
{
throw new Exception("选择的单图斑建库任务包不存在外业任务(WYRW)表!");
}
if (!rdbHelper.TableIsExist("YSJ"))
{
throw new Exception("选择的单图斑建库任务包不存在元数据(YSJ)表!");
}
CheckTableExist(rdbHelper);
DataTable dataTable = rdbHelper.ExecuteDatatable("ysj", "select * from ysj", true);
if (dataTable == null || dataTable.Rows.Count <= 0)
{
throw new Exception("选择的单图斑建库任务包元数据(YSJ)表数据为空!");
}
dataTable = rdbHelper.ExecuteDatatable("wyrw", "select ZT,TBBSM from wyrw", true);
if (dataTable == null || dataTable.Rows.Count <= 0)
{
throw new Exception("选择的单图斑建库任务包外业任务表数据为空!");
}
rdbHelper.ExecuteNonQueryWithException("update dtbdltbgx set ddtcbz='一般地类',ddtcmc='一般地类' where ddtcbz is null or ddtcbz=''", CommandType.Text);
foreach (DataRow dataRow in dataTable.Rows)
{
//如果单图斑一条数据都没有,则把外业任务图斑拷贝到DTBDLTBGX表中,作为一个默认的变更范围
long tbCount = (long)rdbHelper.ExecuteScalar($"select count(1) from dtbdltbgx where tbbsm='{dataRow["tbbsm"]}'", CommandType.Text);
if (tbCount <= 0)
{
string sql = $"INSERT INTO dtbdltbgx (BSM,TBBSM,EGeometry,ZXDX,ZXDY,MAXX,MAXY,MINX,MINY,JKRY,DLBM,ZZSXDM,TBXHDM,DDTCBZ,GDLX,TBMJ,YDYHFL,BZ) SELECT '{Guid.NewGuid().ToString().Replace("-", "")}' as BSM,A.TBBSM,A.EGeometry,A.ZXDX,A.ZXDY,A.MAXX,A.MAXY,A.MINX,A.MINY,'{projectInfo.UserName}' as JKRY,(case when length(b.HCBGDL)>4 then substr(b.HCBGDL,0,5) else B.HCBGDL end) as HCBGDL,B.ZZSX,B.TBXHSX,(case when length(replace(B.DDTCXX,' ',''))<4 then '一般地类' else replace(B.DDTCXX,' ','') end) as DDTCBZ,B.GDLX,(A.TBMJ*666.67) AS TBMJ,b.YDYHFL AS YDYHFL,b.XJBZ AS XJBZ FROM WYRW A LEFT JOIN WYHCCG B ON A.TBBSM = B.HCRWBSM where tbbsm = '{dataRow["tbbsm"]}' LIMIT 1;";
rdbHelper.ExecuteNonQueryWithException(sql, CommandType.Text);
}
}
if (taskPackage == null)
{
projectInfo.ListTaskPackage.Add(
new TaskPackage()
{
BID = Guid.NewGuid().ToString().Replace("-", ""),
YWLX = UserLoginHelper.GetAppsetingValueByKey("JkTaskDBYWLX"),
PackagePath = item.FullName,
State = "未完成",
TBCount = $"({dataTable.Select("ZT=''").Length}/{dataTable.Rows.Count})"
});
}
else
{
taskPackage.TBCount = $"({dataTable.Select("ZT=''").Length}/{dataTable.Rows.Count})";
}
}
catch (Exception ex)
{
LogAPI.Debug(item + "无法添加:" + ex.Message);
LogAPI.Debug(item + "无法添加:" + ex.StackTrace);
MessageHelper.ShowTips(item + "无法添加:" + ex.Message);
}
finally
{
if (rdbHelper != null)
{
rdbHelper.DisConnect();
rdbHelper = null;
}
}
}
projectInfo.Save();
}
catch (Exception ex)
{
LogAPI.Debug(ex);
throw ex;
}
}
#endregion
#region 验证包表结构是否都存在
/// <summary>
/// 验证包表结构是否都存在
/// </summary>
public virtual void CheckTableExist(IRDBHelper rdbHelper)
{
try
{
string excuteSQL = @"CREATE TABLE if not exists FJGX (
BSM INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
WYTBBSM TEXT NOT NULL,
FJARG TEXT NOT NULL,
TBBSM TEXT NOT NULL);
CREATE TABLE if not exists DTBDLTBGXGC (
BSM INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
TBBSM TEXT,
BGXW TEXT,
XZQTZLX INTEGER,
TBBGMJ NUMERIC,
BGQBSM TEXT,
BGQTBBH TEXT,
BGQDLBM TEXT,
BGQDLMC TEXT,
BGQQSXZ TEXT,
BGQQSDWDM TEXT,
BGQQSDWMC TEXT,
BGQZLDWDM TEXT,
BGQZLDWMC TEXT,
BGQKCDLBM TEXT,
BGQKCXS NUMERIC,
BGQKCMJ NUMERIC,
BGQTBDLMJ NUMERIC,
BGQGDLX TEXT,
BGQGDPDJB TEXT,
BGQXZDWKD NUMERIC,
BGQTBXHDM TEXT,
BGQTBXHMC TEXT,
BGQZZSXDM TEXT,
BGQZZSXMC TEXT,
BGQGDDB TEXT,
BGQFRDBS TEXT,
BGQCZCSXM TEXT,
BGQMSSM TEXT,
BGQHDMC TEXT,
BGHTBBSM TEXT,
BGHTBBH TEXT,
BGHDLBM TEXT,
BGHDLMC TEXT,
BGHQSXZ TEXT,
BGHQSDWDM TEXT,
BGHQSDWMC TEXT,
BGHZLDWDM TEXT,
BGHZLDWMC TEXT,
BGHKCDLBM TEXT,
BGHKCXS NUMERIC,
BGHKCMJ NUMERIC,
BGHTBDLMJ NUMERIC,
BGHGDLX TEXT,
BGHGDPDJB NUMERIC,
BGHXZDWKD NUMERIC,
BGHTBXHDM TEXT,
BGHTBXHMC TEXT,
BGHZZSXDM TEXT,
BGHZZSXMC TEXT,
BGHGDDB INTEGER,
BGHFRDBS TEXT,
BGHCZCSXM TEXT,
BGHMSSM INTEGER,
BGHHDMC INTEGER,
EGeometry TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists DTBDLTBGX (
BSM TEXT NOT NULL PRIMARY KEY,
TBBSM TEXT,
YSDM TEXT,
TBYBH TEXT,
TBBH TEXT,
DLBM TEXT,
DLMC TEXT,
QSXZ TEXT,
QSDWDM TEXT,
QSDWMC TEXT,
ZLDWDM TEXT,
ZLDWMC TEXT,
TBMJ NUMERIC,
KCDLBM TEXT,
KCXS NUMERIC,
KCMJ NUMERIC,
TBDLMJ NUMERIC,
GDLX TEXT,
GDPDJB TEXT,
XZDWKD NUMERIC,
TBXHDM TEXT,
TBXHMC TEXT,
ZZSXDM TEXT,
ZZSXMC TEXT,
GDDB INTEGER,
FRDBS TEXT,
CZCSXM TEXT,
SJNF INTEGER,
MSSM TEXT,
HDMC TEXT,
BZ TEXT,
GXSJ TEXT,
TBLX TEXT,
DDTCBZ TEXT,
DDTCMC TEXT,
SFGX TEXT,
WBGYY TEXT,
SFJZ TEXT,
QKSM TEXT,
NBWQKSM TEXT,
SHLZQKSM TEXT,
LJLX TEXT,
DCJL TEXT,
YWTBSM TEXT,
EGeometry TEXT,
ZXDX NUMERIC,
ZXDY NUMERIC,
MAXX NUMERIC,
MAXY NUMERIC,
MINX NUMERIC,
MINY NUMERIC,
JKRY TEXT,
LNGDZB TEXT,
SFXML TEXT,
XMLX TEXT,
XMMC TEXT,
XMBH TEXT,
CZCTBBH TEXT,
LC TEXT,
NF TEXT
);
CREATE TABLE if not exists DTBCCWJQGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
ZDMJ NUMERIC,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists DTBGFBQGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
XMMC TEXT,
XMGM TEXT,
QYMJ NUMERIC,
PZYDSJ TEXT,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists DTBLSYDGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
GLTBBSM TEXT,
PZWJMC TEXT,
PZWH TEXT,
TBMJ NUMERIC,
PZMJ NUMERIC,
YTFL TEXT,
JTXMYT TEXT,
PZRQ TEXT,
YQSX TEXT,
TDSYHT TEXT,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists PZWJ (
BSM TEXT NOT NULL,
Name TEXT,
Path TEXT,
Extension TEXT,
FileContent BLOB
);
CREATE TABLE if not exists DTBTTQGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
TTQMJ NUMERIC,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists DTBCZCDYDGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
CZCLX TEXT,
CZCDM TEXT,
CZCMC TEXT,
CZCMJ NUMERIC,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists DTBLMFWGX (
BSM TEXT NOT NULL,
DDTCBZ TEXT,
DDTCMC TEXT,
YSDM TEXT,
ZLDWDM TEXT,
KD NUMERIC,
MJ NUMERIC,
DLBM TEXT,
MC TEXT,
BZ TEXT,
GXSJ TEXT
);
CREATE TABLE if not exists CheckResult(
XH INTEGER NOT NULL,
RuleCode TEXT,
CheckObject TEXT,
TBBSM TEXT,
ErrorType TEXT,
ErrorId TEXT,
ErrorTip TEXT,
RuleName TEXT,
RuleContent TEXT,
GeometryType INTEGER,
Geometry TEXT
);
CREATE TABLE if not exists WYRWTB_VOICE (
BSM INTEGER PRIMARY KEY NOT NULL,
TBBSM TEXT NOT NULL,
YWLX TEXT NOT NULL,
VOICE BLOB
)";
rdbHelper.ExecuteNonQueryWithException(excuteSQL, CommandType.Text);
//WYHRFJ外业核查附件表增加用户是否标记删除字段
DataTable dataTable = rdbHelper.ExecuteDatatable("wyhcfj", "select * from WYHCFJ where 1=2", true);
if (dataTable != null && !dataTable.Columns.Contains("UserDelete"))
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE WYHCFJ ADD 'UserDelete' INTEGER;");
//增加字段后,默认都为0:非删除状态,1是删除状态,删除状态的不展示该附件
rdbHelper.ExecuteNonQueryWithException("UPDATE WYHCFJ SET UserDelete=0;");
}
//单独图层添加列
#region 单独图层添加列
List<string> fields = new List<string>() { "DDTCBZ", "DDTCMC" };
List<string> tables = new List<string>() { "DTBCCWJQGX", "DTBGFBQGX", "DTBLSYDGX", "DTBTTQGX", "DTBCZCDYDGX", "DTBLMFWGX", "DTBDLTBGX" };
foreach (string table in tables)
{
dataTable = rdbHelper.ExecuteDatatable(table, $"select * from '{table}' where 1=2", true);
foreach (string field in fields)
{
if (dataTable != null && !dataTable.Columns.Contains(field))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE '{table}' ADD '{field}' TEXT;");
}
}
}
#endregion
#region 省级审核标注 SJSHBZ
List<string> SJSHBZfields = new List<string>() { "TBZT", "UserID", "BzRole" };
dataTable = rdbHelper.ExecuteDatatable("SJSHBZ", $"select * from SJSHBZ where 1=2", true);
foreach (string field in SJSHBZfields)
{
if (dataTable != null && !dataTable.Columns.Contains(field))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE SJSHBZ ADD '{field}' TEXT;");
}
}
#endregion
#region 省级反馈结果 ReturnComments
List<string> ReturnCommentsfields = new List<string>() { "JLDLHCJG", "JLDLHCSM", "JLSXHCJG", "JLSXHCSM", "JLTXHCJG", "JLTXHCSM", "JLSHSM", "JLBZ", "JLSHRY", "JLSHSJ" };
dataTable = rdbHelper.ExecuteDatatable("ReturnComments", $"select * from ReturnComments where 1=2", true);
foreach (string field in ReturnCommentsfields)
{
if (dataTable != null && !dataTable.Columns.Contains(field))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE ReturnComments ADD '{field}' TEXT;");
}
}
#endregion
//DTBDLTBGX表增加LNGDZB历年耕地占比字段
dataTable = rdbHelper.ExecuteDatatable("dtbdltbgx", "select * from dtbdltbgx where 1=2", true);
List<string> lstStringField = null;
List<string> lstIntField = null;
if (dataTable != null)
{
lstStringField = new List<string>() { "LNGDZB", "SDMSSM", "YDYHFL", "ZGQKSM", "SFXML", "XMLX", "XMMC", "XMBH", "DKMC", "CZCTBBH", "LC", "NF", "LJBZ", "JZYBH", "LJTBBH", "IsDelete", "ZZZW", "SZLX", "LYZZZW", "LXJZGLBH" };
foreach (var item in lstStringField)
{
if (!dataTable.Columns.Contains(item))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE dtbdltbgx ADD '{item}' TEXT;");
}
}
if (!dataTable.Columns.Contains("XZDWKD"))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE dtbdltbgx ADD 'XZDWKD' NUMERIC;");
}
}
rdbHelper.ExecuteNonQueryWithException("UPDATE dtbdltbgx SET SFXML='0' where SFXML is null or SFXML =''");
dataTable = rdbHelper.ExecuteDatatable("fjgx", "select * from fjgx where 1=2", true);
if (dataTable != null && !dataTable.Columns.Contains("WYTBBSM"))
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE fjgx ADD 'WYTBBSM' TEXT;");
}
//国家反馈意见添加照片合理性字段
dataTable = rdbHelper.ExecuteDatatable("GJFKJG", "select * from GJFKJG where 1=2", true);
if (dataTable != null && !dataTable.Columns.Contains("ZPHLX"))
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE GJFKJG ADD 'ZPHLX' TEXT;");
}
//WYRW表增加外业备注和状态字段
dataTable = rdbHelper.ExecuteDatatable("WYRW", "select * from WYRW where 1=2", true);
if (dataTable != null)
{
lstStringField = new List<string>() { "ZT", "WYBZ" };//"CheckR"
foreach (var item in lstStringField)
{
if (!dataTable.Columns.Contains(item))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE WYRW ADD '{item}' TEXT;");
}
}
rdbHelper.ExecuteNonQueryWithException("UPDATE WYRW SET ZT='未完成' where zt is null or zt =''");
lstIntField = new List<string>() { "FWY", "XBTB", "SFSB", "GJDLBM" };
foreach (var item in lstIntField)
{
if (item == "SFSB")
{
if (!dataTable.Columns.Contains(item))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE WYRW ADD '{item}' NUMERIC;");
}
//continue;
}
else
{
if (!dataTable.Columns.Contains(item))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE WYRW ADD '{item}' TEXT;");
}
}
}
}
dataTable = rdbHelper.ExecuteDatatable("CheckResult", "select * from CheckResult where 1=2", true);
if (dataTable != null)
{
lstStringField = new List<string>() { "TBBSM", "Geometry" };
foreach (var item in lstStringField)
{
if (!dataTable.Columns.Contains(item))
{
rdbHelper.ExecuteNonQueryWithException($"ALTER TABLE CheckResult ADD '{item}' TEXT;");
}
}
if (!dataTable.Columns.Contains("GeometryType"))
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE CheckResult ADD 'GeometryType' INTEGER;");
}
}
//DTBDLTBGXGC表增加图形字段EGeometry
dataTable = rdbHelper.ExecuteDatatable("DTBDLTBGXGC", "select * from DTBDLTBGXGC where 1=2", true);
if (dataTable != null)
{
if (!dataTable.Columns.Contains("EGeometry"))
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE DTBDLTBGXGC ADD 'EGeometry' TEXT;");
}
DataTable dt = rdbHelper.ExecuteDatatable("DTBDLTBGXGC", "pragma table_info ('DTBDLTBGXGC')", true);
int pk = Convert.ToInt32(dt.Rows[0]["pk"].ToString()); //判断bsm字段pk列是否为1,name即为列名
if (pk != 1)
{
rdbHelper.ExecuteNonQueryWithException("ALTER TABLE DTBDLTBGXGC RENAME TO DTBDLTBGXGC_Copy");
string sql = @"CREATE TABLE DTBDLTBGXGC(
BSM INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
TBBSM TEXT,
BGXW TEXT,
XZQTZLX INTEGER,
TBBGMJ NUMERIC,
BGQBSM TEXT,
BGQTBBH TEXT,
BGQDLBM TEXT,
BGQDLMC TEXT,
BGQQSXZ TEXT,
BGQQSDWDM TEXT,
BGQQSDWMC TEXT,
BGQZLDWDM TEXT,
BGQZLDWMC TEXT,
BGQKCDLBM TEXT,
BGQKCXS NUMERIC,
BGQKCMJ NUMERIC,
BGQTBDLMJ NUMERIC,
BGQGDLX TEXT,
BGQGDPDJB TEXT,
BGQXZDWKD NUMERIC,
BGQTBXHDM TEXT,
BGQTBXHMC TEXT,
BGQZZSXDM TEXT,
BGQZZSXMC TEXT,
BGQGDDB TEXT,
BGQFRDBS TEXT,
BGQCZCSXM TEXT,
BGQMSSM TEXT,
BGQHDMC TEXT,
BGHTBBSM TEXT,
BGHTBBH TEXT,
BGHDLBM TEXT,
BGHDLMC TEXT,
BGHQSXZ TEXT,
BGHQSDWDM TEXT,
BGHQSDWMC TEXT,
BGHZLDWDM TEXT,
BGHZLDWMC TEXT,
BGHKCDLBM TEXT,
BGHKCXS NUMERIC,
BGHKCMJ NUMERIC,
BGHTBDLMJ NUMERIC,
BGHGDLX TEXT,
BGHGDPDJB NUMERIC,
BGHXZDWKD NUMERIC,
BGHTBXHDM TEXT,
BGHTBXHMC TEXT,
BGHZZSXDM TEXT,
BGHZZSXMC TEXT,
BGHGDDB INTEGER,
BGHFRDBS TEXT,
BGHCZCSXM TEXT,
BGHMSSM INTEGER,
BGHHDMC INTEGER,
EGeometry TEXT,
GXSJ TEXT
)";
rdbHelper.ExecuteNonQueryWithException(sql, CommandType.Text);
string coloum = "BSM,TBBSM,BGXW, XZQTZLX, TBBGMJ, BGQBSM, BGQTBBH, BGQDLBM, BGQDLMC, BGQQSXZ, BGQQSDWDM, BGQQSDWMC, BGQZLDWDM, BGQZLDWMC, BGQKCDLBM, BGQKCXS, BGQKCMJ, BGQTBDLMJ, BGQGDLX, BGQGDPDJB, BGQXZDWKD, BGQTBXHDM, BGQTBXHMC, BGQZZSXDM, BGQZZSXMC, BGQGDDB, BGQFRDBS, BGQCZCSXM, BGQMSSM, BGQHDMC,EGeometry,BGHTBBSM, BGHTBBH, BGHDLBM, BGHDLMC, BGHQSXZ, BGHQSDWDM, BGHQSDWMC, BGHZLDWDM, BGHZLDWMC, BGHKCDLBM, BGHKCXS, BGHKCMJ, BGHTBDLMJ, BGHGDLX, BGHGDPDJB, BGHXZDWKD, BGHTBXHDM, BGHTBXHMC, BGHZZSXDM, BGHZZSXMC, BGHGDDB, BGHFRDBS, BGHCZCSXM, BGHMSSM, BGHHDMC,GXSJ";
rdbHelper.ExecuteNonQueryWithException(string.Format("INSERT INTO DTBDLTBGXGC({0}) SELECT {0} FROM DTBDLTBGXGC_Copy", coloum));
rdbHelper.ExecuteNonQueryWithException("DROP TABLE DTBDLTBGXGC_Copy");
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
LogAPI.Debug("新建初始化任务表、外业指导草图表异常:" + ex);
}
}
#endregion
#region 关闭任务包
/// <summary>
/// 单图斑建库/单图斑质检---关闭任务包
/// </summary>
/// <param name="CurrentSelectNode"></param>
public virtual void ClosePackage(TreeNode CurrentSelectNode)
{
IWorkspaceAPI workspaceAPI = null;
IWorkspaceAPI workspaceSchemeAPI = null;
try
{
#region 矢量数据关闭
if (CurrentSelectNode.Data is IFeatureLayer)
{
CurrentSelectNode.IsExpanded = false;
CurrentSelectNode.Nodes.Clear();
CurrentSelectNode.OpenPackageVisibility = Visibility.Visible;
return;
}
#endregion
#region 任务包关闭
#endregion
#region 任务包关闭
if (!(CurrentSelectNode.Data is TaskPackage taskPackage)) return;
if (taskPackage != null && !File.Exists(taskPackage.PackagePath))
{
CurrentSelectNode.Nodes.Clear();
CurrentSelectNode.OpenPackageVisibility = Visibility.Visible;
LogAPI.Debug("单图斑打开任务包过程中未找到任务包:" + taskPackage.PackagePath);
return;
}
else if (File.Exists(taskPackage.PackageTempPath))
{
workspaceAPI = new WorkspaceAPI(taskPackage.GDBPath, WorkspaceTypeEnum.GDBFile, true);
string excuteSQL = "DELETE FROM {0} where bid = '" + taskPackage.BID + "'";
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "WYCTPoint"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "WYCTLine"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "WYCTPolygon"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "MarkPoint"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "MarkLine"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "MarkPolygon"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "SJSHPoint"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "SJSHLine"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "SJSHPolygon"));
workspaceAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "WYRW"));
workspaceSchemeAPI = new WorkspaceAPI(taskPackage.SchemeGDBPath, WorkspaceTypeEnum.GDBFile, true);
excuteSQL = "DELETE FROM {0} where bid = '" + taskPackage.BID + "'";
workspaceSchemeAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "DLTBBG"));
workspaceSchemeAPI.CurrentWorkspace.ExecuteSQL(string.Format(excuteSQL, "TTQGX"));
CurrentSelectNode.Nodes.Clear();
this.hookHelper.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewBackground | esriViewDrawPhase.esriViewGeoSelection, null, this.hookHelper.ActiveView.Extent);
CurrentSelectNode.OpenPackageVisibility = Visibility.Visible;
if (EngineEditorBG.EditState == esriEngineEditState.esriEngineStateEditing)
EngineEditorBG.StopEditing(true);
}
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("关闭任务包-重置数据异常:" + ex.Message);
LogAPI.Debug("关闭任务包-重置数据异常:" + ex.StackTrace);
MessageHelper.ShowError("关闭任务包-重置数据异常:" + ex.Message);
}
finally
{
if (workspaceSchemeAPI != null)
workspaceSchemeAPI.CloseWorkspace();
if (workspaceAPI != null)
workspaceAPI.CloseWorkspace();
}
}
#endregion
#region 加载矢量数据树结构
/// <summary>
/// 加载矢量数据树结构
/// </summary>
/// <param name="parentNode"></param>
public void LoadSLDataTreeNode(TreeNode parentNode)
{
IQueryFilter queryFilter = new QueryFilterClass();
try
{
#region 监测图斑
if (parentNode.Data as IFeatureLayer is IFeatureLayerDefinition pFLDefinition)
{
queryFilter.WhereClause = pFLDefinition.DefinitionExpression;
}
DataTable dataJCTB = AECommonHelper.GetTableByFeatureClass((parentNode.Data as IFeatureLayer).FeatureClass, queryFilter);
DataTable dataDtbBGFW = AECommonHelper.GetTableByFeatureClass(DtbFeatureLayer.FeatureClass);
if (dataDtbBGFW == null || dataJCTB.Rows.Count <= 0) return;
foreach (DataRow item in dataJCTB.Rows)
{
string jcbh = item["JCBH"] as string;
//第三级-监测图斑数据
TreeNode jctbNode = new TreeNode()
{
Name = jcbh + "(0)",
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.DTBJK;component/Resources/监测图斑.png",
Data = item,
NodeLevel = 2,
NodeID = item[(parentNode.Data as IFeatureLayer).FeatureClass.OIDFieldName],
ParentNode = parentNode,
PackageNode = parentNode,//监测图层一级节点
PackageState = "未完成",
cMenu = new ContextMenu()
};
DataRow[] dataRows = dataDtbBGFW.Select($"TBYBH='{jcbh}'");
if (dataRows != null && dataRows.Length > 0)
{
foreach (DataRow row in dataRows)
{
TreeNode bgfwNode = new TreeNode()//第四级-变更图斑
{
Name = row["BSM"] as string,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/变更图斑.png",
NodeID = row[DtbFeatureLayer.FeatureClass.OIDFieldName],
NodeLevel = 3,
Data = DtbFeatureLayer.FeatureClass.GetFeature(Convert.ToInt32(row[DtbFeatureLayer.FeatureClass.OIDFieldName])),
ParentNode = jctbNode,
PackageNode = parentNode//监测图层一级节点
};
bgfwNode.PackageState = row["JCZT"].ToString() ?? "未完成";
jctbNode.Nodes.Add(bgfwNode);
}
}
else
{
InitBGDataByJCSJ(jctbNode);//打开任务包加载数据时
jctbNode.PackageState = GetNodesJCZT(jctbNode);
}
jctbNode.Name = $"{jcbh}({jctbNode.Nodes.Count})";
jctbNode.PackageState = GetNodesJCZT(jctbNode);
parentNode.Nodes.Add(jctbNode);
}
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("加载矢量数据树节点失败:" + ex.Message);
LogAPI.Debug("加载矢量数据树节点失败:" + ex.StackTrace);
throw ex;
}
finally
{
if (queryFilter != null)
Marshal.ReleaseComObject(queryFilter);
MapsManager.Instance.MapService.getAxMapControl().Refresh();
}
}
#endregion
#region 初始化图斑
/// <summary>
/// 初始化图斑
/// </summary>
/// <param name="sender"></param>
/// <param name="IsDirectoverlay">是否直接初始化</param>
public virtual void InitBGDataByJCSJ(TreeNode treeNode, bool IsDirectoverlay = false)
{
IRDBHelper rdbHelper = null;
IFeatureCursor cursor = null;
IFeature feature = null;
IQueryFilter queryFilter = null;
IFeature wyFeature = null;
try
{
if (treeNode.Data is DataRow)//初始化矢量数据图斑
{
if (treeNode.Nodes.Count > 0)
{
System.Windows.Forms.DialogResult dialogResult = MessageHelper.ShowYesNoAndTips("是否覆盖已有变更范围?");
if (dialogResult != System.Windows.Forms.DialogResult.Yes)
{
return;
}
}
FeatureClass featureClass = DtbFeatureLayer.FeatureClass as FeatureClass;
featureClass.Workspace.ExecuteSQL(string.Format("DELETE FROM DLTBBG where tbbsm='{0}'", (treeNode.Data as DataRow)["TBBSM"].ToString()));
treeNode.Nodes.Clear();//初始化变更图斑
IFeature JCfeature = (treeNode.ParentNode.Data as IFeatureLayer).FeatureClass.GetFeature(treeNode.NodeID.ToString().ToInt());
IFeatureCursor BGcursor = DtbFeatureLayer.FeatureClass.Insert(true);
IFeatureBuffer BGbuffer = DtbFeatureLayer.FeatureClass.CreateFeatureBuffer();
BGbuffer.Shape = JCfeature.ShapeCopy;
IFields fields = JCfeature.Fields;//JC
for (int i = 0; i < fields.FieldCount; i++)
{
IField field = fields.get_Field(i);
if (BGbuffer.Fields.FindField(field.Name) != -1 && field.Name.ToUpper() == "SFJZ")
{
BGbuffer.Value[BGbuffer.Fields.FindField(field.Name)] = "0";//当前仅为“SFJZ”为不可为空情况
}
else if (BGbuffer.Fields.FindField(field.Name) != -1 && field.Editable == true && field.Name.ToUpper() != "SHAPE_AREA")
{
BGbuffer.Value[BGbuffer.Fields.FindField(field.Name)] = JCfeature.Value[i];
}
}
BGbuffer.Value[BGbuffer.Fields.FindField("TBBH")] = "";
//陕西需求
BGbuffer.Value[BGbuffer.Fields.FindField("TBYBH")] = JCfeature.Value[JCfeature.Fields.FindField("JCBH")].ToString();
IArea area1 = JCfeature.ShapeCopy as IArea;
BGbuffer.Value[BGbuffer.Fields.FindField("TBMJ")] = Math.Round(area1.Area, 2);//图斑面积
if (BGbuffer.Fields.FindField("GLTC") > -1)
BGbuffer.Value[BGbuffer.Fields.FindField("GLTC")] = ((IDataset)JCfeature.Class).Name;//关联图层
BGbuffer.Value[BGbuffer.Fields.FindField("BSM")] = Guid.NewGuid().ToTrim().Replace("-", "").Substring(0, 18);
object OIDXZ = BGcursor.InsertFeature(BGbuffer);
BGcursor.Flush();
IFeature DTBBgF = DtbFeatureLayer.FeatureClass.GetFeature(Convert.ToInt32(OIDXZ));
TreeNode bgfwNode = new TreeNode()//第四级-变更图斑
{
Name = BGbuffer.Value[BGbuffer.Fields.FindField("BSM")] as string,
Paixu = 1,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/变更图斑.png",
NodeID = OIDXZ,
NodeLevel = 3,
Data = DTBBgF,
ParentNode = treeNode,
PackageNode = treeNode.ParentNode,//图层一级
PackageState = "未完成"
};
treeNode.Nodes.Add(bgfwNode);
treeNode.Name = JCfeature.Value[JCfeature.Fields.FindField("JCBH")] + $"({treeNode.Nodes.Count})";
if (BGcursor != null)
Marshal.ReleaseComObject(BGcursor);
if (BGbuffer != null)
Marshal.ReleaseComObject(BGbuffer);
if (JCfeature != null)
Marshal.ReleaseComObject(JCfeature);
}
else if (treeNode.Data is WYRWTB) //初始化任务包数据图斑
{
if (treeNode.Nodes.Count > 0 && !IsDirectoverlay)
{
System.Windows.Forms.DialogResult dialogResult = MessageHelper.ShowYesNoAndTips("是否覆盖已有变更范围?");
if (dialogResult != System.Windows.Forms.DialogResult.Yes)
{
return;//不覆盖当前图斑则不进行图斑初始化
}
treeNode.Nodes.Clear();//初始化变更图斑
treeNode.Name = (treeNode.Data as WYRWTB).TBBSM + $"({treeNode.Nodes.Count})";
}
else//IsDirectoverlay 是否直接初始化
{
treeNode.Nodes.Clear();//初始化变更图斑
}
#region 删除当前外业任务图斑下的变更图斑
//首先获取到当前外业图斑
wyFeature = WyrwFeatureLayer.FeatureClass.GetFeature(int.Parse(treeNode.NodeID.ToString()));
if (wyFeature == null || wyFeature.Shape.IsEmpty)
{
MessageHelper.Show("外业任务图斑图形为空:" + treeNode.NodeID.ToString());
return;
}
queryFilter = new QueryFilterClass()
{
WhereClause = $"TBBSM='{(treeNode.Data as WYRWTB).TBBSM}'"
};
StartEdit(DtbFeatureLayer);
EngineEditorBG.StartOperation();
cursor = DtbFeatureLayer.FeatureClass.Search(queryFilter, false);
while ((feature = cursor.NextFeature()) != null)
{
feature.Delete();
}
#endregion
//新增外业任务图斑
IFeature newFeature = DtbFeatureLayer.FeatureClass.CreateFeature();
newFeature.Shape = wyFeature.ShapeCopy;
newFeature.set_Value(newFeature.Fields.FindField("BSM"), Guid.NewGuid().ToString().Replace("-", ""));
newFeature.set_Value(newFeature.Fields.FindField("TBBSM"), (treeNode.Data as WYRWTB).TBBSM);
rdbHelper = RDBFactory.CreateDbHelper($"{(treeNode.ParentNode.Data as TaskPackage).PackageTempPath}{(MapsManager.Instance.CurrProjectInfo as ProjectInfo).Pathpassword}", DatabaseType.SQLite);
if (rdbHelper != null)
{
//恢复已删除的外业照片
rdbHelper.BeginTransaction();
rdbHelper.ExecuteNonQueryWithException($"update wyhcfj set UserDelete=0 WHERE HCJLBSM='{(treeNode.Data as WYRWTB).TBBSM}'", CommandType.Text);
//继承外业属性字段
DataTable dataTable = rdbHelper.ExecuteDatatable("data", $"select HCBGDL as DLBM,WBGYY,ZZSX AS ZZSXDM,TBXHSX AS TBXHDM,(case when length(replace(ddtcxx,' ',''))< 4 then '一般地类' else replace(ddtcxx,' ','') end) AS DDTCBZ,GDLX,cast(XZDLKD as numeric) AS XZDWKD from wyhccg where hcrwbsm='{(treeNode.Data as WYRWTB).TBBSM}'", true);
if (dataTable != null && dataTable.Rows.Count > 0)
{
foreach (DataColumn item in dataTable.Columns)
{
int fieldIndex = newFeature.Fields.FindField(item.ColumnName);
if (fieldIndex > -1)
{
newFeature.set_Value(fieldIndex, dataTable.Rows[0][item.ColumnName]);
}
}
}
}
newFeature.Store();
if (rdbHelper != null)
{
rdbHelper.Commit();
rdbHelper.DisConnect();
}
EngineEditorBG.StopOperation("初始化任务包变更图斑");
SaveEingineEdit();
EngineEditorBG.StopEditing(true);
MapsManager.Instance.MapService.getAxMapControl().CurrentTool = null;
}
}
catch (Exception ex)
{
LogAPI.Debug("初始化图斑变量" + ex.Message);
if (EngineEditorBG != null)
EngineEditorBG.AbortOperation();
MessageHelper.ShowError("初始化图斑变量" + ex.Message);
}
finally
{
if (rdbHelper != null)
rdbHelper.DisConnect();
if (cursor != null)
Marshal.ReleaseComObject(cursor);
if (wyFeature != null)
Marshal.ReleaseComObject(wyFeature);
}
}
#endregion
#region 获取监测图斑的修改状态
/// <summary>
/// 获取监测图斑的修改状态
/// </summary>
/// <param name="JCtreeNode"></param>
/// <returns></returns>
public string GetNodesJCZT(TreeNode JCtreeNode)
{
if (JCtreeNode.Nodes.Count != 0)
{
if (JCtreeNode.Nodes.FirstOrDefault(x => x.PackageState == "质检错误") != null)
{
return "质检错误";
}
else if (JCtreeNode.Nodes.FirstOrDefault(x => x.PackageState == "未完成") != null)
{
return "未完成";
}
else if (JCtreeNode.Nodes.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.PackageState)) != null)
{
return "未完成";
}
else
{
return "已完成";
}
}
else
{
return "未完成";
}
}
#endregion
#region 加载任务包
/// <summary>
/// 加载任务包
/// </summary>
/// <param name="treeNode">任务包节点</param>
public virtual void LoadDBToTreeNode(TreeNode treeNode)
{
try
{
TaskPackage taskPackage = treeNode.Data as TaskPackage;
if (string.IsNullOrWhiteSpace(taskPackage.PackagePath) || !File.Exists(taskPackage.PackagePath))
throw new Exception("任务包源文件已删除,无法打开!");
PluginServiceInterface.CommonHelper.UpdateAppsettingValueByKey("JkTaskDBName", $"{projectInfo.TaskPath}\\临时\\{taskPackage.PackageName}\\{taskPackage.PackageName.Replace("encrypt.", "")}", "UserLoginConfig");
Dictionary<WYRWTB, List<DTBDLTBGX>> dicTBInfo = new DTBDBLoadHelper().DBTaskLoad(treeNode.Data as TaskPackage, this.hookHelper);
if (dicTBInfo != null && dicTBInfo.Count > 0)
{
int i = 0;
foreach (var item in dicTBInfo)
{
//外业任务图斑
TreeNode treeWYRWNode = new TreeNode()
{
Name = item.Key.TBBSM + "(0)",
Paixu = i++,
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/未星标.png",
Data = item.Key,
NodeLevel = 2,
NodeID = item.Key.ObjectID,
ParentNode = treeNode,
PackageNode = treeNode,
PackageState = item.Key.ZT,
cMenu = new ContextMenu()
};
if (item.Key.XBTB == 1)
{
treeWYRWNode.Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/星标.png";
}
int j = 0;
if (item.Value != null)
{
foreach (var bgfw in item.Value)
{
TreeNode treeWYTBNode = new TreeNode()
{
Name = bgfw.BSM,
Paixu = j++,
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/变更图斑.png",
NodeID = bgfw.ObjectID,
NodeLevel = 3,
Data = bgfw,
ParentNode = treeWYRWNode,
PackageNode = treeNode//任务包对应节点
};
treeWYRWNode.Nodes.Add(treeWYTBNode);
}
}
treeWYRWNode.Name = item.Key.TBBSM + "(" + treeWYRWNode.Nodes.Count + ")";
treeNode.Nodes.Add(treeWYRWNode);
}
}
}
catch (Exception ex)
{
LogAPI.Debug("LoadDBToTreeNode异常:" + ex.Message);
LogAPI.Debug("LoadDBToTreeNode异常:" + ex.StackTrace);
throw ex;
}
}
#endregion
#region SelectedItemChanged
public virtual NYYSInfo SelectedItemChanged(TreeNode CurrentSelectNode, ref List<RuleEntity> ruleEntities)
{
NYYSInfo nYYSInfo = new NYYSInfo();
try
{
if (CurrentSelectNode.NodeLevel == 3)
{
StartEdit(DtbFeatureLayer);
(DtbFeatureLayer as IFeatureSelection).Clear();
if (CurrentSelectNode.NodeID == null)
return nYYSInfo;
if (CurrentSelectNode.Data is DTBDLTBGX && CurrentSelectNode.ParentNode.Data is WYRWTB)
{
nYYSInfo.DTBDLTBGX = CurrentSelectNode.Data as DTBDLTBGX;
nYYSInfo.WYRWTB = CurrentSelectNode.ParentNode.Data as WYRWTB;
nYYSInfo.TaskPackages = CurrentSelectNode.ParentNode.ParentNode.Data as TaskPackage;
nYYSInfo.BingDataType = PluginServiceInterface.Enums.DTBDataTypeEnum.DTBJK;
try
{
MapsManager.Instance.MapService.SelectFeature("DLTBBG", CurrentSelectNode.NodeID.ToString(), true);
}
catch (Exception)
{ }
LoadCheckResult();
return nYYSInfo;
}
else if (CurrentSelectNode.ParentNode.Data is DataRow)
{
try
{
//切换节点,定位当前变更图斑
int OID = CurrentSelectNode.NodeID.ToString().ToInt();
IFeature BGF = DtbFeatureLayer.FeatureClass.GetFeature(OID);
if (BGF != null)
{
CurrentSelectNode.Data = BGF;
//string BSMValue = BGF.Value[DtbFeatureLayer.FeatureClass.FindField("BSM")].ToString();
TreeNode BGtreeNode = CurrentSelectNode;// GetNodeByName(TreeDataSource[0], BSMValue, new List<int>() { 3 });
if (BGtreeNode != null)
{
BGtreeNode.LoadingVisibility = Visibility.Visible;
MapsManager.Instance.MapService.ClearFeatureSelection(hookHelper.Hook as IMapControlDefault);
MapsManager.Instance.MapService.SelectFeature("DLTBBG", BGF.OID.ToString(), true);
BGtreeNode.LoadingVisibility = Visibility.Collapsed;
ruleEntities = RuleCheck.XJRuleCheck.RuleCheckOpertion_DTB.StartXJSHCheck(BGF, null);
if (ruleEntities != null)
BGtreeNode.PackageState = ruleEntities.Count > 0 ? "质检错误" : "已完成";
CurrentSelectNode.ParentNode.PackageState = GetNodesJCZT(CurrentSelectNode.ParentNode);
return SetIVariantArrayData(BGtreeNode);
}
}
}
catch (Exception ex)
{ //若是该操作失败,移除当前节点
CurrentSelectNode.ParentNode.Nodes.Remove(CurrentSelectNode);
LogAPI.Debug("移除当前节点失败:" + ex.Message);
}
return nYYSInfo;
}
}
else if (CurrentSelectNode.NodeLevel == 2)
{
StopEditForDTBJK(EngineEditorBG);
if (WyrwFeatureLayer != null)
(WyrwFeatureLayer as IFeatureSelection).Clear();
if (DtbFeatureLayer != null)
(DtbFeatureLayer as IFeatureSelection).Clear();
if (CurrentSelectNode.Data is WYRWTB)
{
if (CurrentSelectNode.Nodes.Count != 0)
nYYSInfo.DTBDLTBGX = CurrentSelectNode.Nodes[0].Data as DTBDLTBGX;
nYYSInfo.WYRWTB = CurrentSelectNode.Data as WYRWTB;
nYYSInfo.TaskPackages = CurrentSelectNode.ParentNode.Data as TaskPackage;
nYYSInfo.BingDataType = PluginServiceInterface.Enums.DTBDataTypeEnum.DTBJK;
MapsManager.Instance.MapService.SelectFeature("WYRW", (CurrentSelectNode.Data as WYRWTB).ObjectID.ToString(), true);
if (CurrentSelectNode.Nodes.Count >= 1)
LoadCheckResult();
return nYYSInfo;
}
else if (CurrentSelectNode.Nodes.Count != 0 && CurrentSelectNode.Data != null && CurrentSelectNode.Data is DataRow)
{
CurrentSelectNode.LoadingVisibility = Visibility.Visible;
//System.Windows.Forms.Application.DoEvents();
try
{
IFeature JCF = (CurrentSelectNode.ParentNode.Data as IFeatureLayer).FeatureClass.GetFeature(CurrentSelectNode.NodeID.ToString().ToInt());
string JCTCName = ((IDataset)JCF.Class).Name;
if (!string.IsNullOrWhiteSpace(JCTCName))
MapsManager.Instance.MapService.SelectFeature(JCTCName, JCF.OID.ToString(), true);
}
catch (Exception)
{ }
CurrentSelectNode.LoadingVisibility = Visibility.Collapsed;
return SetIVariantArrayData(CurrentSelectNode);
}
}
else if (CurrentSelectNode.NodeLevel == 1)
{
if (CurrentSelectNode.Nodes.Count > 0)
StartEdit(WyrwFeatureLayer);//开启任务图斑图层编辑
//单图斑任务包一级
if (CurrentSelectNode.Data as TaskPackage == null) return nYYSInfo;
if (CurrentSelectNode.Nodes == null || CurrentSelectNode.Nodes.Count == 0) return nYYSInfo;
}
else if (CurrentSelectNode.NodeLevel == 0)
{
EngineEditorBG.StopEditing(false);//第一级仅关闭不保存
MapsManager.Instance.MapService.getAxMapControl().ActiveView.Refresh();
//StopEditForDTBJK(EngineEditorBG);
}
else if (CurrentTaskPackage != null)//避免加载任务包时,报错!
{
//应对任务图斑新增
PluginServiceInterface.CommonHelper.ExeCommandOperation("执行结束编辑");
}
}
catch (Exception ex)
{
LogAPI.Debug("选择节点SelectedItemChanged异常:" + ex.Message);
LogAPI.Debug("选择节点SelectedItemChanged异常:" + ex.StackTrace);
throw ex;
}
return nYYSInfo;
}
#endregion
#region MyRegion
/// <summary>
/// 设置单图斑矢量数据绑定信息
/// </summary>
/// <param name="treeNode">变更图斑对应的末级树节点</param>
/// <returns></returns>
private NYYSInfo SetIVariantArrayData(TreeNode treeNode)
{
NYYSInfo arrays = new NYYSInfo();
IFeatureLayer JCTBFL = null;
try
{
if (treeNode == null) return null;
int JCOID = -1;
if (treeNode.Data is IFeature)
{
DTBDLTBGX dTBDLTBGX = new DTBDLTBGX()
{
BSM = (treeNode.Data as IFeature).Value[DtbFeatureLayer.FeatureClass.FindField("BSM")].ToString() ?? "",
TBBSM = (treeNode.Data as IFeature).Value[DtbFeatureLayer.FeatureClass.FindField("TBBSM")].ToString() ?? "",
ObjectID = (treeNode.Data as IFeature).OID
};
arrays.DTBDLTBGX = dTBDLTBGX;// 把单图斑矢量变更图斑封装为DTBDLTBGX
JCOID = treeNode.ParentNode.NodeID.ToString().ToInt();
}
else if (treeNode.Data is DataRow)
{
JCOID = treeNode.NodeID.ToString().ToInt();
}
else
{
return null;
}
if (treeNode.ParentNode != null && treeNode.PackageNode.Data is IFeatureLayer && JCOID != -1)
{
try
{
JCTBFL = treeNode.PackageNode.Data as IFeatureLayer;
if (JCTBFL == null || JCTBFL.FeatureClass == null) return null;
IFeature JCfeature = JCTBFL.FeatureClass.GetFeature(JCOID);
if (JCfeature != null)
{
WYRWTB wYRWTB = new WYRWTB()
{
ObjectID = JCfeature.OID,
TBBSM = JCTBFL.FeatureClass.FindField("JCBH") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("JCBH")].ToString() : "",
XZQDM = JCTBFL.FeatureClass.FindField("XZQDM") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("XZQDM")].ToString() : "",
XZDM = JCTBFL.FeatureClass.FindField("XZDM") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("XZDM")].ToString() : "",
JCBH = JCTBFL.FeatureClass.FindField("JCBH") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("JCBH")].ToString() : "",
TBLX = JCTBFL.FeatureClass.FindField("TBLX") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("TBLX")].ToString() : "",
SJLY = JCTBFL.FeatureClass.FindField("SJLY") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("SJLY")].ToString() : "",
JCMJ = JCTBFL.FeatureClass.FindField("JCMJ") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("JCMJ")].ToDecimal() : 0,
TBMJ = JCTBFL.FeatureClass.FindField("TBMJ") != -1 ? JCfeature.Value[JCTBFL.FeatureClass.FindField("TBMJ")].ToDecimal() : 0
};
arrays.WYRWTB = wYRWTB;// 把单图斑矢量监测图斑封装为WYRWTB
}
else
{
return null;
}
}
catch (Exception ex)
{
LogAPI.Debug("把单图斑矢量监测图斑封装为WYRWTB失败:" + ex.Message);
return null;
}
}
else
{
return null;
}
// 获取要素类的实际名称
string featureClassName = ((IDataset)JCTBFL.FeatureClass).Name;
arrays.JCTBFeatureClassName = featureClassName;// 当前为对应的监测图层实际名称(英文名称)
arrays.BingDataType = PluginServiceInterface.Enums.DTBDataTypeEnum.DTBSL;
//Marshal.ReleaseComObject(JCTBFL);
}
catch (Exception ex)
{
LogAPI.Debug("设置单图斑矢量数据绑定信息" + ex.Message);
}
return arrays;
}
#endregion
#region MyRegion
/// <summary>
/// 根据树结构展示名为条件查询某一节点
/// </summary>
/// <param name="treeNode"></param>
/// <param name="name"></param>
/// <param name="nodeLevel"></param>
/// <param name="nodeID"></param>
/// <returns></returns>
public TreeNode GetNodeByName(TreeNode treeNode, string name, List<int> nodeLevel, string nodeID = null)
{
try
{
if (treeNode != null && nodeLevel.Contains(treeNode.NodeLevel))
{
if (!string.IsNullOrWhiteSpace(nodeID))//获取图斑节点
{
if (treeNode.Name.StartsWith(name) && treeNode.ParentNode != null && treeNode.ParentNode.NodeID.ToString().Equals(nodeID))
{
return treeNode;
}
}
else if (!string.IsNullOrWhiteSpace(name) && treeNode.Name.StartsWith(name))
{
return treeNode;
}
}
if (treeNode.Nodes != null && treeNode.Nodes.Count > 0)
{
foreach (var item in treeNode.Nodes)
{
TreeNode node = GetNodeByName(item, name, nodeLevel, nodeID);
if (node != null)
{
return node;
}
}
}
return null;
}
catch (Exception ex)
{
LogAPI.Debug("GetNodeByName执行失败(特殊情况不处理):" + ex.Message);
return null;
}
}
/// <summary>
/// 根据树名称为条件查询某一节点
/// </summary>
/// <param name="treeNode">树节点</param>
/// <param name="name">树节点展示名</param>
/// <param name="nodeLevel">数层级</param>
/// <param name="nodeID">数ID</param>
/// <returns></returns>
private TreeNode GetNodeByName(TreeNode treeNode, string name, int nodeLevel, string nodeID = null)
{
try
{
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(treeNode);
while (queue.Count > 0)
{
TreeNode node = queue.Dequeue();
if (node.Name == name)
{
return node;
}
foreach (TreeNode child in node.Nodes)
{
queue.Enqueue(child);
}
}
return null;
}
catch (Exception ex)
{
LogAPI.Debug("GetNodeByName执行异常:" + ex.Message);
return null;
}
}
#endregion
#region MyRegion
/// <summary>
/// 获取图斑标识码
/// </summary>
/// <param name="geometry3"></param>
/// <param name="tblx"></param>
/// <returns></returns>
private string GetTBBSM(IFeature geometry3, ref string tblx)
{
IFeature featureTBBSM = null;
List<IFeature> features = null;
try
{
IGeometry geometry = geometry3.ShapeCopy;
features = FeatureAPI.Identify2(geometry, WyrwFeatureLayer);
string tbbsm = string.Empty;
if (features != null && features.Count > 0)
{
//如果仅压盖到了一个,则挂接到该外业任务图斑
if (features.Count == 1)
{
featureTBBSM = features[0];
}
else //如果压盖到多个,则挂接到压盖面积大的外业任务图斑上
{
double _area = -1;
foreach (var item in features)
{
geometry = DtbFeatureLayer.FeatureClass.GetFeature(geometry3.OID).ShapeCopy;
double interArea = FeatureAPI.GetInterArea(geometry, item.ShapeCopy);
if (_area < interArea)
{
_area = interArea;
featureTBBSM = item;
}
}
}
int index = featureTBBSM.Fields.FindField("TBBSM");
if (index > -1)
{
object obj = featureTBBSM.get_Value(index);
tbbsm = obj == null ? "" : obj.ToString();
}
index = featureTBBSM.Fields.FindField("TBLX");
if (index > -1)
{
object obj = featureTBBSM.get_Value(index);
tblx = obj == null ? "" : obj.ToString();
}
if (string.IsNullOrWhiteSpace(tbbsm))
{
throw new Exception("图斑与外业任务图斑数据不重叠!");
}
return tbbsm;
}
else//如果未压盖到外业任务图斑,则去压盖单图斑地类图斑更新层,和压盖到的单图斑地类图斑层一样挂接到对应的外业任务图斑
{
if (DtbFeatureLayer == null)
DtbFeatureLayer = MapsManager.Instance.MapService.GetFeatureLayerByName("DLTBBG");
features = FeatureAPI.Identify(geometry, DtbFeatureLayer);
if (features == null || features.Count == 0)
{
throw new Exception("图斑与外业任务图斑数据不重叠!");
}
//如果仅压盖到了一个,则挂接到该变更范围挂接的外业任务图斑
if (features.Count > 0)
{
featureTBBSM = features[0];
}//如果压盖到多个,则挂接到压盖面积大的外业任务图斑上
else
{
throw new Exception("图斑与外业任务图斑数据不重叠!");
}
int index = featureTBBSM.Fields.FindField("TBBSM");
if (index > -1)
{
object obj = featureTBBSM.get_Value(index);
tbbsm = obj == null ? "" : obj.ToString();
}
index = featureTBBSM.Fields.FindField("TBLX");
if (index > -1)
{
object obj = featureTBBSM.get_Value(index);
tblx = obj == null ? "" : obj.ToString();
}
if (string.IsNullOrWhiteSpace(tbbsm))
{
throw new Exception("图斑与外业任务图斑数据不重叠!");
}
return tbbsm;
}
}
catch (Exception ex)
{
LogAPI.Debug(ex);
return "";
}
finally
{
if (features != null)
{
foreach (var item in features)
{
Marshal.ReleaseComObject(item);
}
}
}
}
#endregion
#region GenerNewData
public void GenerNewData(IFeature Newfeature, IRDBHelper rdbHelper, string tbbsm)
{
IFeature feature = null;
IGeometry convertGeometry = null;
IClone clone = null;
ICursor cursor = null;
IRow row = null;
try
{
string bsm = string.Empty;
int bsmIndex = Newfeature.Fields.FindField("BSM");
if (bsmIndex > -1)
{
bsm = Newfeature.get_Value(bsmIndex) as string;
}
Guid guidBSM;
//如果没值,则赋值新的GUID
if (string.IsNullOrWhiteSpace(bsm) || !Guid.TryParse(bsm, out guidBSM))
{
bsm = Guid.NewGuid().ToString().Replace("-", "");
Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "UpdateFJGX", Content = bsm, Extend = rdbHelper });
}
else
{
//如果是分割图斑,两个要素bsm是一样的,判断存在多个BSM图斑,则也需要重新赋值BSM
IQueryFilter queryFilter = new QueryFilterClass()
{
WhereClause = $"bsm='{bsm}'"
};
cursor = (Newfeature.Class as ITable).Search(queryFilter, false);
int count = 0;
while ((row = cursor.NextRow()) != null)
{
count++;
if (count > 1)
{
bsm = Guid.NewGuid().ToString().Replace("-", "");
break;
}
}
}
#region 防止存在多部件图形,但另一部分又是空的图形
IGeometryCollection geometryCollection = Newfeature.ShapeCopy as IGeometryCollection;
if (geometryCollection.GeometryCount > 1)
{
for (int i = 0; i < geometryCollection.GeometryCount; i++)
{
IGeometry geometry = geometryCollection.Geometry[i];
if (!(geometry is IArea areaSub) || Math.Abs(areaSub.Area) == 0)
{
geometryCollection.RemoveGeometries(i, 1);
}
}
Newfeature.Shape = geometryCollection as IGeometry;
}
#endregion
#region 设置图形属性
//计算椭球面积
clone = Newfeature.ShapeCopy as IClone;
double tqmj = (clone.Clone() as IPolygon).GetEllipseArea();
//获取图形json坐标串
clone = Newfeature.ShapeCopy as IClone;
IGeometry cloneGeometry = clone.Clone() as IGeometry;
string egeometry = GeometryConvertHelper.ConverIGometryToJson(cloneGeometry);
//此处是为了验证转换后的json坐标串是否可以转换回去,如果转换并投影后图形为空,说明转换后的坐标串egeometry不正确
convertGeometry = GeometryConvertHelper.ConverJsonToIGeoemtry(egeometry);
if (convertGeometry == null)
{
LogAPI.Debug(egeometry);
throw new Exception("图形转换后的Json坐标串无法转回图形!");
}
convertGeometry.Project(this.hookHelper.FocusMap.SpatialReference);
if (convertGeometry == null || convertGeometry.IsEmpty)
{
LogAPI.Debug(egeometry);
throw new Exception("图形转换的Json坐标串坐标参考不正确,请尝试重启软件!");
}
//获取图形四至、中心点坐标
IArea area = cloneGeometry as IArea;
string fields = "BSM,TBBSM,EGeometry,TBMJ,TBDLMJ,ZXDX,ZXDY,MAXX,MAXY,MINX,MINY,JKRY,TBLX,LNGDZB";
string fieldValues = $"'{bsm}','{tbbsm}','{egeometry}',{tqmj},{tqmj},{area.Centroid.X},{area.Centroid.Y},{cloneGeometry.Envelope.XMax},{cloneGeometry.Envelope.YMax},{cloneGeometry.Envelope.XMin},{cloneGeometry.Envelope.YMin},'{projectInfo.UserName}','{"0"}'";
#region 更新要素字段信息
int tempDDTCBZIndex = Newfeature.Fields.FindField("DDTCBZ");
string tempDDTCBZ = null;
if (tempDDTCBZIndex > -1)
tempDDTCBZ = Newfeature.get_Value(tempDDTCBZIndex).ToString();
int tempDLBMIndex = Newfeature.Fields.FindField("DLBM");
string tempDLBM = null;
if (tempDLBMIndex > -1)
tempDLBM = Newfeature.get_Value(tempDLBMIndex).ToString();
//图层信息选择单独图层的,除路面范围,默认地类直接继承基础库原地类
if (!string.IsNullOrEmpty(tempDDTCBZ) && tempDDTCBZ != "一般地类" && !tempDDTCBZ.Equals("1305", StringComparison.CurrentCultureIgnoreCase) && string.IsNullOrEmpty(tempDLBM))
{
ILayer layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("基础_地类图斑");
if (layer != null)
{
List<IFeature> JCfeatures = FeatureAPI.Identify2(Newfeature.ShapeCopy, layer);
if (JCfeatures != null && JCfeatures.Count > 0)
{
int jcdlbmIndex = JCfeatures[0].Fields.FindField("DLBM");
if (jcdlbmIndex > -1)
{
tempDLBM = JCfeatures[0].get_Value(jcdlbmIndex).ToString();
Newfeature.set_Value(tempDLBMIndex, tempDLBM);
}
}
}
}
int fIndex = Newfeature.Fields.FindField("bsm");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, bsm);
}
fIndex = Newfeature.Fields.FindField("egeometry");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, egeometry);
}
fIndex = Newfeature.Fields.FindField("tbbsm");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, tbbsm);
}
fIndex = Newfeature.Fields.FindField("BID");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, CurrentTaskPackage.BID);
}
fIndex = Newfeature.Fields.FindField("TBMJ");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, tqmj);
}
fIndex = Newfeature.Fields.FindField("TBDLMJ");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, tqmj);
}
fIndex = Newfeature.Fields.FindField("ZXDX");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, area.Centroid.X);
}
fIndex = Newfeature.Fields.FindField("ZXDY");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, area.Centroid.Y);
}
fIndex = Newfeature.Fields.FindField("MAXX");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, cloneGeometry.Envelope.XMax);
}
fIndex = Newfeature.Fields.FindField("MAXY");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, cloneGeometry.Envelope.YMax);
}
fIndex = Newfeature.Fields.FindField("MINX");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, cloneGeometry.Envelope.XMin);
}
fIndex = Newfeature.Fields.FindField("MINY");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, cloneGeometry.Envelope.YMin);
}
fIndex = Newfeature.Fields.FindField("JKRY");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, projectInfo.UserName);
}
string zzsxdm = null;
fIndex = Newfeature.Fields.FindField("ZZSXDM");
if (fIndex > -1)
{
zzsxdm = Newfeature.get_Value(fIndex).ToString();
if (!string.IsNullOrEmpty(tempDDTCBZ) && !string.IsNullOrEmpty(tempDLBM) && "1301,1302,1303,1304".Contains(tempDDTCBZ) && "0101,0102,0103".Contains(tempDLBM))
{
if (string.IsNullOrEmpty(zzsxdm))
{
zzsxdm = "WG";
Newfeature.set_Value(fIndex, "WG");
}
}
}
fIndex = Newfeature.Fields.FindField("ZZSXMC");
if (fIndex > -1)
{
//种植属性名称
string zzsxmc = string.Empty;
DataDicTionary dataDicTionary = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.ZZSX).FirstOrDefault(x => x.CODE.Equals(zzsxdm));
if (dataDicTionary != null)
{
zzsxmc = dataDicTionary.NAME;
}
Newfeature.set_Value(fIndex, zzsxmc);
}
#region 计算变更范围与历年耕地图层的相交面积
double lngdArea = 0;
//shape_area图形面积
IArea area1 = Newfeature.ShapeCopy as IArea;
double jcmj = Math.Round(area1.Area, 2);
string lngdzb = Math.Round((lngdArea / jcmj) * 100, 2) + "%";
fIndex = Newfeature.Fields.FindField("LNGDZB");
if (fIndex > -1)
{
Newfeature.set_Value(fIndex, lngdzb);
}
fieldValues += $",'{lngdzb}'";
#endregion
#endregion
Newfeature.Store();
#endregion
//删除库中已存在的数据
rdbHelper.ExecuteNonQueryWithException($"delete from dtbdltbgx where bsm='{bsm}'", CommandType.Text);
string excuteSQL = string.Format("insert into dtbdltbgx({0})values({1})", fields, fieldValues);
rdbHelper.ExecuteNonQueryWithException(excuteSQL, CommandType.Text);
//保存其他属性字段和独立图层信息表
SaveBGFWAndDLTC(tbbsm, bsm, rdbHelper, Newfeature);
//保存更新过程数据
DTBDBLoadHelper.SaveGXGCData(bsm, tbbsm, Newfeature, rdbHelper, this.hookHelper);//同步保存
object dlbmOBJ = Newfeature.get_Value(Newfeature.Fields.FindField("DLBM"));
string dlbm = dlbmOBJ == null ? "" : dlbmOBJ.ToString();
//自动填充是否更新和是否举证字段
ValidationField(bsm, Newfeature, rdbHelper, dlbm, tqmj);
#region 同步更新树结构数据
TreeNode treeNode = GetNodeByName(TreeDataSource[0], tbbsm, new List<int>() { 2 });
if (treeNode != null && treeNode.NodeLevel == 2)
{
if (treeNode.Nodes == null)
{
treeNode.Nodes = new ObservableCollection<TreeNode>();
}
List<TreeNode> lsttree = treeNode.Nodes.Where(x => x.NodeID.Equals(Newfeature.OID)).ToList();
TreeNode addNode = null;
if (lsttree.Count() <= 0)
{
DataTable dataTable = rdbHelper.ExecuteDatatable("data", $"select * from dtbdltbgx where bsm='{bsm}'", true);
addNode = new TreeNode()
{
Name = bsm,
Paixu = treeNode.Nodes.Count + 10,
IsExpanded = false,
Icon = "pack://application:,,,/Kingo.Plugin.General;component/Resources/变更图斑.png",
NodeLevel = 3,
Data = KGIS.Framework.Utils.Utility.TBToList.ConvertEntity<DTBDLTBGX>(dataTable.Rows[0]),
cMenu = null,
PackageNode = treeNode.PackageNode,
ParentNode = treeNode,
NodeID = Newfeature.OID
};
(addNode.Data as DTBDLTBGX).ObjectID = Newfeature.OID;//补充OID值
treeNode.Name = tbbsm + "(" + (treeNode.Nodes.Count + 1) + ")";
treeNode.Nodes.Add(addNode);
}
else
{
addNode = lsttree[0];
}
addNode.Name = bsm;
//循环判断变更图斑图形是否存在,不存在则删除变更范围节点
if (treeNode.Nodes.Count > 0)
{
List<TreeNode> deleteList = new List<TreeNode>();
foreach (var item in treeNode.Nodes)
{
try
{
DtbFeatureLayer.FeatureClass.GetFeature((int)item.NodeID);
}
catch
{
deleteList.Add(item);
}
}
foreach (var item in deleteList)
{
treeNode.Nodes.Remove(item);
}
}
//更新节点数量
treeNode.Name = tbbsm + "(" + (treeNode.Nodes.Count) + ")";
}
#endregion
SyncDBData(Newfeature.Class as IFeatureClass, rdbHelper, tbbsm);
}
catch (Exception ex)
{
LogAPI.Debug("新增或修改单图斑变更范围失败:" + ex.Message);
LogAPI.Debug("新增或修改单图斑变更范围失败:" + ex.StackTrace);
LogAPI.Debug("新增或修改单图斑变更范围失败:" + ex);
throw ex;
}
finally
{
if (row != null)
Marshal.ReleaseComObject(row);
if (cursor != null)
Marshal.ReleaseComObject(cursor);
if (clone != null)
Marshal.ReleaseComObject(clone);
if (convertGeometry != null)
Marshal.ReleaseComObject(convertGeometry);
if (feature != null)
Marshal.ReleaseComObject(feature);
}
}
#endregion
#region 验证字段填写是否正确
/// <summary>
/// 验证字段填写是否正确
/// </summary>
private void ValidationField(string bsm, IFeature feature, IRDBHelper rdbHelper, string dlbm, double tbmj)
{
/*
* 单图斑建库软件:“是否更新”“未变更原因”“是否举证”“情况说明”“类举类型”部分情况需软件自动填写及控制。具体如下:
(1)“是否更新”“是否举证”字段不允许地方填写,由系统依据相关情况自动填写。
(2)“是否更新”字段需系统自动填写,不允许县级进行编辑。填写规则为:
①对于绘制单图斑的地类编码、种植属性代码、图斑细化代码与单图斑叠加到的基础库图斑的地类编码、种植属性代码、图斑细化代码进行对比,三个属性完全一致的部分认定为“未变化部分”,若“未变化部分之和”占单图斑面积比例≥90%,“是否更新”系统自动填写为“否”。(特殊的:单图斑为0404A、1001A、1002A、1003A、1004A默认与基础库0404、1001、1002、1003、1004相同)
②除①条件外的其他图斑,认定为“变化图斑”,在“是否更新”属性自动填写为单图斑填写的地类编码(单图斑地类为0404A、1001A、1002A、1003A、1004A的分别填写为0404、1001、1002、1003、1004)。
(3)“未变更原因”字段需系统进行部分控制,当“是否更新”不为“否”的,“未变更原因”字段直接灰掉,不允许地方进行填写编辑。但“是否更新”为“否”时,“未变更原因”字段需由地方填写,且不得小于10个字符,否则保存时,定位到“未变更原因”字段红框提示。
(4)“是否举证”字段需系统进行控制,不允许县级进行编辑。填写规则为:
①当“类举类型”为“承诺举证”“军事用地”“类举举证个”“实地无法到达”“图斑不够上图面积”“影像支持”时,“是否举证”直接填入“类举类型”字段;
②除①以外,单图斑存在实地举证照片时,“是否举证”直接填入“实地举证”;
③除①和②以外的,未挂接照片的单图斑,“是否举证”直接填入“否”。
(5)“情况说明”字段需系统进行部分控制,当“是否举证”不为“否”的,“情况说明”字段可填写也可不填写,若填写则不得低于5个字符。当“是否举证”为“否”时,“情况说明”字段需由地方填写,且不得小于10个字符,否则保存时,定位到“情况说明”字段红框提示。
*/
try
{
string sfgx = string.Empty;
double mj = 0;
int checkFieldIndex = -1;
//if (SysConfigsOprator.GetAppsetingValueByKey("ArearName").Equals("44"))
//{
#region (1)“是否更新”“是否举证”字段不允许地方填写,由系统依据相关情况自动填写。(3)“未变更原因”字段需系统进行部分控制
if (dlbm == "8801")
sfgx = "未变更";
else
{
ILayer layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("基础_地类图斑");
Dictionary<IGeometry, IFeature> listFeatures = DBLoadHelper.IdentifyReturnIntersect(feature.ShapeCopy, layer);
foreach (var item in listFeatures)
{
IFeature itemFeature = item.Value;
checkFieldIndex = itemFeature.Fields.FindField("dlbm");
if (checkFieldIndex > -1)
{
string DLBM = itemFeature.get_Value(checkFieldIndex).ToString();
if (dlbm == DLBM)
continue;
mj += (item.Key as IPolygon).GetEllipseArea();
}
}
}
if (mj / tbmj > 0.9)
sfgx = "整图斑变更";
if (mj / tbmj > 0.1 && mj / tbmj < 0.9)
sfgx = "部分变更";
if (mj / tbmj < 0.1)
sfgx = "未变更";
checkFieldIndex = feature.Fields.FindField("sfgx");
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set sfgx='{sfgx}' where bsm='{bsm}'", CommandType.Text);
if (checkFieldIndex > -1)
{
feature.set_Value(checkFieldIndex, sfgx);
}
#endregion
#region (4)“是否举证”字段需系统进行控制,不允许县级进行编辑
//记录“是否举证”字段是否满足“类举类型”
//“是否举证”字段值是否为“否”,是则等于true
//2023.11.28 山西需求 不需要系统填写“是否举证”字段
if (!SysConfigsOprator.GetAppsetingValueByKey("ArearName").Equals("14"))
{
bool isValidation = false;
int sfjzIndex = feature.Fields.FindField("SFJZ");
if (sfjzIndex > -1)
{
checkFieldIndex = feature.Fields.FindField("LJLX");
if (checkFieldIndex > -1)
{
//①当“类举类型”为“承诺举证”“军事用地”“类举举证个”“实地无法到达”“图斑不够上图面积”“影像支持”时,“是否举证”直接填入“类举类型”字段;
object ljlx = feature.get_Value(checkFieldIndex);
List<string> checkValueList = new List<string>() { "承诺举证", "军事用地", "类举举证个", "实地无法到达", "图斑不够上图面积", "影像支持" };
if (!(ljlx is DBNull))
{
if (checkValueList.Contains(ljlx.ToString()))
{
feature.set_Value(sfjzIndex, "类举类型");
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set SFJZ='类举类型' where bsm='{bsm}'", CommandType.Text);
isValidation = true;
}
}
}
if (!isValidation)
{
int index = feature.Fields.FindField("images");
if (index > -1)
{
object ljlx = feature.get_Value(index);
if (ljlx != null && !(ljlx is DBNull))
{
feature.set_Value(sfjzIndex, "实地举证");
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set SFJZ='实地举证' where bsm='{bsm}' and (select count(0) from FJGX WHERE TBBSM ='{bsm}')>0 ", CommandType.Text);
}
}
}
}
}
feature.Store();
#endregion
}
catch (Exception ex)
{
LogAPI.Debug("验证字段填写是否正确验证失败:" + ex);
throw ex;
}
}
#endregion
#region 保存单图斑和独立图层数据
/// <summary>
/// 保存单图斑和独立图层数据
/// </summary>
/// <param name="BSM"></param>
/// <param name="rdbHelper"></param>
/// <param name="feature"></param>
public virtual void SaveBGFWAndDLTC(string tbbsm, string BSM, IRDBHelper rdbHelper, IFeature feature)
{
try
{
ILayer layer = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("基础_地类图斑");
ILayer layerPodu = MapsManager.Instance.MapService.GetFeatureLayerByLayerName("基础_省级下发坡度图");
if (string.IsNullOrWhiteSpace(tbbsm) || string.IsNullOrWhiteSpace(BSM))
return;//图斑标识码和标识码不可为空
//判定DTBDLTBGX表中是否有XZGDFJ列 没有则添加
DataTable dataTableDTBDLTB = rdbHelper.ExecuteDatatable("DTBDLTBGX", "select * from DTBDLTBGX", true);
if (dataTableDTBDLTB != null)
{
if (!dataTableDTBDLTB.Columns.Contains("XZGDFJ"))
{
rdbHelper.ExecuteSQL(@"ALTER TABLE DTBDLTBGX ADD COLUMN XZGDFJ text(200);");
}
}
string xzqdm = tbbsm.Substring(0, 6);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBLSYDGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBGFBQGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBTTQGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBCCWJQGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBCZCDYDGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from DTBLMFWGX where bsm='{BSM}'", CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from PZWJ where bsm='{BSM}'", CommandType.Text);
//rdbHelper.ExecuteNonQueryWithException(string.Format("delete from fjgx where tbbsm='{0}'", BSM), CommandType.Text);
string excuteSQL = "UPDATE DTBDLTBGX SET {0} WHERE BSM='{1}'";
List<string> listField = new List<string>() { "TBBSM", "TBYBH", "DLBM", "KCDLBM", "QSXZ", "QSDWDM", "QSDWMC", "ZLDWDM", "ZLDWMC", "GDLX", "XZDWKD", "TBXHDM", "ZZSXDM", "TBXHMC", "GDDB", "CZCSXM", "SJNF", "FRDBS", "MSSM", "EGeometry", "DDTCBZ", "DDTCMC", "SFGX", "WBGYY1", "WBGYY", "SFJZ", "QKSM", "LJLX", "YWTBSM", "NBWQKSM", "SHLZQKSM", "LNGDZB", "SDMSSM", "YDYHFL", "ZGQKSM", "BZ", "SFXML", "XMMC", "XMLX", "XMBH", "DKMC", "CZCTBBH", "LC", "NF", "XZGDFJ", "GXSJ", "LJBZ", "JZYBH", "LJTBBH", "ZZZW", "SZLX", "LYZZZW", "LXJZGLBH", "GDPDJB" };
//独立图层代码
string ddtcbz = string.Empty;
string ddtcmc = string.Empty;
//城镇村属性码
string czcsxm = string.Empty;
//地类编码
string dlbm = string.Empty;
//权属性质
string qsxz = string.Empty;
//权属单位代码
string qsdwdm = string.Empty;
//权属单位名称
string qsdwmc = string.Empty;
//坐落单位代码
string zldwdm = string.Empty;
//坐落单位名称
string zldwmc = string.Empty;
//项目类型
string xmlx = string.Empty;
//种指属性代码
string zzsxdm = string.Empty;
//图斑细化代码
string tbxhdm = string.Empty;
//未变更原因描述
string wbgyyms = string.Empty;
//数据年份
string sjnf = string.Empty;
//求椭圆面积
double mj = Math.Round(feature.ShapeCopy.GetEllipseArea(), 2);
//变更后值
string bgHValue = $"jkry='{(MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo).UserName}',tbmj={mj},tbdlmj={mj},gxsj='{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}', jym = '{GetJym(feature)}', ";
//构建字段值
foreach (string item in listField)
{
int index = feature.Fields.FindField(item);
if (index <= -1)
{
continue;
}
object obj = feature.get_Value(index);
if (!(obj is DBNull) && !string.IsNullOrWhiteSpace(obj.ToString()))
{
if (item.Equals("ddtcbz", StringComparison.CurrentCultureIgnoreCase))
{
ddtcbz = obj.ToString();
}
if (item.Equals("ddtcmc", StringComparison.CurrentCultureIgnoreCase))
{
ddtcmc = obj.ToString();
}
if (item.Equals("CZCSXM", StringComparison.CurrentCultureIgnoreCase))
{
czcsxm = obj.ToString();
}
}
if (item.Equals("XMLX"))
{
xmlx = obj == null ? "" : obj.ToString();
}
if (item.Equals("QSXZ"))
{
qsxz = obj == null ? "" : obj.ToString();
}
if (item.Equals("DLBM"))
{
dlbm = obj == null ? "" : obj.ToString();
}
else if (item.Equals("ZZSXDM"))
{
zzsxdm = obj == null ? "" : obj.ToString();
}
else if (item.Equals("TBXHDM"))
tbxhdm = obj == null ? "" : obj.ToString();
else if (item.Equals("SJNF"))
sjnf = obj == null ? "" : obj.ToString();
IField field = feature.Fields.Field[index];
switch (field.Type)
{
case esriFieldType.esriFieldTypeSmallInteger:
case esriFieldType.esriFieldTypeInteger:
case esriFieldType.esriFieldTypeSingle:
case esriFieldType.esriFieldTypeDouble:
case esriFieldType.esriFieldTypeOID:
case esriFieldType.esriFieldTypeBlob:
if (obj == null || obj == DBNull.Value)
{
bgHValue += item + "=0,";
}
else
{
bgHValue += item + "=" + obj + ",";
}
break;
default:
if (item.Equals("KCDLBM", StringComparison.CurrentCultureIgnoreCase))
{
if (!dlbm.StartsWith("01"))
{
bgHValue += item + "='" + "" + "',";
}
else
{
bgHValue += item + "='" + obj + "',";
}
}
else if (item.Equals("WBGYY1", StringComparison.CurrentCultureIgnoreCase))
{
//if (string.IsNullOrEmpty(obj.ToString()))
wbgyyms = obj.ToString();
}
else if (item.Equals("WBGYY", StringComparison.CurrentCultureIgnoreCase))
{
if (obj.ToString() == "其他")
bgHValue += item + "='" + wbgyyms + "',";
else
bgHValue += item + "='" + obj + "',";
}
else if (item.Equals("GDLX", StringComparison.CurrentCultureIgnoreCase))
{
bgHValue += item + "='" + obj + "',";
if (obj != null && (obj.ToString().Equals("TT") || obj.ToString().Equals("PD")))
{
string gdpdjb = GetPojb(feature, layerPodu);
double gdkcxs = DTBDBLoadHelper.GetTKXS(gdpdjb, obj.ToString());
double kcmj = gdkcxs * mj;
double tbdlmj = mj - kcmj;
bgHValue += $"gdpdjb = '{gdpdjb}',kcxs = {gdkcxs}, kcmj = {kcmj}, tbdlmj = {tbdlmj}, ";
}
}
else
{
bgHValue += item + "='" + obj + "',";
}
break;
}
}
string sadff = string.Format(excuteSQL, bgHValue.TrimEnd(','), BSM);
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, bgHValue.TrimEnd(','), BSM), CommandType.Text);
//地类名称
string dlmc = string.Empty;
DataDicTionary dataDicTionary = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.DLBM).FirstOrDefault(x => x.CODE.Equals(dlbm));
if (dataDicTionary != null)
{
dlmc = dataDicTionary.NAME;
}
//种植属性名称
string zzsxmc = string.Empty;
dataDicTionary = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.ZZSX).FirstOrDefault(x => x.CODE.Equals(zzsxdm));
if (dataDicTionary != null)
{
zzsxmc = dataDicTionary.NAME;
}
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set dlmc='{dlmc}',zzsxmc='{zzsxmc}',ddtcmc='{ddtcmc}' where bsm='{BSM}'", CommandType.Text);
//单独图层名称
dataDicTionary = Platform.Instance.DicHelper.GetAllDic().FirstOrDefault(x => x.CODE.Equals(ddtcbz));
if (dataDicTionary != null)
{
ddtcmc = dataDicTionary.NAME;
}
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set dlmc='{dlmc}',zzsxmc='{zzsxmc}',ddtcmc='{ddtcmc}' where bsm='{BSM}'", CommandType.Text);
//图斑细化名称
string tbxhmc = string.Empty;
dataDicTionary = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.TBXHLX).FirstOrDefault(x => x.CODE.Equals(tbxhdm));
if (dataDicTionary != null)
{
tbxhmc = dataDicTionary.NAME;
}
rdbHelper.ExecuteNonQueryWithException($"update dtbdltbgx set dlmc='{dlmc}',zzsxmc='{zzsxmc}',ddtcmc='{ddtcmc}',tbxhmc='{tbxhmc}',qsxz='{qsxz}' where bsm='{BSM}'", CommandType.Text);
//保存独立图层代码
switch (ddtcbz)
{
case "1301"://临时用地2099010100
DataTable dataTable = IRowToDataTable(feature as IRow);
if (dataTable != null && dataTable.Rows.Count > 0)
{
DataRow dr = dataTable.Rows[0];
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBLSYDGX (BSM, DDTCBZ, DDTCMC, YSDM, GLTBBSM, PZWJMC, PZWH, TBMJ, PZMJ, YTFL, JTXMYT, PZRQ, YQSX, TDSYHT, BZ, GXSJ) VALUES('{BSM}', '{ddtcbz}', '{ddtcmc}', '2099010100', '{BSM}', '{dr["PZWJMC_LSYD"]}', '{dr["PZWH_LSYD"]}', {dr["TBMJ"]}, {dr["TBMJ"]}, '{dr["YTFL_LSYD"]}', '{dr["JTXMYT_LSYD"]}', '{dr["PZRQ_LSYD"]}', '{dr["YQSX_LSYD"]}', '{dr["TDSYHT_LSYD"]}', '{dr["BZ"]}', '{dr["GXSJ"]}')", CommandType.Text);
object obj = feature.get_Value(feature.Fields.FindField("PZWJ_LSYD"));
if (obj != null && !(obj is DBNull))
{
IMemoryBlobStreamVariant varBlobStream = (IMemoryBlobStreamVariant)obj;
object obj1 = null;
varBlobStream.ExportToVariant(out obj1);
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO PZWJ(BSM, Name, Path, Extension) VALUES('{BSM}', '{dr["PZWJMC_LSYD"]}', '', '')", CommandType.Text);
IDbDataParameter[] parameters = new IDbDataParameter[1];
parameters[0] = new System.Data.SQLite.SQLiteParameter("FileContent", DbType.Binary) { Value = obj1 };
rdbHelper.ExecuteNonQueryWithException($"update PZWJ SET FileContent=@FileContent where bsm='{BSM}'", CommandType.Text, parameters);
}
}
break;
case "1302"://光伏板区2099070100
dataTable = IRowToDataTable(feature as IRow);
if (dataTable != null && dataTable.Rows.Count > 0)
{
DataRow dr = dataTable.Rows[0];
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBGFBQGX(BSM, DDTCBZ, DDTCMC, YSDM, XMMC, XMGM, QYMJ, PZYDSJ, BZ, GXSJ) VALUES('{BSM}', '{ddtcbz}', '{ddtcmc}', '2099070100', '{dr["XMMC_GFBQ"]}', '{dr["XMGM_GFBQ"]}', {dr["TBMJ"]}, '{dr["PZYDSJ_GFBQ"]}', '{dr["BZ"]}', '{dr["GXSJ"]}')", CommandType.Text);
}
break;
case "1303"://推土区
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBTTQGX(BSM, DDTCBZ, DDTCMC, YSDM, TTQMJ, BZ, GXSJ) select bsm,ddtcbz,ddtcmc,'2099080100',tbmj,bz,gxsj from dtbdltbgx where bsm='{BSM}'", CommandType.Text);
break;
case "1304"://拆除未尽区2099090100
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBCCWJQGX (BSM, DDTCBZ, DDTCMC, YSDM, ZDMJ, BZ, GXSJ) select bsm,ddtcbz,ddtcmc,'2099090100',tbmj,bz,gxsj from dtbdltbgx where bsm='{BSM}'", CommandType.Text);
break;
case "1305"://路面范围2099100100
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBLMFWGX (BSM, DDTCBZ, DDTCMC, YSDM, ZLDWDM, KD, MJ, DLBM, MC, BZ, GXSJ) select bsm,ddtcbz,ddtcmc,'2099100100',zldwdm,xzdwkd,tbmj,dlbm,'',bz,gxsj from dtbdltbgx where bsm='{BSM}';", CommandType.Text);
break;
case "1306"://工厂化种植更新2099120100
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO GCHZZGX (BSM,YSDM,ZDMJ,DLBM,DLMC,BZ,GXSJ) select bsm,'2099120100',tbmj,dlbm,'',bz,gxsj from dtbdltbgx where bsm='{BSM}';", CommandType.Text);
break;
case "一般地类":
if (xmlx == "1" || xmlx == "2")
{
DataTable dtXmlx2 = IRowToDataTable(feature as IRow);
if (dtXmlx2 != null && dtXmlx2.Rows.Count > 0)
{
object obj = feature.get_Value(feature.Fields.FindField("XZGDFJ"));
if (obj != null && !(obj is DBNull))
{
string[] files = obj.ToString().Split(';');
string strSql = string.Empty;
foreach (string file in files)
{
string strGuid = Guid.NewGuid().ToString();
var objBsm = rdbHelper.ExecuteScalar($"select bsm from wyhcfj where hcjlbsm = '{dtXmlx2.Rows[0]["TBBSM"].ToString()}' and fjmc = '{file.Substring(file.LastIndexOf("\\") + 1)}'", CommandType.Text);
using (System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, (int)fs.Length);
IDbDataParameter[] parameters = new IDbDataParameter[5];
if (objBsm == null)
{
strSql = "INSERT INTO WYHCFJ ( HCLX, HCJLBSM, DKID, FJMC, FJLX, MODE,IS_SELECTED, SEQUENCE, SUBTYPE, ARG, ARG4, CJSJ, LENGTH, POINTS_JSON, UserDelete ) VALUES ( 'WYRWTB', @HCJLBSM, @HCJLBSM, @FJMC, 'PDF', '4',1, '0', '1', @ARG, @ARG4, @CJSJ, '0', '[]', '0' )";
parameters[0] = new System.Data.SQLite.SQLiteParameter("HCJLBSM", DbType.String) { Value = dtXmlx2.Rows[0]["TBBSM"].ToString() };
parameters[1] = new System.Data.SQLite.SQLiteParameter("FJMC", DbType.String) { Value = file.Substring(file.LastIndexOf("\\") + 1) };
parameters[2] = new System.Data.SQLite.SQLiteParameter("ARG", DbType.String) { Value = strGuid };
parameters[3] = new System.Data.SQLite.SQLiteParameter("ARG4", DbType.Binary) { Value = bytes };
parameters[4] = new System.Data.SQLite.SQLiteParameter("CJSJ", DbType.DateTime) { Value = DateTime.Now };
}
else
{
strSql = "UPDATE WYHCFJ SET ARG = @ARG, ARG4 = @ARG4, CJSJ = @CJSJ WHERE HCJLBSM=@HCJLBSM AND FJMC = @FJMC";
parameters[0] = new System.Data.SQLite.SQLiteParameter("HCJLBSM", DbType.String) { Value = dtXmlx2.Rows[0]["TBBSM"].ToString() };
parameters[1] = new System.Data.SQLite.SQLiteParameter("FJMC", DbType.String) { Value = file.Substring(file.LastIndexOf("\\") + 1) };
parameters[2] = new System.Data.SQLite.SQLiteParameter("ARG", DbType.String) { Value = strGuid };
parameters[3] = new System.Data.SQLite.SQLiteParameter("ARG4", DbType.Binary) { Value = bytes };
parameters[4] = new System.Data.SQLite.SQLiteParameter("CJSJ", DbType.DateTime) { Value = DateTime.Now };
}
rdbHelper.ExecuteNonQueryWithException(strSql, CommandType.Text, parameters);
rdbHelper.ExecuteNonQueryWithException($"insert into fjgx (wytbbsm,fjarg,tbbsm) values ('{dtXmlx2.Rows[0]["TBBSM"].ToString()}','{strGuid}','{BSM}')", CommandType.Text);
fs.Close();
}
}
}
}
}
break;
}
string czcmc = string.Empty;
//保存城镇村等用地
switch (czcsxm)
{
case "201":
case "201A":
case "202":
case "202A":
case "203":
case "203A":
case "204":
case "205":
dataDicTionary = Platform.Instance.DicHelper.GetNoGroupDic(DicTypeEnum.CZCJGKYD).FirstOrDefault(x => x.CODE.Equals(czcsxm));
if (dataDicTionary != null)
{
czcmc = dataDicTionary.NAME;
}
rdbHelper.ExecuteNonQueryWithException($"INSERT INTO DTBCZCDYDGX (BSM, DDTCBZ, DDTCMC, YSDM, CZCLX, CZCDM, CZCMC, CZCMJ, BZ, GXSJ) select bsm,ddtcbz,ddtcmc,'2099030100',czcsxm,'{xzqdm.PadRight(19, '0')}','{czcmc}',tbmj,bz,gxsj from dtbdltbgx where bsm='{BSM}'", CommandType.Text);
break;
}
////保存附件信息
//object images = feature.get_Value(feature.Fields.FindField("images"));
//if (images != null)
//{
// excuteSQL = "insert into fjgx(WYTBBSM,FJARG,tbbsm)values('{0}','{1}','{2}')";
// foreach (var item in images.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
// {
// rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, tbbsm, item, BSM), CommandType.Text);
// }
//}
//附件文件 保存
DataTable dtXmlx = IRowToDataTable(feature as IRow);
if (dtXmlx != null && dtXmlx.Rows.Count > 0)
{
object obj = feature.get_Value(feature.Fields.FindField("XZGDFJ"));
if (obj != null && !(obj is DBNull) && !string.IsNullOrWhiteSpace(obj.ToString()))
{
string[] files = obj.ToString().Split(';');
string strSql = string.Empty;
foreach (string file in files)
{
string strGuid = Guid.NewGuid().ToString();
var objBsm = rdbHelper.ExecuteScalar($"select bsm from wyhcfj where hcjlbsm = '{dtXmlx.Rows[0]["TBBSM"].ToString()}' and fjmc = '{file.Substring(file.LastIndexOf("\\") + 1)}'", CommandType.Text);
using (System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Open))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, (int)fs.Length);
IDbDataParameter[] parameters = new IDbDataParameter[5];
if (objBsm == null)
{
strSql = "INSERT INTO WYHCFJ ( HCLX, HCJLBSM, DKID, FJMC, FJLX, MODE,IS_SELECTED, SEQUENCE, SUBTYPE, ARG, ARG4, CJSJ, LENGTH, POINTS_JSON, UserDelete ) VALUES ( 'WYRWTB', @HCJLBSM, @HCJLBSM, @FJMC, 'PDF', '4',1, '0', '1', @ARG, @ARG4, @CJSJ, '0', '[]', '0' )";
parameters[0] = new System.Data.SQLite.SQLiteParameter("HCJLBSM", DbType.String) { Value = dtXmlx.Rows[0]["TBBSM"].ToString() };
parameters[1] = new System.Data.SQLite.SQLiteParameter("FJMC", DbType.String) { Value = file.Substring(file.LastIndexOf("\\") + 1) };
parameters[2] = new System.Data.SQLite.SQLiteParameter("ARG", DbType.String) { Value = strGuid };
parameters[3] = new System.Data.SQLite.SQLiteParameter("ARG4", DbType.Binary) { Value = bytes };
parameters[4] = new System.Data.SQLite.SQLiteParameter("CJSJ", DbType.DateTime) { Value = DateTime.Now };
}
else
{
strSql = "UPDATE WYHCFJ SET ARG = @ARG, ARG4 = @ARG4, CJSJ = @CJSJ WHERE HCJLBSM=@HCJLBSM AND FJMC = @FJMC";
parameters[0] = new System.Data.SQLite.SQLiteParameter("HCJLBSM", DbType.String) { Value = dtXmlx.Rows[0]["TBBSM"].ToString() };
parameters[1] = new System.Data.SQLite.SQLiteParameter("FJMC", DbType.String) { Value = file.Substring(file.LastIndexOf("\\") + 1) };
parameters[2] = new System.Data.SQLite.SQLiteParameter("ARG", DbType.String) { Value = strGuid };
parameters[3] = new System.Data.SQLite.SQLiteParameter("ARG4", DbType.Binary) { Value = bytes };
parameters[4] = new System.Data.SQLite.SQLiteParameter("CJSJ", DbType.DateTime) { Value = DateTime.Now };
}
rdbHelper.ExecuteNonQueryWithException(strSql, CommandType.Text, parameters);
rdbHelper.ExecuteNonQueryWithException($"insert into fjgx (wytbbsm,fjarg,tbbsm) values ('{dtXmlx.Rows[0]["TBBSM"].ToString()}','{strGuid}','{BSM}')", CommandType.Text);
fs.Close();
}
}
}
}
//根据图斑面积面积,限制外业照片、视频数量
string strTbmj = string.Empty;
int tbmjIndex = feature.Fields.FindField("TBMJ");
if (tbmjIndex > -1)
{
strTbmj = feature.get_Value(tbmjIndex).ToString();
DataTable dtFj = rdbHelper.ExecuteDatatable("wyhcfj", $"select sum(case when mode in ('5') then 1 else 0 end) as videocount,sum(case when mode not in ('4','5') then 1 else 0 end) as imagecount from wyhcfj a inner join fjgx b on a.hcjlbsm=b.wytbbsm and b.fjarg = a.arg and b.tbbsm ='{BSM}' where HCJLBSM='{tbbsm}' and (UserDelete <> 1 or UserDelete is not null)", true);
if (!string.IsNullOrEmpty(strTbmj) && dtFj != null && dtFj.Rows.Count > 0)
{
int imageCount = 0, videoCount = 0;
if (dtFj.Rows[0]["imagecount"] != null && !string.IsNullOrEmpty(dtFj.Rows[0]["imagecount"].ToString()))
{
imageCount = int.Parse(dtFj.Rows[0]["imagecount"].ToString());
}
if (dtFj.Rows[0]["videocount"] != null && !string.IsNullOrEmpty(dtFj.Rows[0]["videocount"].ToString()))
{
videoCount = int.Parse(dtFj.Rows[0]["videocount"].ToString());
}
decimal tbmj = (Convert.ToDouble(strTbmj) / 666.67).ToDecimal(2);
if (tbmj <= 5)
{
if (imageCount > 15 || videoCount > 2)
{
//MessageHelper.Show("图斑面积小于5亩时,外业照片数量超过15张,或者外业视频数量超过2段");
LogAPI.Debug("图斑面积小于5亩时,外业照片数量超过15张,或者外业视频数量超过2段");
return;
}
}
else if (5 < tbmj && tbmj <= 20)
{
if (imageCount > 30 || videoCount > 5)
{
//MessageHelper.Show("图斑面积大于5亩小于等于20亩时,外业照片数量超过30张,或者外业视频数量超过5段");
LogAPI.Debug("图斑面积大于5亩小于等于20亩时,外业照片数量超过30张,或者外业视频数量超过5段");
return;
}
}
else if (tbmj > 20 && tbmj <= 50)
{
if (imageCount > 50 || videoCount > 7)
{
//MessageHelper.Show("图斑面积大于20亩时,外业照片数量超过50张,或者外业视频数量超过7段");
LogAPI.Debug("图斑面积大于20亩小于等于50亩时,外业照片数量超过50张,或者外业视频数量超过7段");
return;
}
}
else if (tbmj > 50 && tbmj <= 100)
{
if (imageCount > 100 || videoCount > 7)
{
LogAPI.Debug("图斑面积大于50亩小于等于100亩时,外业照片数量超过100张,或者外业视频数量超过7段");
return;
}
}
else if (tbmj > 100)
{
if (imageCount > 120 || videoCount > 7)
{
LogAPI.Debug("图斑面积大于100亩时,外业照片数量超过120张,或者外业视频数量超过7段");
return;
}
}
}
}
}
catch (Exception ex)
{
LogAPI.Debug(ex.Message);
throw ex;
}
}
#endregion
#region 获取校验码
/// <summary>
/// 获取校验码
/// </summary>
/// <param name="feature"></param>
/// <returns></returns>
public string GetJym(IFeature feature)
{
string jymKey = "Images,MAXX,MAXY,MINX,MINY,ZXDX,ZXDY,Shape_Length,Shape_Area";
Dictionary<string, string> dicJym = new Dictionary<string, string>();
string addJym = string.Empty, jymJson = string.Empty;
addJym = KGIS.Framework.Utils.SysConfigsOprator.GetAppsetingValueByKey("JYM");
if (!string.IsNullOrEmpty(addJym))
{
jymKey = $"{addJym},{jymKey}";
}
foreach (string item in jymKey.Split(',').Distinct().ToArray())
{
int itemIndex = feature.Fields.FindField(item.Trim());
if (itemIndex > -1)
{
object objValue = feature.get_Value(itemIndex);
if (objValue != null)
{
switch (item)
{
case "MAXX":
case "MAXY":
case "MINX":
case "MINY":
case "ZXDX":
case "ZXDY":
case "Shape_Length":
case "Shape_Area":
dicJym.Add(item, Math.Round(double.Parse(objValue.ToString()), 3).ToString());
break;
default:
dicJym.Add(item, objValue.ToString());
break;
}
}
}
}
jymJson = JsonConvert.SerializeObject(dicJym);
return EncryptionHelper.GetMd5Hash(jymJson);
}
#endregion
#region SyncDBData
/// <summary>
/// 防止编辑工具撤回,但是任务包 中已经保存进去了,删除这部分数据
/// </summary>
/// <param name="featureClass"></param>
/// <param name="rdbHelper"></param>
/// <param name="tbbsm"></param>
public void SyncDBData(IFeatureClass featureClass, IRDBHelper rdbHelper, string tbbsm)
{
ICursor cursor = null;
IRow row = null;
try
{
//如果拆分的时候两个要素bsm是一样的,判断有多个bsm的
IQueryFilter queryFilter = new QueryFilterClass()
{
WhereClause = $"tbbsm='{tbbsm}'"
};
cursor = (featureClass as ITable).Search(queryFilter, false);
string bsm = string.Empty;
while ((row = cursor.NextRow()) != null)
{
bsm += $"'{row.get_Value(featureClass.FindField("BSM"))}',";
}
if (string.IsNullOrWhiteSpace(bsm))
{
return;
}
bsm = bsm.TrimEnd(',');
string excuteSQL = "delete from {0} where tbbsm='" + tbbsm + "' and bsm not in({1})";
rdbHelper.ExecuteNonQueryWithException(string.Format(excuteSQL, "DTBDLTBGX", bsm), CommandType.Text);
rdbHelper.ExecuteNonQueryWithException($"delete from FJGX where wytbbsm='{tbbsm}' and TBBSM not in ({bsm})", CommandType.Text);
}
catch (Exception ex)
{
LogAPI.Debug("同步db数据:" + ex.Message);
}
finally
{
if (row != null)
{
Marshal.ReleaseComObject(row);
}
if (cursor != null)
{
Marshal.ReleaseComObject(cursor);
}
}
}
#endregion
#region GetPojb
public string GetPojb(IFeature newFeature, ILayer layerPodu)
{
string poduMax = "";
try
{
Dictionary<ESRI.ArcGIS.Geometry.IGeometry, IFeature> data = DTBDBLoadHelper.IdentifyReturnIntersect(newFeature.ShapeCopy, layerPodu);
if (data != null && data.Count > 0)
{
int poduindex = data.Values.FirstOrDefault().Fields.FindField("PDJB");
Dictionary<string, double> pdMj = new Dictionary<string, double>();
foreach (var item in data)
{
string pdjb = item.Value.get_Value(poduindex).ToString();
if (pdMj.ContainsKey(pdjb))
{
pdMj[pdjb] = pdMj[pdjb] + (item.Key as ESRI.ArcGIS.Geometry.IArea).Area;
}
else
{
pdMj.Add(pdjb, (item.Key as ESRI.ArcGIS.Geometry.IArea).Area);
}
}
poduMax = pdMj.OrderByDescending(x => x.Value).FirstOrDefault().Key;
}
}
catch
{
}
return poduMax;
}
#endregion
#region IRowToDataTable
/// <summary>
/// 将IRow转换为DataTable
/// </summary>
/// <param name="mTable"></param>
/// <returns></returns>
public static DataTable IRowToDataTable(IRow row)
{
try
{
DataTable pTable = new DataTable();
for (int i = 0; i < row.Fields.FieldCount; i++)
{
pTable.Columns.Add(row.Fields.get_Field(i).Name);
}
DataRow pRow = pTable.NewRow();
string[] StrRow = new string[row.Fields.FieldCount];
for (int i = 0; i < row.Fields.FieldCount; i++)
{
StrRow[i] = row.get_Value(i).ToString();
}
pRow.ItemArray = StrRow;
pTable.Rows.Add(pRow);
return pTable;
}
catch (Exception ex)
{
throw ex;
}
}
#endregion
#region 设置扣除系数
/// <summary>
/// 坡度图图层内查询耕地坡度级别
/// </summary>
/// <param name="tbbsm">图斑标识码</param>
/// <returns></returns>
private string GetGdpdjb(string tbbsm)
{
string gdpdjb = string.Empty;
try
{
ProjectInfo projectInfo = MapsManager.Instance.MapService.GetProjectInfo() as ProjectInfo;
if (projectInfo != null && string.IsNullOrEmpty(projectInfo.PDTPath))
{
throw new Exception("坡度图图层为空!");
}
int wkid = -1;
if (projectInfo.GetCurentProjectedCoordinate() != null)
{
wkid = projectInfo.GetCurentProjectedCoordinate().FactoryCode;
if (wkid <= 0)
{
GaussCalculateLibrary.CoordinateReferenceMapping coordinateReferenceMapping = GaussCalculateLibrary.CoordinateHelper.ListCoordinateReference.FirstOrDefault(x => (projectInfo.ZYJD > x.MinX && projectInfo.ZYJD < x.MaxX) || x.Central_Meridian.Equals(projectInfo.ZYJD));
if (coordinateReferenceMapping != null)
{
wkid = coordinateReferenceMapping.WKID;
}
}
}
if (CurrentWYRWTB == null || CurrentWYRWTBTreeNode.PackageNode == null || CurrentWYRWTBTreeNode.PackageNode.Data == null)
{
throw new Exception("任务包信息获取失败");
}
string tempPath = System.IO.Path.Combine(projectInfo.TaskPath, "临时", (CurrentWYRWTBTreeNode.PackageNode.Data as TaskPackage).PackageName, "解压");
if (!System.IO.Directory.Exists(tempPath))
{
System.IO.Directory.CreateDirectory(tempPath);
}
//string gdbName = "db.GDB";
IFeatureLayer pFeatureLayer = null;
//如果存在图斑与坡度图相交后的shp文件,读取
if (File.Exists(System.IO.Path.Combine(tempPath, "IntersectPdt.shp")))
{
IWorkspaceFactory pWorkspaceFactory;
IFeatureWorkspace pFeatureWorkspace;
pWorkspaceFactory = new ShapefileWorkspaceFactory();
pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(tempPath, 0);
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass("IntersectPdt.shp");
pFeatureLayer = new FeatureLayer();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pFeatureLayer.FeatureClass.AliasName;
}
else //如果不存在,模板与坡度图相交
{
string pdtPath = string.Empty;
if (projectInfo.PDTPath.IndexOf(".gdb") <= 0)
{
string[] dir = Directory.GetDirectories(projectInfo.PDTPath);
IEnumerable<string> filteredFilePath = dir.Where(x => x.EndsWith(".gdb") || x.EndsWith(".GDB"));
if (filteredFilePath.Any())
{
pdtPath = filteredFilePath.FirstOrDefault();
}
else
{
throw new Exception("未找到gdb文件:" + projectInfo.PDTPath);
}
}
else
{
pdtPath = projectInfo.PDTPath;
}
GPParamClass param = new GPParamClass()
{
FirstFeatureClassPath = System.IO.Path.Combine(pdtPath, "PDT"),
SecondFeatureClassPath = System.IO.Path.Combine(SysAppPath.GetCurrentAppPath() + "Project\\Scheme1.gdb", "DLTBBG"),
IsGetOutPutFeature = true,
OutFeatureClassPath = System.IO.Path.Combine(tempPath, "IntersectPdt"),
};
GeoprocessorHelper.IntersectAnalysis(param, ref pFeatureLayer);
}
//根据TBBSM查询坡度级别,如果压盖多个图斑,取面积最大的图斑对应的坡度级别
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = $"TBBSM='{tbbsm}'";
IFeatureCursor featureCursor = pFeatureLayer.Search(queryFilter, true);
IFeature feature = null;
double shapeArea = 0;
while ((feature = featureCursor.NextFeature()) != null)
{
int pdjbIndex = feature.Fields.FindField("PDJB");
int areaIndex = feature.Fields.FindField("Shape_Area");
if (areaIndex > -1 && pdjbIndex > -1)
{
object pdjbValue = feature.get_Value(pdjbIndex);
object areaValue = feature.get_Value(areaIndex);
if (pdjbValue != null && !(pdjbValue is DBNull) && areaValue != null && !(areaValue is DBNull))
{
LogAPI.Debug($"pdjbValue:{pdjbValue.ToString()},areaValue:{areaValue.ToString()}");
if (shapeArea < double.Parse(areaValue.ToString()))
{
shapeArea = double.Parse(areaValue.ToString());
gdpdjb = pdjbValue.ToString();
}
}
}
}
Marshal.ReleaseComObject(featureCursor);
}
catch (Exception ex)
{
LogAPI.Debug("耕地坡度级别获取失败:" + ex.Message);
}
return gdpdjb;
}
/// <summary>
/// 设置扣除系数
/// </summary>
/// <param name="Newfeature"></param>
/// <param name="rdbHelper"></param>
/// <param name="tbbsm"></param>
public void UpdateKCXS(IFeature Newfeature, IRDBHelper rdbHelper, string tbbsm)
{
string bsm = string.Empty;
int bsmIndex = Newfeature.Fields.FindField("BSM");//地类编码
if (bsmIndex > -1)
{
bsm = Newfeature.get_Value(bsmIndex).ToString();
}
string dlbm = string.Empty;
int dlbmIndex = Newfeature.Fields.FindField("DLBM");//地类编码
if (dlbmIndex > -1)
{
dlbm = Newfeature.get_Value(dlbmIndex).ToString();
}
string gdlx = string.Empty;
int gdlxIndex = Newfeature.Fields.FindField("GDLX");//耕地类型
if (gdlxIndex > -1)
{
gdlx = Newfeature.get_Value(gdlxIndex).ToString();
}
string gdpdjb = string.Empty;
int gdpojbIndex = Newfeature.Fields.FindField("GDPDJB");//耕地坡度级别
if (gdpojbIndex > -1)
{
gdpdjb = Newfeature.get_Value(gdpojbIndex).ToString();
}
try
{
if (!string.IsNullOrEmpty(bsm) && !string.IsNullOrEmpty(dlbm) && !string.IsNullOrEmpty(gdlx))
{
DataTable dt = rdbHelper.ExecuteDatatable("dtbdltbgxgc", $"select bsm,bgqdlbm,bgqgdlx,bgqkcxs from dtbdltbgxgc where tbbsm='{tbbsm}' and bghtbbsm = '{bsm}'", true);
if (dt != null && dt.Rows.Count > 0)
{
double kcxs = 0;
string strSql = string.Empty;
if (string.IsNullOrEmpty(gdpdjb))
{
gdpdjb = GetGdpdjb(tbbsm);
if (string.IsNullOrEmpty(gdpdjb))
{
LogAPI.Debug($"TBBSM({tbbsm})耕地坡度级别为空");
return;
//throw new Exception($"TBBSM({tbbsm})耕地坡度级别为空");
}
}
if (gdpdjb != "1")
{
kcxs = DTBDBLoadHelper.GetTKXS(gdpdjb, gdlx);
}
//变更前为非耕地,变更后为耕地,新增耕地的扣除系数需根据坡度图,耕地级别等自动赋值扣除系数
if (!dt.Rows[0]["bgqdlbm"].ToString().StartsWith("01") && dlbm.StartsWith("01"))
{
strSql = $"update dtbdltbgx set kcdlbm = '1203',gdpdjb = '{gdpdjb}',kcxs = {kcxs},kcmj = kcxs * tbmj,tbdlmj = tbmj - kcmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';";
}
//基础数据为0101TT/0102PD/0103PD,变更后还是为0101TT/0102PD/0103PD,只是图形范围变大或减小或者种植属性变化,扣除系数继承基础库的扣除系数
else if (dt.Rows[0]["bgqdlbm"].ToString() == dlbm && dt.Rows[0]["bgqgdlx"].ToString() == gdlx && !string.IsNullOrEmpty(dt.Rows[0]["bgqkcxs"].ToString()))
{
strSql = $"update dtbdltbgx set kcdlbm = '1203',gdpdjb = '{gdpdjb}',kcxs = {int.Parse(dt.Rows[0]["bgqkcxs"].ToString())},kcmj = kcxs * tbmj,tbdlmj = tbmj - kcmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';";
}
//原来为0101TT,变更为0103PD,扣除系数需根据坡度图,耕地坡度级别等自动赋值扣除系数
else if (dt.Rows[0]["bgqdlbm"].ToString() == "0101" && dt.Rows[0]["bgqgdlx"].ToString() == "TT" && dlbm == "0103" && gdlx == "PD")
{
strSql = $"update dtbdltbgx set kcdlbm = '1203',gdpdjb = '{gdpdjb}',kcxs = {kcxs},kcmj = kcxs * tbmj,tbdlmj = tbmj - kcmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';";
}
//原来为0103PD,变更为0101TT,扣除系数需根据坡度图,耕地坡度级别等自动赋值扣除系数
else if (dt.Rows[0]["bgqdlbm"].ToString() == "0103" && dt.Rows[0]["bgqgdlx"].ToString() == "PD" && dlbm == "0101" && gdlx == "TT")
{
strSql = $"update dtbdltb set kcdlbm = '1203',gdpdjb = '{gdpdjb}',kcxs = {kcxs},kcmj = kcxs * tbmj,tbdlmj = tbmj - kcmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';";
}
else
{
LogAPI.Debug($"未检索到满足 TBBSM:{tbbsm} 的扣除系数筛选条件。");
return;
}
strSql += $"update dtbdltbgx set kcmj = kcxs * tbmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';update dtbdltbgx set tbdlmj = tbmj - kcmj where tbbsm ='{tbbsm}' and bsm = '{bsm}';";
LogAPI.Debug($"UpdateKCXS Info SQL:{strSql}");
rdbHelper.ExecuteNonQueryWithException(strSql, CommandType.Text);
if (gdpdjb == "1")
{
strSql = $"update dtbdltbgxgc set bghkcdlbm = '',bghgdpdjb = '{gdpdjb}',bghkcxs = 0 where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}';update dtbdltbgxgc set bghkcmj = bghkcxs * tbbgmj where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}';update dtbdltbgxgc set bghtbdlmj = tbbgmj - bghkcmj where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}'";
}
else
{
strSql = $"update dtbdltbgxgc set bghkcdlbm = '1203',bghgdpdjb = '{gdpdjb}',bghkcxs = {kcxs} where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}';update dtbdltbgxgc set bghkcmj = bghkcxs * tbbgmj where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}';update dtbdltbgxgc set bghtbdlmj = tbbgmj - bghkcmj where tbbsm ='{tbbsm}' and bghtbbsm = '{bsm}'";
}
rdbHelper.ExecuteNonQueryWithException(strSql, CommandType.Text);
}
else
{
throw new Exception($"未检索到TBBSM:{tbbsm} 的 DTBDLTBGXGC 层数据");
}
}
}
catch (Exception ee)
{
LogAPI.Debug("扣除系数设置失败:" + ee.ToString());
throw new Exception("扣除系数设置失败:" + ee.Message);
}
}
#endregion
}
}