using FLY.OBJComponents.Server;
using FLY.OBJComponents.Server.Model;
using FLY.Thick.Blowing.IService;
using FLY.Thick.Blowing.IService.IShareDBServicePack;
using FLY.Thick.Blowing.Server.Model;
using FObjBase;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FLY.Thick.BlowingScan.Server.Model
{
///
/// 对数据库写入操作
///
public class HistoryDb : IShareDbService
{
DbModel dbModel;
OrgDbModel orgDbModel;
public LocalDb localDb;
public BufferError ErrorBuffer;
#region IDBShareService
///
/// 产品改变事件
///
public event ProfileChangedEventHandler ProfileChanged;
///
/// 扫描图改变事件
///
public event ScanDataChangedEventHandler ScanDataChanged;
#endregion
///
///
///
/// 数据库对象
/// 原始数据.数据库对象
/// 数据库的本地版
public void Init(DbModel dbModel, OrgDbModel orgDbModel, LocalDb localDb)
{
this.dbModel = dbModel;
this.orgDbModel = orgDbModel;
this.localDb = localDb;
ErrorBuffer = new BufferError();
ErrorBuffer.Init(dbModel.TbError);
}
///
/// 按时间删除数据库
///
///
public void KeepDBSize(int month)
{
if (month <= 3)
month = 3;
DateTime del_time = DateTime.Now - TimeSpan.FromDays(month * 30);
string det_time_str = del_time.ToStringOfSQLiteFieldType();
List sqls = new List();
sqls.Add(
$"DELETE FROM {dbModel.TbProfile.TableName}" +
$" WHERE EndTime < {det_time_str}");
sqls.Add(
$"DELETE FROM {dbModel.TbScanData.TableName}" +
$" WHERE Time < {det_time_str}");
sqls.Add(
$"DELETE FROM {dbModel.TbError.TableName}" +
$" WHERE Time < {det_time_str}");
sqls.Add(
$"DELETE FROM {dbModel.TbTrendData.TableName}" +
$" WHERE Time < {det_time_str}");
sqls.Add(
$"DELETE FROM {dbModel.TbSample.TableName}" +
$" WHERE Time < {det_time_str}");
dbModel.sqliteHelper.QueryTran(sqls);
}
///
/// 按时间删除数据库
///
public void KeepOrgDbSize(int day)
{
if (day <= 2)
day = 2;
DateTime del_time = DateTime.Now - TimeSpan.FromDays(day);
string det_time_str = del_time.ToStringOfSQLiteFieldType();
List sqls = new List();
sqls.Add(
$"DELETE FROM {orgDbModel.TbSign.TableName}" +
$" WHERE Time < {det_time_str}");
sqls.Add(
$"DELETE FROM {orgDbModel.TbRoll.TableName}" +
$" WHERE Time < {det_time_str}");
sqls.Add(
$"DELETE FROM {orgDbModel.TbOrgScanData.TableName}" +
$" WHERE Time < {det_time_str}");
orgDbModel.sqliteHelper.QueryTran(sqls);
}
///
/// 保存产品参数
///
public void AddProfile(
Db_Profile profile
)
{
//把上一次结束掉
if ((localDb.CurrProfile != null) && localDb.IsProfileFinished == false)
{
FinishProfile();
}
//添加 数据库必要的 field
localDb.ProfileStartTime = DateTime.Now;
localDb.ProfileEndTime = DateTime.Now;
localDb.IsProfileFinished = false;
profile.ID = dbModel.TbProfile.FreeID;
profile.StartTime = localDb.ProfileStartTime;
profile.EndTime = localDb.ProfileEndTime;
//SQL
List sqls = new List();
sqls.Add(SQLiteHelper.GetInsertCommandText(profile));
dbModel.sqliteHelper.QueryTranAsync(sqls);
//本地数据备份
localDb.CurrProfile = profile;
#region IDBShareService
ProfileChanged?.Invoke(this, new ProfileChangedEventArgs()
{
isInsert = true,
profile = profile
});
#endregion
}
///
/// 修改产品参数
///
///
public void UpdateProfile(
Db_Profile profile
)
{
//添加 数据库必要的 field
profile.ID = localDb.CurrProfile.ID;
profile.StartTime = localDb.ProfileStartTime;
profile.EndTime = localDb.ProfileEndTime;
//SQL
List sqls = new List();
sqls.Add(SQLiteHelper.GetUpdateCommandText(profile, $"WHERE ID = {profile.ID}"));
dbModel.sqliteHelper.QueryTranAsync(sqls);
//本地数据备份
localDb.CurrProfile = profile;
#region IDBShareService
ProfileChanged?.Invoke(this, new ProfileChangedEventArgs()
{
isInsert = false,
profile = profile
});
#endregion
}
///
/// 下辊,结束当前产品生产
///
public void FinishProfile()
{
if (localDb.CurrProfile == null)
return;
//SQL
dbModel.sqliteHelper.ExecuteNonQuery(
$"UPDATE {dbModel.TbProfile.TableName} SET IsFinished = {true} WHERE ID = {localDb.CurrProfile.ID}");
localDb.IsProfileFinished = true;
localDb.CurrProfile.IsFinished = true;
#region IDBShareService
ProfileChanged?.Invoke(this, new ProfileChangedEventArgs()
{
isInsert = false,
profile = localDb.CurrProfile
});
#endregion
}
///
/// 不需设置 DB_ScanData 内 ProfileID, 自动设置!
///
public void AddScanData(
Lc_ScanData scanData)
{
bool updateEnd = false;
//添加 数据库必要的 field
scanData.ID = dbModel.TbScanData.FreeID;
if (localDb.ProfileEndTime < scanData.Time)
{
localDb.ProfileEndTime = scanData.Time;
updateEnd = true;
}
//SQLs
List sqls = new List();
var db_scandata = Lc_AutoMapperProfile.Mapper.Map(scanData);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_scandata));
if (updateEnd)
{
string s_endtime = localDb.ProfileEndTime.ToStringOfSQLiteFieldType();
sqls.Add($"UPDATE {dbModel.TbProfile.TableName} SET EndTime={s_endtime} WHERE ID = {localDb.CurrProfile.ID}");
}
dbModel.sqliteHelper.QueryTranAsync(sqls);
//本地数据备份
localDb.CurrProfile.EndTime = localDb.ProfileEndTime;
#region IDBShareService
ScanDataChanged?.Invoke(this, new ScanDataChangedEventArgs()
{
isInsert = true,
scandata = scanData
});
if (updateEnd)
{
ProfileChanged?.Invoke(this, new ProfileChangedEventArgs()
{
isInsert = false,
profile = localDb.CurrProfile
});
}
#endregion
}
///
/// 不需设置 DB_TrendData 内 ProfileID, 自动设置!
///
public void AddTrendData(
Lc_TrendData trendData)
{
bool updateEnd = false;
//添加 数据库必要的 field
trendData.ID = dbModel.TbTrendData.FreeID;
if (localDb.ProfileEndTime < trendData.Time)
{
localDb.ProfileEndTime = trendData.Time;
updateEnd = true;
}
//SQLs
List sqls = new List();
var db_trenddata = Lc_AutoMapperProfile.Mapper.Map(trendData);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_trenddata));
if (updateEnd)
{
string s_endtime = localDb.ProfileEndTime.ToStringOfSQLiteFieldType();
sqls.Add($"UPDATE {dbModel.TbProfile.TableName} SET EndTime={s_endtime} WHERE ID = {localDb.CurrProfile.ID}");
}
dbModel.sqliteHelper.QueryTranAsync(sqls);
//本地数据备份
localDb.CurrProfile.EndTime = localDb.ProfileEndTime;
#region IDBShareService
if (updateEnd)
{
ProfileChanged?.Invoke(this, new ProfileChangedEventArgs()
{
isInsert = false,
profile = localDb.CurrProfile
});
}
#endregion
}
///
/// 需要通过 ID才能更新
///
public void UpdateScanData(
Lc_ScanData scanData)
{
//添加 数据库必要的 field
//SQLs
List sqls = new List();
var db_scandata = Lc_AutoMapperProfile.Mapper.Map(scanData);
sqls.Add(SQLiteHelper.GetUpdateCommandText(db_scandata, $"WHERE ID = {scanData.ID}"));
dbModel.sqliteHelper.QueryTranAsync(sqls);
#region IDBShareService
ScanDataChanged?.Invoke(this, new ScanDataChangedEventArgs()
{
isInsert = false,
scandata = scanData
});
#endregion
}
///
///
///
///
public void AddErrorData(
DB_Error db_errorData
)
{
//添加 数据库必要的 field
db_errorData.ID = dbModel.TbError.FreeID;
//SQLs
List sqls = new List();
sqls.Add(SQLiteHelper.GetInsertCommandText(db_errorData));
dbModel.sqliteHelper.QueryTranAsync(sqls);
}
#region 原始数据
///
/// 记录 原始数据.转向信号
///
///
public void AddSignData(
Lc_Sign lc_Sign
)
{
lc_Sign.ID = orgDbModel.TbSign.FreeID;
//SQLs
List sqls = new List();
var db_Sign = FLY.Thick.Blowing.Server.Model.OrgLc_AutoMapperProfile.Mapper.Map(lc_Sign);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_Sign));
orgDbModel.sqliteHelper.QueryTranAsync(sqls);
}
///
/// 记录 原始数据.辊信号
///
///
public void AddRollData(
Lc_Roll lc_Roll
)
{
lc_Roll.ID = orgDbModel.TbRoll.FreeID;
//SQLs
List sqls = new List();
var db_Roll = FLY.Thick.Blowing.Server.Model.OrgLc_AutoMapperProfile.Mapper.Map(lc_Roll);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_Roll));
orgDbModel.sqliteHelper.QueryTranAsync(sqls);
}
///
/// 记录 原始数据.扫描数据
///
///
public void AddOrgScanDatas(
List lc_OrgScanDatas
)
{
//SQLs
List sqls = new List();
foreach (var lc_OrgScanData in lc_OrgScanDatas)
{
lc_OrgScanData.ID = orgDbModel.TbOrgScanData.FreeID;
var db_OrgScanData = OrgLc_AutoMapperProfile.Mapper.Map(lc_OrgScanData);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_OrgScanData));
}
orgDbModel.sqliteHelper.QueryTranAsync(sqls);
}
///
/// 记录 原始数据.样品
///
///
public void AddSampleData(
Lc_Sample lc_Sample
)
{
lc_Sample.ID = dbModel.TbSample.FreeID;
//SQLs
List sqls = new List();
var db_Sample = Lc_AutoMapperProfile.Mapper.Map(lc_Sample);
sqls.Add(SQLiteHelper.GetInsertCommandText(db_Sample));
dbModel.sqliteHelper.QueryTranAsync(sqls);
}
#endregion
#region IDBShareService
public void GetProfile(AsyncCBHandler asyncDelegate, object asyncContext)
{
if (localDb.CurrProfile != null)
{
asyncDelegate.Invoke(asyncContext, localDb.CurrProfile);
}
else
{
asyncDelegate.Invoke(asyncContext, null);
}
}
#endregion
}
}