# -*- coding: utf-8 -*-
"""第三批接线:①CreateXianghaoTable/CreateYuanjianTable 尾部重建全部触发器(兜底所有建表路径)
②EnterProjectCore 进项目时公式触发器自检 ③红绿"未保存"退役 ④保存按钮改实时保存提示
⑤撤销删除(项目库)后重建触发器 ⑥EnsureFormulaTriggers/保存提示 方法体"""
import io
ROOT = r"C:\Users\099978\Documents\SharpDevelop Projects\成套报价软件\成套报价软件"
n = 0
def edit(path, pairs, tag):
global n
s = io.open(path, encoding="utf-8-sig").read()
for old, new in pairs:
if old not in s:
if new in s:
print(tag, "已有(跳过):", old[:40].replace("\n", " "))
continue
raise AssertionError(tag + " 锚点缺失: " + old[:80])
s = s.replace(old, new, 1)
n += 1
io.open(path, "w", encoding="utf-8-sig").write(s)
print(tag, "ok")
# ① 两个建表函数尾部:重建全部触发器(幂等兜底,覆盖一切建表路径)
p1 = ROOT + r"\主窗口.菜单与库.cs"
edit(p1, [
(''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
}
catch { }
}
/// 按真实ID表名建一张空元件表。''',
''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
// ★ 公式触发器兜底:重建项目库全部触发器(幂等,新表即刻具备自动计算能力)
EnsureFormulaTriggersQuiet(projectId);
}
catch { }
}
/// 按真实ID表名建一张空元件表。'''),
(''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
}
catch { }
}
private void DeleteXianghao(string projectId, string tuhao, string xianghao)''',
''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
{
cmd.ExecuteNonQuery();
}
}
// ★ 公式触发器兜底:重建项目库全部触发器(幂等)
EnsureFormulaTriggersQuiet(projectId);
}
catch { }
}
private void DeleteXianghao(string projectId, string tuhao, string xianghao)'''),
# ⑤ 撤销删除(项目库快照还原)后重建触发器(快照库里的触发器可能是旧公式)
(''' // 快照 → 目标库
BackupSQLiteDb(snapPath, _undoTargetDbPath);''',
''' // 快照 → 目标库
BackupSQLiteDb(snapPath, _undoTargetDbPath);
// ★ 快照库的触发器可能是旧公式版本,还原后按当前公式表重建
if (!wasFak) EnsureFormulaTriggersQuiet(_undoProjectId);'''),
], "菜单与库.cs")
# ②⑥ 编辑直写库.cs:EnsureFormulaTriggers + 保存提示方法
p2 = ROOT + r"\编辑直写库.cs"
edit(p2, [
(''' /// 公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;''',
''' /// 公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;
/// 进项目/建表/撤销删除后:按公式表重建项目库全部触发器(幂等,安静模式只记日志)。
private void EnsureFormulaTriggersQuiet(string projectId)
{
try
{
if (string.IsNullOrWhiteSpace(projectId)) return;
string dbPath = GetQuoteDbPath(projectId);
if (!System.IO.File.Exists(dbPath)) return;
string fak = System.IO.Path.Combine(
System.IO.Path.GetDirectoryName(dbPath), "fak.db");
using (var conn = new System.Data.SQLite.SQLiteConnection(GetConnStringStatic(dbPath)))
using (var fakConn = new System.Data.SQLite.SQLiteConnection(GetConnStringStatic(fak)))
{
conn.Open();
fakConn.Open();
计算引擎.EnsureFormulaTable(fakConn);
计算引擎.重建项目全部触发器(conn, null, TuhaoTableName, fakConn);
}
Log("[公式触发器] 已按公式表重建 [" + projectId + "] 全部触发器");
}
catch (Exception ex) { Log("[公式触发器] 重建失败(不影响编辑,但派生列不会自动算): " + ex.Message); }
}
/// 保存按钮(功能区"保存"):实时架构下数据已在库,只刷跨库项目汇总并提示。
private void 保存按钮_实时保存提示()
{
try { 计算引擎.刷新项目汇总(GetQuoteDbPath(_currentProjectId), _currentProjectId, TuhaoTableName); }
catch (Exception ex) { Log("[保存] 刷新项目汇总异常: " + ex.Message); }
SetStatus("数据已实时保存在数据库");
MessageBox.Show(this, "数据已实时保存在数据库:\\n编辑即写库,价格由数据库触发器自动计算,无需手动保存。",
"保存", MessageBoxButtons.OK, MessageBoxIcon.Information);
}'''),
], "编辑直写库.cs")
# ②③④ 主窗口.cs + 公式重算.cs
p3 = ROOT + r"\主窗口.cs"
edit(p3, [
# EnterProjectCore:进项目自检(幂等重建)
(''' private void EnterProjectCore(string pid)
{
Log("[EnterProjectCore] 开始进入项目 [" + pid + "], _isTabSyncing=" + _isTabSyncing);''',
''' private void EnterProjectCore(string pid)
{
Log("[EnterProjectCore] 开始进入项目 [" + pid + "], _isTabSyncing=" + _isTabSyncing);
// ★ 公式触发器自检:按公式表重建该项目库全部触发器(幂等;老库补装/公式变更生效)
EnsureFormulaTriggersQuiet(pid);'''),
], "主窗口.cs")
p4 = ROOT + r"\主窗口.公式重算.cs"
edit(p4, [
# 红绿"未保存"退役(实时架构库里永远最新)
(''' dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
标记未保存(); // 状态栏:保存状态置"未保存"''',
''' dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
// ★ 直写库架构:编辑即写库,不再有"未保存"状态'''),
], "公式重算.cs")
p5 = ROOT + r"\MainForm.cs"
edit(p5, [
# 保存按钮 → 实时保存提示
(''' case "button17": SaveAllToDatabase(); break; // 保存''',
''' case "button17": 保存按钮_实时保存提示(); break; // 保存(实时架构:提示+刷项目汇总)'''),
], "MainForm.cs")
print("合计", n, "处")