管道基础大数据平台系统开发-【CS】-ExportMap
13693261870
2023-08-23 5f6661195e3abab67149e2eaca61ac4bf17f9b1f
DataLoader/CS/Importor.cs
@@ -1,65 +1,405 @@
using DataLoader.Model;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.Common;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Documents;
namespace DataLoader.CS
{
    public class Importor
    {
        private static PostgreHelper _ph = null;
        public static PostgreHelper Helper
        #region 加载
        /// <summary>
        /// 获取文件
        /// </summary>
        public static void GetFiles(ObservableCollection<ViewData> viewDatas, string path)
        {
            get
            {
                if (_ph == null) _ph = new PostgreHelper(DbEnum.langfang);
            GetSubFiles(viewDatas, path);
                return _ph;
            string[] directories = Directory.GetDirectories(path);
            if (null == directories || directories.Length == 0) return;
            foreach (string sub in directories)
            {
                if (IsGdbFile(sub))
                {
                    SetSysMeta(viewDatas, sub, "gdb");
                    continue;
                }
                if (IsOsgbFile(sub))
                {
                    SetSysMeta(viewDatas, sub, "osgb");
                    continue;
                }
                GetFiles(viewDatas, sub);
            }
        }
        private static readonly string insertMeta = "insert into lf.sys_meta(name, dirid, depid, verid, type, sizes, cs, scale, resolution, gather, batch, descr, create_user) values  @name, @dirid, @depid, @verid, @type, @sizes, @cs, @scale, @resolution, @gather, @batch, @descr, @create_user) returning id";
        private static readonly string insertMetaFile = "insert into lf.sys_meta_file(name, metaid, fileid, guid, path, sizes, create_user) values (@name, @metaid, @fileid, @guid, @path, @sizes, @create_user)";
        public static int CountFilesByGuid(string guid)
        /// <summary>
        /// 设置元数据
        /// </summary>
        private static void SetSysMeta(ObservableCollection<ViewData> viewDatas, string path, string ext)
        {
            string sql = "select count(*) from lf.sys_meta_file where guid=@guid";
            DbParameter dp = new NpgsqlParameter("@guid", guid);
            ViewData vd = new ViewData();
            vd.ID = viewDatas.Count + 1;
            vd.FilePath = path;
            vd.Ext = "." + ext;
            vd.Status = "准备";
            viewDatas.Add(vd);
            int rows = Helper.GetCount(sql, dp);
            SetSysMeta(vd);
            return rows;
            DirectoryInfo di = new DirectoryInfo(vd.FilePath);
            vd.Meta.name = di.Name;
            vd.Meta.type = ext;
        }
        public static int InsertMeta(SysMeta meta)
        /// <summary>
        /// 获取子文件
        /// </summary>
        private static void GetSubFiles(ObservableCollection<ViewData> viewDatas, string path)
        {
            // string sql = "INSERT INTO public.data_files(mid, guid, name, ext, path, subs, remark) VALUES (@mid, @guid, @name, @ext, @path, @subs, @remark) returning id";
            List<DbParameter> list = Tool.GetParams<SysMeta>(insertMeta, meta);
            string[] files = Directory.GetFiles(path);
            if (null == files || files.Length == 0) return;
            object obj = Helper.GetScalar(insertMeta, list.ToArray());
            foreach (string file in files)
            {
                string ext = Path.GetExtension(file).ToLower();
                if (!StaticData.ALL_EXTENSION.Contains(ext) || IsExcludeFile(file)) continue;
            return obj == null ? 0 : Convert.ToInt32(obj);
                ViewData vd = new ViewData();
                vd.ID = viewDatas.Count + 1;
                vd.FilePath = file;
                vd.Ext = ext;
                vd.Status = "准备";
                viewDatas.Add(vd);
                SetSysMeta(vd);
                FileInfo fi = new FileInfo(vd.FilePath);
                vd.Meta.name = fi.Name;
                vd.Meta.type = fi.Extension.ToLower().Replace(".", "");
            }
        }
        public static int InsertMetaFile(SysMetaFile metaFile)
        /// <summary>
        /// 设置元数据
        /// </summary>
        private static void SetSysMeta(ViewData vd)
        {
            List<DbParameter> list = Tool.GetParams<SysMetaFile>(insertMetaFile, metaFile);
            SysMeta meta = new SysMeta();
            meta.eventid = Guid.NewGuid().ToString();
            meta.metaid = 0;
            meta.verid = 0;
            meta.guid = null;
            meta.path = vd.FilePath; // *
            meta.sizes = GetFileSizes(vd);
            meta.tab = null;
            meta.rows = 0;
            meta.create_user = CommonProp.UserId;
            meta.create_time = DateTime.Now;
            meta.bak = null;
            meta.geom = null;
            meta.layer = null;
            meta.depcode = CommonProp.Depcode;
            meta.dircode = CommonProp.Dircode;
            meta.ismeta = 0;
            meta.sensortype = CommonProp.SensorType;
            meta.acq_time = CommonProp.AcqTime;
            object obj = Helper.ExecuteNonQuery(insertMetaFile, list.ToArray());
            return obj == null ? 0 : Convert.ToInt32(obj);
            vd.Meta = meta;
            vd.Sizes = meta.sizes;
        }
        public static void Import(ObservableCollection<ViewData> viewDatas, string source, string target)
        /// <summary>
        /// 获取文件大小
        /// </summary>
        private static double GetFileSizes(ViewData vd)
        {
            string[] files = Directory.GetFiles(source);
            if (File.Exists(vd.FilePath))
            {
                if (vd.Ext == StaticData.SHP)
                {
                    List<string> files = GetShpFiles(vd.FilePath);
                    return GetFileSizes(files.ToArray());
                }
                else
                {
                    FileInfo fi = new FileInfo(vd.FilePath);
                    return Tools.SizeToMb(fi.Length);
                }
            }
            if (Directory.Exists(vd.FilePath))
            {
                string[] files = Directory.GetFiles(vd.FilePath, "*", SearchOption.AllDirectories);
                return GetFileSizes(files);
            }
            return 0;
        }
        /// <summary>
        /// 获取文件大小
        /// </summary>
        private static double GetFileSizes(string[] files)
        {
            if (null == files || files.Length == 0) return 0;
            double sizes = 0;
            foreach (string file in files)
            {
                FileInfo fi = new FileInfo(file);
                sizes += Tools.SizeToMb(fi.Length);
            }
            return sizes;
        }
        /// <summary>
        /// 获取SHP文件集合
        /// </summary>
        private static List<string> GetShpFiles(string shpPath)
        {
            List<string> files = new List<string>();
            files.Add(shpPath);
            foreach (string ext in StaticData.SHP_EXT)
            {
                string file = shpPath.Replace(".shp", ext);
                if (File.Exists(file))
                {
                    files.Add(file);
                }
            }
            return files;
        }
        /// <summary>
        /// 是否为GDB文件
        /// </summary>
        private static bool IsGdbFile(string path)
        {
            if (!Directory.Exists(path)) return false;
            DirectoryInfo info = new DirectoryInfo(path);
            if (!info.Name.ToLower().EndsWith(StaticData.GDB)) return false;
            string gdb = Path.Combine(path, StaticData.NGDB);
            return File.Exists(gdb);
        }
        /// <summary>
        /// 是否为OSGB文件
        /// </summary>
        private static bool IsOsgbFile(string path)
        {
            if (!Directory.Exists(path)) return false;
            string meta = Path.Combine(path, "metadata.xml");
            string data = Path.Combine(path, "Data");
            return File.Exists(meta) && Directory.Exists(data);
        }
        /// <summary>
        /// 是/否为排除文件
        /// </summary>
        private static bool IsExcludeFile(string file)
        {
            bool isExclude = false;
            string name = Path.GetFileName(file).ToLower();
            foreach (string ext in StaticData.MAPPER_EXCLUDE_EXT)
            {
                if (name.EndsWith(ext))
                {
                    isExclude = true;
                    break;
                }
            }
            return isExclude;
        }
        /// <summary>
        /// 获取文件的MD5码
        /// </summary>
        private static string GetFileMD5(string file)
        {
            if ("1" != Tools.GetSetting("GetMD5") || !File.Exists(file)) return null;
            return MD5Helper.GetMD5Hash(file);
        }
        /// <summary>
        /// 获取多个文件的MD5码
        /// </summary>
        private static string GetFilesMD5(string path)
        {
            if ("1" != Tools.GetSetting("GetMD5") || !Directory.Exists(path)) return null;
            string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
            if (null == files || files.Length == 0) return null;
            List<string> list = new List<string>();
            foreach (string file in files)
            {
                string md5 = MD5Helper.GetMD5Hash(file);
                if (string.IsNullOrEmpty(md5)) list.Add(md5);
            }
            if (list.Count == 0) return null;
            string str = string.Join(",", list.ToArray());
            byte[] bytes = Encoding.Unicode.GetBytes(str);
            return MD5Helper.GetMD5Hash(bytes);
        }
        #endregion
        #region 导入
        /// <summary>
        /// 导入文件
        /// </summary>
        public static void ImportFiles(ObservableCollection<ViewData> viewDatas)
        {
            Parallel.ForEach(viewDatas, (vd, ParallelLoopState) =>
            {
                try
                {
                    //
                    SysMeta meta = new SysMeta();
                    //
                    int id = DBHelper.InsertMeta(meta);
                    vd.Status = id > 0 ? "成功。" : "失败!";
                }
                catch (Exception ex)
                {
                    LogOut.Error(ex.StackTrace);
                    vd.Status = string.Format("失败:{0}!", ex.Message);
                }
            });
        }
        /// <summary>
        /// 复制文件
        /// </summary>
        private static void CopyFile(string source, string target)
        {
            if (File.Exists(source))
            {
                File.Copy(source, target, true);
            }
        }
        public static void ImportFiles(ObservableCollection<ViewData> viewDatas, string target, int start)
        {
            /*Parallel.ForEach(viewDatas, (vd, ParallelLoopState) =>
            {
                try
                {
                    vd.Status = "生成MD5码...";
                    string guid = MD5Helper.GetMD5Hash(vd.FilePath);
                    if (!Exclusions.Contains(vd.Ext) && IsFileExists(guid))
                    {
                        vd.Status = "已存在!";
                        return;
                    }
                    vd.Status = "获取数据目录...";
                    int subPath = GetSubPath(target, start);
                    SysMeta mf = GetMetaFile(vd, subPath, guid);
                    vd.Status = "复制文件...";
                    CopyFile(vd.FilePath, Path.Combine(target, mf.path));
                    vd.Status = "准备入库";
                    vd.Meta = mf;
            });*/
        }
        public static void ImportFiles2(ObservableCollection<ViewData> viewDatas, string target)
        {
            int start = 1;
            foreach (ViewData vd in viewDatas)
            {
                try
                {
                    vd.Status = "插入数据库...";
                    start = GetSubPath(target, start);
                    SysMeta mf = GetMetaFile(vd, start, "");
                    int metaId = 0; // InsertMeta(mf);
                    if (metaId == 0)
                    {
                        vd.Status = "元数据出错!";
                        continue;
                    }
                    vd.Status = "复制文件...";
                    CopyFile(vd.FilePath, Path.Combine(target, mf.path));
                    vd.Status = "完成。";
                }
                catch (Exception ex)
                {
                    LogOut.Error(ex.Message + "\r\n" + ex.StackTrace);
                    vd.Status = "失败!";
                }
            }
        }
        private static int GetSubPath(string target, int start = 1)
        {
            while (true)
            {
                string path = Path.Combine(target, start.ToString());
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                    return start;
                }
                string[] files = Directory.GetFiles(path);
                if (files.Length < 2001)
                {
                    return start;
                }
                start++;
            }
        }
        private static SysMeta GetMetaFile(ViewData vd, int subPath, string guid)
        {
            SysMeta mf = new SysMeta();
            mf.eventid = Guid.NewGuid().ToString();
            mf.metaid = 0;
            //mf.dirid = vd.Meta.dirid;
            //mf.depid = vd.Meta.depid;
            mf.verid = vd.Meta.verid;
            mf.name = vd.Meta.name;
            mf.type = vd.Meta.type;
            mf.guid = guid;
            mf.path = subPath + "\\" + mf.name;
            mf.sizes = vd.Meta.sizes;
            mf.tab = null;
            mf.rows = 0;
            mf.create_user = vd.Meta.create_user;
            return mf;
        }
        #endregion
    }
}