using ExportMap.db;
using ExportMap.Models;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
namespace ExportMap.cs
{
public class SGUtils
{
///
/// 廊坊数据目录
///
public static string LFData
{
get
{
return ConfigurationManager.AppSettings["lfData"];
}
}
///
/// SG的DB库
///
public static string SGDB
{
get
{
return ConfigurationManager.AppSettings["sgDB"];
}
}
///
/// 获取发布地址
///
public static string GetReleaseUrl(SysMeta meta, Int64 sgsID)
{
switch (meta.type)
{
case "mpt":
return "{host}/SG/Imagery;" + sgsID + ".mpt"; // Elevation
case "3dml":
return "{host}/SG/b3dm/" + sgsID + "/tileset.json";
case "cpt":
return "{host}/SG/pnts/" + sgsID + "/tileset.json";
default:
return string.Empty;
}
}
///
/// 发布数据
///
/// XYZ参数
/// 行数
public List Release(XYZArgs args, ref string err)
{
List list = XYZUtils.SelectMetas(args.ids, "and type in ('mpt', '3dml', 'cpt')");
if (null == list || list.Count == 0) return null;
//int maxId = GetMaxId(); // maxId = 411576;
RomoveNoneFiles(list);
if (list.Count == 0) return null;
//err = LinkFiles(list);
Tools.SetIsModel(args, list);
MoveFiles(list);
SysTask task = CreateTask(args, list);
task.pid = 0;
task.id = TaskDBHelper.Insert(task);
//string names = GetNames(list);
string sql = getSql(list);
for (int i = 0; i < 61; i++)
{
Thread.Sleep(3000);
//List items = SelectItems(names);
List items = SelectItemsBySql(sql);
if (null == items || items.Count == 0) continue;
task = TaskDBHelper.SelectById(task.id);
if (null != task && task.status < 2)
{
task.status = 2;
TaskDBHelper.Update(task);
}
return InsertInto(list, items, args);
}
task = TaskDBHelper.SelectById(task.id);
if (null != task && task.status < 2)
{
task.status = 4;
task.err = "没有数据要发布";
TaskDBHelper.Update(task);
}
return null;
}
///
/// 创建任务
///
private SysTask CreateTask(XYZArgs args, List list)
{
args.name = list[0].name;
for (int i = 1; i < list.Count; i++)
{
string name =args.name+ "," + list[i].name;
if (name.Length > 150) break;
args.name = name;
}
switch (list[0].type)
{
case "3dml":
return TaskDBHelper.CreateTask(args, "3DML", "三维模型(3DML)");
case "cpt":
return TaskDBHelper.CreateTask(args, "CPT", "点云数据(CPT)");
default:
return TaskDBHelper.CreateTask(args, "MPT", "场景数据(MPT)");
}
}
///
/// 获取查询SQL
///
private string getSql(List metas)
{
List list = new List();
foreach (SysMeta meta in metas)
{
list.Add("Name like '%_" + meta.name + "'");
}
string filters = string.Join(" or ", list);
return string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where {0} order by id desc", filters);
}
///
/// 查询SG数据项
///
private List SelectItemsBySql(string sql)
{
DataTable dt = SQLiteHelper.GetDataTable(sql);
List list = ModelHandler.FillModel(dt);
return list;
}
///
/// 移除空文件
///
private void RomoveNoneFiles(List list)
{
string uploadFolder = Tools.GetSetting("uploadFolder");
int i = 0;
while (i < list.Count)
{
SysMeta meta = list[i];
string filePath = Path.Combine(uploadFolder, meta.path);
if (!File.Exists(filePath))
{
list.RemoveAt(i);
continue;
}
if ("mpt".Equals(meta.type))
{
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
if (!File.Exists(midx) || !File.Exists(strmi))
{
list.RemoveAt(i);
continue;
}
}
i++;
}
}
///
/// 插入数据发布表
///
private List InsertInto(List list, List items, XYZArgs args)
{
List ids = new List();
foreach (SysMeta meta in list)
{
//IEnumerable iterator = from item in items where item.Name.Equals(meta.id + "_" + meta.name) select item;
IEnumerable iterator = from item in items where item.Name.Contains("_" + meta.name) select item;
if (null == iterator || 0 == iterator.Count()) return ids;
meta.verid = iterator.First().id;
int pubid = InsertToDB(meta, args);
if (pubid > 0) ids.Add(pubid);
}
return ids;
}
///
/// 插入数据库
///
private static int InsertToDB(SysMeta meta, XYZArgs args)
{
//if (PubDBHelper.IsPublish(meta.id)) return 1;
int pubid = PubDBHelper.GetPushlishId(meta.id);
if (pubid > 0)
{
PubDBHelper.UpdatePublish(pubid, meta.name, args.userId, null, GetReleaseUrl(meta, meta.verid));
return pubid;
}
SysPublish sys = Tools.NewPublish(meta, args, GetReleaseUrl(meta, meta.verid), meta.id + "\\" + meta.name);
pubid = PubDBHelper.InsertPublish(sys);
if (pubid > 0)
{
sys.id = pubid;
PubDBHelper.InsertLayer(sys, meta);
PubDBHelper.InsertMetaPub(meta.id, pubid, args.userId);
}
return pubid;
}
///
/// 移动文件
///
private static void MoveFiles(List metas)
{
string uploadFolder = Tools.GetSetting("uploadFolder");
string sgFolder = Path.Combine(uploadFolder, "SG");
if (!Directory.Exists(sgFolder)) Directory.CreateDirectory(sgFolder);
List list = new List();
foreach (SysMeta meta in metas)
{
if (meta.path.IndexOf("SG\\") > -1) continue;
string source = Path.Combine(uploadFolder, meta.path);
string target = Path.Combine(sgFolder, meta.id + "_" + meta.name);
if (File.Exists(target)) File.Delete(target);
File.Move(source, target);
if ("mpt".Equals(meta.type))
{
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
File.Move(midx, Path.Combine(sgFolder, meta.id + "_" + meta.name.Replace(".mpt", ".midx")));
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
File.Move(strmi, Path.Combine(sgFolder, meta.id + "_" + meta.name.Replace(".mpt", ".strmi")));
}
meta.path = "SG" + "\\" + meta.id + "_" + meta.name;
PubDBHelper.UpdateMetaPath(meta);
}
}
#region 废弃 *
///
/// 查询SG数据项
///
public List SelectItems(string names)
{
string sql = string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where Name in ({0}) order by id desc", names);
DataTable dt = SQLiteHelper.GetDataTable(sql);
List list = ModelHandler.FillModel(dt);
return list;
}
///
/// 获取名称字符串
///
private string GetNames(List metas)
{
List list = new List();
foreach (SysMeta meta in metas)
{
list.Add("'" + meta.id + "_" + meta.name + "'");
}
return string.Join(",", list);
}
#endregion
#region * 废弃 *
///
/// 获取最大ID值
///
public int GetMaxId()
{
Object obj = SQLiteHelper.ExecuteScalar("select max(id) from SpatialItems");
return null == obj ? 0 : Convert.ToInt32(obj);
}
///
/// 查询SG数据项
///
/// 最大ID值
/// SG数据项
public List SelectItems(int maxId)
{
string sql = string.Format("select id, Name, RelativePath, LayerName, DataSourceId, Description from SpatialItems where id > {0} order by id desc", maxId);
DataTable dt = SQLiteHelper.GetDataTable(sql);
List list = ModelHandler.FillModel(dt);
return list;
}
///
/// 链接文件
///
private string LinkFiles(List metas)
{
List list = new List();
foreach (SysMeta meta in metas)
{
switch (meta.type)
{
case "3dml":
AddMptLinkFile(list, meta);
break;
case "mpt":
AddD3mlLinkFile(list, meta);
break;
}
}
if (0 == list.Count) return "没有需要更新发布的文件";
return Tools.ExecCmd(list);
}
///
/// 添加链接文件
///
private void AddMptLinkFile(List list, SysMeta meta)
{
string uploadFolder = Tools.GetSetting("uploadFolder");
string d3mlFolder = Tools.GetSetting("3dmlFolder");
string targetFolder = Path.Combine(d3mlFolder, meta.id.ToString());
if (!Directory.Exists(targetFolder)) Directory.CreateDirectory(targetFolder);
string d3ml = Path.Combine(uploadFolder, meta.path);
string targetD3ml = Path.Combine(d3mlFolder, meta.id.ToString(), meta.name);
if (!File.Exists(targetD3ml)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetD3ml, d3ml)); // /H
}
///
/// 添加链接文件
///
private void AddD3mlLinkFile(List list, SysMeta meta)
{
string uploadFolder = Tools.GetSetting("uploadFolder");
string mptFolder = Tools.GetSetting("mptFolder");
string targetFolder = Path.Combine(mptFolder, meta.id.ToString());
if (!Directory.Exists(targetFolder)) Directory.CreateDirectory(targetFolder);
string mpt = Path.Combine(uploadFolder, meta.path);
string targetMpt = Path.Combine(mptFolder, meta.id.ToString(), meta.name);
string midx = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".midx"));
string targetMidx = Path.Combine(mptFolder, meta.id.ToString(), meta.name.Replace(".mpt", ".midx"));
string strmi = Path.Combine(uploadFolder, meta.path.Replace(".mpt", ".strmi"));
string targetStrmi = Path.Combine(mptFolder, meta.id.ToString(), meta.name.Replace(".mpt", ".strmi"));
if (!File.Exists(targetMpt)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetMpt, mpt));
if (!File.Exists(targetMidx)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetMidx, midx));
if (!File.Exists(targetStrmi)) list.Add(string.Format("mklink \"{0}\" \"{1}\"", targetStrmi, strmi));
}
#endregion
}
}