《断网不丢日志,多机共享工单:高速龙门贴片机实战沉淀 SQLite + MySQL 双库分层架构实战-无硬件 Mock 可直接运行》
前言原单库版本拆分双存储职责,适配业务需求上面的可视化架构图帮你快速理解整个设计的核心思路:一句话总结:把"容易丢、要速度"的日志交给本地 SQLite,把"要共享、要统计"的工单交给服务端 MySQL,两者通过Service 接口层完全解耦,ViewModel 里一行 SQL 都没有。一、项目基础信息1. 目标框架TargetFrameworknet6.0-windows/TargetFramework UseWPFtrue/UseWPF2. 完整 NuGet 包清单(固定版本,一键批量安装)NuGet 控制台批量指令# MVVM核心 Install-Package CommunityToolkit.Mvvm -Version 8.2.2 # DI容器 Install-Package Microsoft.Extensions.DependencyInjection -Version 8.0.1 # EF Core核心 Install-Package Microsoft.EntityFrameworkCore -Version 8.0.1 # SQLite本地日志库 Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 8.0.1 # MySQL生产业务库 Install-Package Pomelo.EntityFrameworkCore.MySql -Version 8.0.1 # EF迁移工具 Install-Package Microsoft.EntityFrameworkCore.Tools -Version 8.0.1csproj 包引用片段ItemGroup PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" / PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" / PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.1" / PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" / PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.1" / PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1" PrivateAssets="all" / /ItemGroup二、五层架构总览(双数据库改造点标注)基于 3 台量产龙门贴片机实战沉淀分层架构,严格遵循上层依赖下层,下层禁止反向依赖,Service 层通过回调 / 事件上报状态解耦循环依赖。目录结构(新增数据库相关目录)SMTMachineDemo/ ├─ HAL/ # 雷赛运动卡原生封装 │ └─ Dmc3000Native.cs ├─ Core/ │ ├─ Calibration/ # 九点标定算法 │ │ └─ MatrixTransform.cs │ ├─ DbContext/ # 双数据库上下文 │ │ ├─ SqliteLogDbContext.cs │ │ └─ MysqlProductionDbContext.cs │ └─ Entity/ # 双库实体 │ ├─ LogRecord.cs # SQLite日志表实体 │ └─ ProductionBatch.cs # MySQL生产批次实体 ├─ Models/ # 硬件状态数据模型 │ ├─ AxisStatus.cs │ └─ AxisStatusEventArgs.cs ├─ Services/ │ ├─ Interfaces/ │ │ ├─ IMotionService.cs │ │ ├─ ICameraService.cs │ │ ├─ ILogService.cs # 日志服务接口(SQLite实现) │ │ └─ IProductionService.cs # 生产数据接口(MySQL实现) │ ├─ MockMotionService.cs │ ├─ MockCameraService.cs │ ├─ MockLogService.cs # 内存模拟日志(无数据库演示) │ ├─ SqliteLogService.cs # SQLite持久化日志实现 │ ├─ MockProductionService.cs # 模拟生产数据 │ └─ MysqlProductionService.cs # MySQL真实生产库实现 ├─ ViewModels/ │ ├─ ViewModelBase.cs │ └─ MainViewModel.cs ├─ Converters/ │ └─ CollectionToStringConverter.cs ├─ App.xaml ├─ App.xaml.cs # DI注册双数据库、模拟/真机切换 └─ MainWindow.xaml三、分层完整可运行源码3.1 Core 数据库实体 DbContextCore/Entity/LogRecord.cs(SQLite 本地日志表)using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; namespace SMTMachineDemo.Core.Entity; /// summary /// SQLite本地日志记录实体,断电不丢失 /// /summary [Index(nameof(CreateTime))] public class LogRecord { [Key] public long Id { get; set; } /// summary日志内容/summary public string Content { get; set; } = string.Empty; /// summary记录时间戳/summary public DateTime CreateTime { get; set; } /// summary日志等级:Info/Warn/Error/summary public string LogLevel { get; set; } = "Info"; }Core/Entity/ProductionBatch.cs(MySQL 生产工单批次)using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; namespace SMTMachineDemo.Core.Entity; /// summary /// MySQL生产批次工单,多设备共享统计 /// /summary [Index(nameof(BatchNo), IsUnique = true)] [Index(nameof(ProduceStartTime))] public class ProductionBatch { [Key] public long Id { get; set; } /// summary生产批次号/summary [MaxLength(64)] public string BatchNo { get; set; } = string.Empty; /// summary产品型号/summary [MaxLength(128)] public string ProductModel { get; set; } = string.Empty; /// summary计划产量/summary public int PlanCount { get; set; } /// summary实际完成产量/summary public int ActualCount { get; set; } /// summary不良品数量/summary public int DefectCount { get; set; } /// summary生产开始时间/summary public DateTime ProduceStartTime { get; set; } /// summary生产结束时间/summary public DateTime? ProduceEndTime { get; set; } /// summary设备编号/summary [MaxLength(32)] public string DeviceSn { get; set; } = string.Empty; }Core/DbContext/SqliteLogDbContext.csusing Microsoft.EntityFrameworkCore; using SMTMachineDemo.Core.Entity; namespace SMTMachineDemo.Core.DbContext; /// summary /// SQLite本地日志数据库上下文 /// /summary public class SqliteLogDbContext : Microsoft.EntityFrameworkCore.DbContext { public DbSetLogRecord LogRecords { get; set; } = null!; private readonly string _connectionString; public SqliteLogDbContext(DbContextOptionsSqliteLogDbContext options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 日志表按时间自动清理旧数据(保留30天) modelBuilder.EntityLogRecord() .HasData(); } }Core/DbContext/MysqlProductionDbContext.csusing Microsoft.EntityFrameworkCore; using SMTMachineDemo.Core.Entity; namespace SMTMachineDemo.Core.DbContext; /// summary /// MySQL服务端生产业务数据库上下文 /// /summary public class MysqlProductionDbContext : Microsoft.EntityFrameworkCore.DbContext { public DbSetProductionBatch ProductionBatches { get; set; } = null!; public MysqlProductionDbContext(DbContextOptionsMysqlProductionDbContext options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // MySQL字符集、排序规则配置 modelBuilder.EntityProductionBatch() .Property(x = x.BatchNo) .HasColumnType("varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); } }Core/Calibration/MatrixTransform.cs(原有标定算法不变)namespace SMTMachineDemo.Core.Calibration; public static class PixelToMechanical { /// summary /// 九点标定仿射变换,像素坐标转机械轴坐标 /// /summary public static (double x, double y) Transform( double pixelX, double pixelY,

相关新闻

Docker Compose安装指南:二进制与pip方式详解及避坑实践

Docker Compose安装指南:二进制与pip方式详解及避坑实践

1. 为什么你需要关心docker-compose的安装方式? 如果你在Linux上折腾过Docker,大概率会遇到一个场景:你写好了一堆 docker run 命令,或者一个复杂的服务栈需要多个容器协同工作,每次启动都要手动敲一遍,…

2026/8/16 23:13:37 阅读更多 →
KKCE: 基于网站测速的WebRTC信令与ICE穿透延迟诊断-快快测

KKCE: 基于网站测速的WebRTC信令与ICE穿透延迟诊断-快快测

一、引言:为什么 TTFB 只有 30ms,视频首帧却要 5 秒? 在实时音视频应用里,我们习惯用 iperf 或简单的 HTTP 测速看网络质量。即便用 www.kkce.com 的 网站测速​ 对信令服务器做检测,TTFB 30ms、完全加载 80ms&#x…

2026/8/16 23:13:37 阅读更多 →
AgentScope Java Harness:10. Channel Agent 通信的“神经系统“设计

AgentScope Java Harness:10. Channel Agent 通信的“神经系统“设计

目录: 1. 如何优雅地驾驭长期运行的 AI Agent 2. 上下文压缩:让长期 Agent 永不“失忆“ 3. 工作区(Workspace)文件即真理,目录即架构 4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“ 5. 文件系统一套代码&#xff…

2026/8/16 23:13:37 阅读更多 →

最新新闻

nslookup命令使用说明

nslookup命令使用说明

个人建站,域名备案完成后,往往还要做域名解析服务,技术人员怎么能知道自己配置的DNS正确与否呢?NSLOOKUP查询域名信息的一个非常有用的命令,可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用哪…

2026/8/17 0:00:08 阅读更多 →
【原创唯一】基于SpringBoot+Vue的在线书店商城系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)

【原创唯一】基于SpringBoot+Vue的在线书店商城系统 课程设计/大作业/期末作业(源码+MySQL数据库+实验报告+PPT+远程部署)

摘要 电子商务与移动支付的普及,线上购书已成为高校师生及社会公众获取图书的重要方式。传统线下书店在图书检索、库存查询、订单跟踪等方面存在信息分散、效率较低等问题。本文设计并实现了一套基于 B/S 架构的网上书店系统,采用前后端分离模式&#xf…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
错误分享:误将磁盘分区类型选成磁盘名称

错误分享:误将磁盘分区类型选成磁盘名称

1.先删除原有分区2.fdisk重新创建3.发现进程被占用4.使用kill关不掉进程,加 -9 强制关闭5.关闭后重新使用fdisk创建,tips:记得改完后要使用 w 保存

2026/8/16 23:59:08 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →