基线:全量源码首提(D1 版本控制落地,含第一轮优化 B1-B4/A1/A4/缩放修复)
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
# -*- 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 { }
|
||||
}
|
||||
|
||||
/// <summary>按真实ID表名建一张空元件表。</summary>''',
|
||||
''' using (var cmd = new System.Data.SQLite.SQLiteCommand(sql, conn))
|
||||
{
|
||||
cmd.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
// ★ 公式触发器兜底:重建项目库全部触发器(幂等,新表即刻具备自动计算能力)
|
||||
EnsureFormulaTriggersQuiet(projectId);
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
/// <summary>按真实ID表名建一张空元件表。</summary>'''),
|
||||
(''' 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, [
|
||||
(''' /// <summary>公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。</summary>
|
||||
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;''',
|
||||
''' /// <summary>公式表缓存(管线建触发器时用;图号粘贴管线开头加载)。</summary>
|
||||
private List<公式条目> _公式_元件, _公式_箱号, _公式_图号;
|
||||
|
||||
/// <summary>进项目/建表/撤销删除后:按公式表重建项目库全部触发器(幂等,安静模式只记日志)。</summary>
|
||||
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); }
|
||||
}
|
||||
|
||||
/// <summary>保存按钮(功能区"保存"):实时架构下数据已在库,只刷跨库项目汇总并提示。</summary>
|
||||
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, "处")
|
||||
Reference in New Issue
Block a user