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.
 
 
 
 
 
 

332 lines
12 KiB

using CounsellorBL;
using CounsellorBL.GROUP.ConstDefinition;
using Newtonsoft.Json;
using OT.COM.ArsenalDB;
using OT.COM.ArsenalDB.SQL;
using SoldierData.EnterprizeV4;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace TransporterAP
{
public class ExportImport : DBService
{
List<string> lsDeleteSeq = new List<string>() {
"Gen_tb_ord_purchase_detail", // BranchID
"Gen_tb_ord_incoming_return_record", // OrderMstIDs => GROUP_UID
"Gen_tb_ord_order_detail", // MemberID
"Gen_tb_ord_order_master", // GROUP_UID
"Gen_tb_meb_shopping_points_record", // MemberID
"Gen_tb_grp_comment", // ArticleID
"Gen_tb_prd_article2product", // ArticleID
"Gen_tb_ord_purchase", // MemberID
"Gen_tb_ord_checkout_list_detail", // MemberID
"Gen_tb_prd_product", // GROUP_UID
"Gen_tb_grp_article_media", // ArticleID
"Gen_tb_ord_message_log_record", // MemberID
"Gen_tb_ord_checkout_list_master", // GROUP_UID
"Gen_tb_grp_article", // GROUP_UID
"Gen_tb_hr_employee2branch", // BranchID
"Gen_tb_ord_message_log", // BranchID
"Gen_tb_meb_member", // FBID
"Gen_tb_sys_uploadlog", // ArticleMediaMediaID => ArticleID
"Gen_tb_sys_user2role", // ROLE_UID => GROUP_UID
"Gen_tb_grp_group2user", // GROUP_UID
"Gen_tb_hr_employee", // Employee2BranchID => BranchID
"Gen_tb_grp_branch", // GROUP_UID
"Gen_tb_sys_role2org", // RoleIDs => GROUP_UID
"Gen_tb_sys_role", // GROUP_UID
"Gen_tb_grp_group", // GROUP_NAME
"Gen_tb_sys_user2entercode", // EmployeeID => Employee2BranchID => BranchID
"Gen_tb_sys_user" // EmployeeIDs => Employee2BranchID => BranchID
};
public override string MainTable => throw new NotImplementedException();
private SQLLib _GetSQLLib() => new SQLLib(new MSSQLDirectSQLHelper());
public string ImportFiles(string i_sExportFolderPath)
{
string sMsg = null;
Logger.Debug($"ImportFiles Start {DateTime.Now}");
try
{
do
{
List<string> lsInsert = new List<string>(lsDeleteSeq);
lsInsert.Reverse();
foreach (string sFunctionName in lsInsert)
{
string sTableName = sFunctionName.Substring(4);
Type tCur = _GetEntityType(sTableName);
int nBatchCount = 0;
while(true)
{
string sFilePath = $"{Path.Combine(i_sExportFolderPath, sTableName)}.{nBatchCount}";
if(!File.Exists(sFilePath))
{
break;
}
MethodInfo[] amiMethods = typeof(JsonConvert).GetMethods();
MethodInfo miFid = amiMethods.FirstOrDefault(f => f.Name == "DeserializeObject" && f.IsGenericMethod && f.GetParameters().Length == 1);
// MethodInfo miFid = amiMethods.FirstOrDefault(f => f.Name == "DeserializeObject" );
//
Type generic = typeof(List<>);
Type[] typeArgs = { tCur };
Type constructed = generic.MakeGenericType(typeArgs);
string sContent = File.ReadAllText(sFilePath, Encoding.UTF8);
object oResult = miFid.MakeGenericMethod(constructed).Invoke(null, new object[] { sContent });
IEnumerable myList = oResult as IEnumerable;
List<Command> lcInsert = new List<Command>();
foreach (object o in myList)
{
Command cInsert = Command.SetupInsertCmd(o as EntityBase);
lcInsert.Add(cInsert);
}
if (lcInsert.Any())
{
ArsenalInterface ai = ArsenalDBMgr.GetInst(lcInsert[0], GetDefaultSystemColumnInfo());
ai.RunEditCmds(lcInsert);
}
nBatchCount++;
}
}
}
while (false);
}
catch (Exception ex)
{
sMsg = ex.Message;
}
Logger.Debug($"ImportFiles End {DateTime.Now}");
return sMsg;
}
public string ExportFiles(string i_sExportFolderPath, List<object> i_asGroupName)
{
string sMsg = null;
System.Diagnostics.Debug.WriteLine(DateTime.Now);
try
{
do
{
if(!Directory.Exists(i_sExportFolderPath))
{
Directory.CreateDirectory(i_sExportFolderPath);
}
foreach (string sFunctionName in lsDeleteSeq)
{
sMsg = _GetSQLLib().GetUIDs(SQLLib.Action.SELECT_ALL, sFunctionName, i_asGroupName, out Command o_cCmd);
if (sMsg != null)
{
break;
}
ArsenalInterface ai = ArsenalDBMgr.GetInst(o_cCmd, GetDefaultSystemColumnInfo());
string sTableName = sFunctionName.Substring(4);
Type tCur = _GetEntityType(sTableName);
MethodInfo[] mis = ai.GetType().GetMethods();
MethodInfo miFid = new List<MethodInfo>(mis).FirstOrDefault(f => f.Name == "RunQueryList" && f.GetParameters().Length == 4);
object oResult = miFid.MakeGenericMethod(tCur).Invoke(ai, new object[] { o_cCmd, null, -1, -1 });
string sPath = Path.Combine(i_sExportFolderPath, sTableName);
IEnumerable myList = oResult as IEnumerable;
IEnumerator it = myList.GetEnumerator();
int nBatchCount = 0;
List<object> lTemp = new List<object>();
while(it.MoveNext())
{
lTemp.Add(it.Current);
if(lTemp.Count == 10000)
{
makeFile(sPath, nBatchCount, lTemp);
nBatchCount++;
lTemp.Clear();
}
}
if(lTemp.Any())
{
makeFile(sPath, nBatchCount, lTemp);
}
}
}
while (false);
}
catch (Exception ex)
{
sMsg = ex.Message;
}
System.Diagnostics.Debug.WriteLine(DateTime.Now);
return sMsg;
}
protected string makeFile(string i_sFilePath, int i_nBatchID, List<object> i_loData )
{
string sMsg = null;
string sPath = $"{i_sFilePath}.{i_nBatchID}";
if (File.Exists(sPath))
{
File.Delete(sPath);
}
File.WriteAllText(sPath, JsonConvert.SerializeObject(i_loData), Encoding.UTF8);
return sMsg;
}
public string Delete( List<object> i_asGroupName)
{
string sMsg = null;
Logger.Debug($"Delete start {DateTime.Now}");
try
{
do
{
Dictionary<string, Command> dicSelect = new Dictionary<string, Command>();
List<Command> lcDelete = new List<Command>();
foreach (string sFunctionName in lsDeleteSeq)
{
sMsg = _GetSQLLib().GetUIDs(SQLLib.Action.SELECT_IDONLY, sFunctionName, i_asGroupName, out Command o_cSelect);
if (sMsg != null)
{
break;
}
dicSelect.Add(sFunctionName, o_cSelect);
sMsg = _GetSQLLib().GetUIDs(SQLLib.Action.DELETE, sFunctionName, i_asGroupName, out Command o_cCmd);
if (sMsg != null)
{
break;
}
lcDelete.Add(o_cCmd);
}
if(!lcDelete.Any())
{
break;
}
// Store User
_GetSQLLib().GetUIDs(SQLLib.Action.SELECT_ALL, "Gen_tb_sys_user", i_asGroupName, out Command o_cSelectUser);
ArsenalInterface ai = ArsenalDBMgr.GetInst(o_cSelectUser, GetDefaultSystemColumnInfo());
List<tb_sys_user> luUsers = ai.RunQueryList<tb_sys_user>(o_cSelectUser);
foreach (tb_sys_user u in luUsers)
{
if (u.account != "Admin")
{
lcDelete.Add(Command.SetupDeleteCmd(new tb_sys_user2entercode() { user_uid = u.uid }));
lcDelete.Add(Command.SetupDeleteCmd(new tb_sys_user() { uid = u.uid }));
}
}
Dictionary<string, long> dicBefore = Count(ai, dicSelect);
int nRunValue = ai.RunEditCmds(lcDelete);
Dictionary<string, long> dicAfter = Count(ai, dicSelect);
long nCount = 0;
foreach(KeyValuePair<string, long> kvpBefore in dicBefore)
{
if(dicAfter.ContainsKey(kvpBefore.Key))
{
Logger.Debug($"{kvpBefore.Key} {kvpBefore.Value} => {dicAfter[kvpBefore.Key]}");
nCount += kvpBefore.Value - dicAfter[kvpBefore.Key];
}
else
{
Logger.Debug($"{kvpBefore.Key} {kvpBefore.Value} => Not found");
}
}
Logger.Debug($"RunValue={nRunValue}, nCount={nCount}");
}
while (false);
}
catch (Exception ex)
{
sMsg = ex.Message;
}
Logger.Debug($"Delete end {DateTime.Now}");
return sMsg;
}
protected Dictionary<string, long> Count(ArsenalInterface ai, Dictionary<string, Command> i_dicSelect)
{
Dictionary<string, long> dicResult = new Dictionary<string, long>();
foreach(KeyValuePair<string, Command> kvp in i_dicSelect)
{
QueryDataSet qds = ai.RunQueryDataSet(kvp.Value);
if (qds.IsSuccess)
{
dicResult.Add(kvp.Key, qds.Total);
}
}
return dicResult;
}
}
}