Commit Graph

10 Commits

Author SHA1 Message Date
Misaka_Company
6cf37e3d8d 修复 169 共享访问:访问源文件前显式以 169\Administrator 建 SMB 连接
169 只认识自身账户,不认识 114 本地账户(peng/svc_app/LocalSystem 计算机账户),
直接读 UNC 导致持续 WinError 5 拒绝访问、同步中断。
- 新增 source_watcher.ensure_share_connected:run_once 访问 UNC 前用 net use
  以配置凭据(169\Administrator, 空密码, 169 允许空密码网络登录)建连;
  先 delete 旧连接避免用户名冲突;建连失败仅告警,交给既有跳过逻辑。
- 凭据通过 config source_share 段配置(含空密码);config.yaml 仍被 gitignore。
- 本地 dry-run 验证:建连成功、源文件可下载(13647 行)、清洗后保留 13606 行。
2026-07-29 16:43:19 +08:00
Misaka_Company
75ed7c775e 新增导入前数据清洗:按创建时间筛选(丢弃<2026-01-01, 配置化)
- 新增 src/data_filter.py:filter_records 按 cfg['filter'] 筛选,字段值
  >= start_date 保留;drop_if_missing 时缺失/解析失败的行一并丢弃;
  配置缺失或 start_date 非法时安全降级为不筛选(不崩、不误删)。
- runner.run_once:parse_excel 之后、sync_all(及 dry-run) 之前插入
  records = data_filter.filter_records(...),SQL Server 与 Access 同时生效。
- config 新增 filter 段(field/start_date/drop_if_missing);config.yaml 被
  .gitignore 忽略不入库,部署时需并入 114 的 config(仅新增该段)。
- 本机实跑 + 共享 SQL Server 实库验证:35389→12918,22471 行<2026-01-01
  已清零,MIN(创建时间)=2026-01-04,PASS。
2026-07-21 17:26:15 +08:00
Misaka_Company
0750f4c41d 日志按天管理:新增 DailyFileHandler 自动归档历史日志
需求:每天一个日志;历史日志重命名加时间戳后缀并归档;
日志根目录只保留当天文件;已产生的日志全部放进根目录下的
Archive 文件夹。

实现(src/runner.py):
- 新增 DailyFileHandler(logging.FileHandler):
  · 当天写入 <log_dir>/sync.log(根目录只留当天文件)。
  · 跨天或进程启动时,旧 sync.log 重命名为 sync_YYYYMMDD.log
    并移入 <log_dir>/Archive/ 归档。
  · emit 时若日期变化自动滚动;额外提供 maybe_rollover()
    供主循环每轮主动检查,保证跨天必切(即使本轮无日志输出)。
- setup_logging 改为幂等:清掉已有 handler 再添加,避免重复日志行
  (此前 setup_logging 被多次调用会产生重复行,现已免疫)。
- main 循环每轮调用 maybe_rollover,跨天切换时记一行
  “日志已切换到新的一天,旧日志归档至 Archive/”。

验证:本地 4 项单测全绿(启动归档旧文件 / 当天写入 /
跨天主动滚动 / 同天不滚动)。
2026-07-16 09:22:56 +08:00
Misaka_Company
5e3c5d5b31 修复 169 源文件瞬态导致的 “File is not a zip file”
根因:源 Excel 常被打开/保存,download 在拷贝瞬间抓到 0 字节或
残缺文件,openpyxl 解析即报 “File is not a zip file”;且 runner 在
download 之后、parse 之前就无条件 save_baseline,把 size=0 的瞬态
源记成 “已处理”,污染基线。

修复:
- source_watcher.download:下载后校验(非空 + ZIP 头 PK),不合法
  则删除并重试(默认 3 次,间隔 3s 等待源落盘)。
- source_watcher.has_changed:源不可达时优雅跳过本轮(WARNING),
  不再每轮刷 traceback(169 间歇不可达为已知问题)。
- runner.run_once:save_baseline 移到整轮(解析+写库)成功之后,
  杜绝把损坏/瞬态源记为已处理。
2026-07-15 16:53:37 +08:00
Misaka_Company
85ae96557e 修复 Access CSV 导入 -5402:schema.ini 改用 ASCII 字段名(F1..Fn)
根因:真实 114 生产表为中文列名,schema.ini 里写中文列名(如
Col2=物料编码 Text Width 255)被 Text ISAM 按系统 ANSI 解析,与
UTF-8 数据的 CharacterSet=65001 冲突,导致 -5402 ColN 选项无效
(本地 ADOX 测试表为 ASCII 列名故未复现)。

修复:schema.ini 字段名一律改为 ASCII(F1,F2,...),真实中文列名
只保留在 INSERT/SELECT 的 SQL 中(走 ODBC Unicode,无编码问题)。
类型仍只用 Text ISAM 永远合法的 DateTime / Text Width 255。
SCHEMA_INI_DUMP 诊断降级为 DEBUG 级别(生产日志默认不打印)。
2026-07-15 16:36:18 +08:00
Misaka_Company
19c04f2326 加固 Access CSV 导入的 schema 类型映射,杜绝 -5402 非法选项
- _schema_type 只可能输出两种 Access Text ISAM 永远接受的合法值:
  日期/时间列 -> DateTime;其余(文本/数值/布尔) -> Text Width 255
  (插入时 Access 按目标列真实类型自动强制转换,无需精确声明)
- 删除不再使用的 _TYPE_MAP 死代码
- 修正一处误删导致的缩进错误
- 本地集成测试(真实 sync_access, 35043 行, 含 GBK 外字符 ø)通过
2026-07-15 16:17:56 +08:00
Misaka_Company
7c849883e4 修复 Access CSV 导入编码:数据 UTF-8 + schema.ini cp936
- 真数据含 GBK 外字符(如 ø),原 cp936 写 CSV 触发 UnicodeEncodeError
- 数据 CSV 改 UTF-8 + schema.ini CharacterSet=65001(覆盖全部 Unicode)
- schema.ini 列名是中文,Access Text ISAM 按系统 ANSI(cp936) 读 ini,故 ini 仍用 cp936 写(仅数据文件用 UTF-8)
- _schema_type 列宽为 None 时兜底 255(规避 Text Width 0 非法)
- 本地集成测试(真实 sync_access, 35043 行, 含 ø)通过:行数+校验和一致
2026-07-15 16:09:49 +08:00
Misaka_Company
5de1d4ee51 优化 Access 全量写入:executemany 改为 CSV+Text 驱动单语句批量导入
- 根因:ACE/Jet 的 executemany 在网络盘(E:)上逐行落地,每行一次往返,35043 行约 10 分钟
- UNION ALL 参数化受 Jet 查询复杂度上限封死(查询过于复杂 -3071),不可用
- 改用官方 Text 导入路径:写入临时 Tab 分隔 CSV(GBK/cp936) + 动态 schema.ini,单条 INSERT...SELECT FROM [Text;...] 整批写入,往返从 35043 次压成 1 次
- 保留正确性保障:列约束值清洗(截断/夹日期) + 写入后 COUNT(*) 核对 + 不足时逐行回退并精确记录失败行
- 本地集成测试(真实 sync_access,35043 行)通过:行数+校验和完全一致
2026-07-15 16:03:12 +08:00
Misaka_Company
eecea44746 修复 Access 全量同步静默丢行问题
- sync_access 改为事务化(去 autocommit,失败回滚),杜绝前段已提交、错误被吞导致日志谎报完成
- 写入前按 Access 列约束做值清洗:VARCHAR 按列宽截断、DATETIME 夹到合法范围,从根消除驱动拒写
- 写入后强制 SELECT COUNT(*) 核对实际行数;不足则 DELETE 后逐行回退插入并精确记录失败行号
- 修复后两端均落 35043 行,SQL Server 与 Access 校验和一致
2026-07-15 15:31:24 +08:00
Misaka_Company
5ae7acffde 初始化项目:数据同步服务源码与文档
- src: config_loader / source_watcher / excel_parser / sync_writer / runner
- 169 Excel 全量同步至 114 SQL Server + Access 生产库
- 新增 .gitignore(忽略 venv、日志、数据、含凭据的 config.yaml 等)
- 新增 README.md(用途、安装、配置、运行模式、部署说明)
2026-07-15 14:14:39 +08:00